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.
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).
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; = <profile> | <radio> | <record> | <log> ;
public
<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; = /w1/<profile> | /w1/<radio> | /w1/<record> | /w1/<log> |
public
/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.
Set beams, for example tune maxhmmpf and maxwpf
Reduce your phone set. That does wonders for speeding up junk models without
insane beam settings.