Menu

FSG for OOV rejection (Pocketsphinx)

Help
Pankaj
2011-07-22
2012-09-22
  • Pankaj

    Pankaj - 2011-07-22

    Hi,

    We have the following type of FSG for a command and control application
    (It is a much bigger FSG I'm simplifying it for illustrative purposes).


    JSGF V1.0;

    grammar test;
    public = <profile> | <radio> | <record> | <log> ;
    <profile> = <profile_general> | <profile_silent> | <profile_meeting>;
    <profile_general> = GENERAL;
    <profile_silent> = SILENT;
    <profile_meeting> = MEETING;
    <radio> = <radio_on> | <radio_off> | <next_station> | <previous_station>;
    <radio_on> = RADIO ON;
    <radio_off> = RADIO OFF;
    <next_station> = NEXT STATION;
    <previous_station> = PREVIOUS STATION;
    <record> = RECORD;
    <log> = <missed_calls> | <received_calls>;
    <missed_calls> = MISSED CALLS;
    <received_calls> = RECEIVED CALLS;


    To add OOV rejection into this, we added a phone loop. Basically the phone
    loop created by us can handle any sequence of phone in a arbitraty
    way. We called it garbage loop.

    <garbage_loop> = (G1 | G2 | G3 | G4 | G5 | G6 | G7 | G8 | G9 | G10 |
    G11 | G12 | G13 | G14 | G15 | G16 | G17 | G18 | G19 |
    G20 | G21 | G22 | G23 | G24 | G25 | G26 | G27 | G28 |
    G29 | G30 | G31 | G32 | G33 | G34 | G35 | G36 | G37 |
    G38 | G39)+ ;

    Where G1, G2, G3..G39 are basically definde as CI phones in the dictionary
    (G1 = AA, G2 = AE and so on).

    And we modified out FSG as follows:


    JSGF V1.0;

    grammar test;
    public = /w1/<profile> | /w1/<radio> | /w1/<record> | /w1/<log> |
    /w2/<garbage_loop>;
    <profile> = <profile_general> | <profile_silent> | <profile_meeting>;
    <profile_general> = GENERAL;
    <profile_silent> = SILENT;
    <profile_meeting> = MEETING;
    <radio> = <radio_on> | <radio_off> | <next_station> | <previous_station>;
    <radio_on> = RADIO ON;
    <radio_off> = RADIO OFF;
    <next_station> = NEXT STATION;
    <previous_station> = PREVIOUS STATION;
    <record> = RECORD;
    <log> = <missed_calls> | <received_calls>;
    <missed_calls> = MISSED CALLS;
    <received_calls> = RECEIVED CALLS;

    <garbage_loop> = (G1 | G2 | G3 | G4 | G5 | G6 | G7 | G8 | G9 | G10 |
    G11 | G12 | G13 | G14 | G15 | G16 | G17 | G18 | G19 |
    G20 | G21 | G22 | G23 | G24 | G25 | G26 | G27 | G28 |
    G29 | G30 | G31 | G32 | G33 | G34 | G35 | G36 | G37 |
    G38 | G39)+ ;


    This seems to give good OOV performance (w1 = 1 and w2 = 1E-20) but we
    are seeing that the decoding is becoming very-very slow (especially if
    an OOV word is detected).

    We are wondering is something similar is explained
    in (http://cmusphinx.sourceforge.net/wiki/sphinx4:rejectionhandling)
    and can something be done to speed it up.

     
  • Nickolay V. Shmyrev

    Set beams, for example tune maxhmmpf and maxwpf

     
  • Joseph S. Wisniewski

    Reduce your phone set. That does wonders for speeding up junk models without
    insane beam settings.

     

Log in to post a comment.