我使用pocketphinx语音识别程序进行语音到文本的应用。我用德语创建了自己的声学模型,用于大约50个命令。其中一部分是识别人员ID。当我说Fahrerkennung时,它应该等到你说出你的四位数ID。最初我用数字1,2,3做了。在识别出任何四个数字之后..它将给出输出
我将我的声学模型从1,2,3改为EINS,ZWEI,DREI ......(德国数字)。这意味着不是直接1,2,3 ...我们有数字的表示形式,如ONE,TWO,THREE ---我们有德语的EINS,ZWEI,DREI ..
我很困惑如何让这与我在这里用数字做的相似(见下文)!!现在他们在hyp的输出上都是无名数,所以我们将获得“EINS DREIVIERFüNF”
我想只打印输出,如果出现数字“EINS ZWEI DREIVIERFüNFSSSSIEBEN ACHT NEUN NULL”的四个组合中的任何一个,并且应该忽略休息(如果我说除了四个数字之外的其他命令) 。应该使用C编程
完成最初,识别的文本存储在一个可变的'hyp'
中 else if (strcmp(word, "FAHRERKENNUNG") == 0 &&(token==500))
{
//counter_correct = counter_correct + 1;
token = 496;
printf("Fahrerkennung on process \n");
//printf("token number %d\n", token);
printf("Enter the four digit of your drivers id \n");
}
else if(isdigit(hyp[0])
&& isdigit(hyp[2])
&& isdigit(hyp[4])
&& isdigit(hyp[6])
&& (token==496))
{
counter_correct = counter_correct + 1;
sscanf(hyp,"%d %d %d %d",&Nummer1,&Nummer2,&Nummer3,&Nummer4);
if(Nummer1==0)
{
id = Nummer1*1000+Nummer2*100+Nummer3*10+Nummer4;
printf("The drivers id detected %.4d \n",id);
//printf("%s: %s\n", uttid, hyp);
printf("score %d/%s \n",counter_correct,uttid);
token=500;
}
else
{
id = Nummer1*1000+Nummer2*100+Nummer3*10+Nummer4;
counter_correct = counter_correct + 1;
printf("The drivers id detected %d \n",id);
//printf("%s: %s\n", uttid, hyp);
printf("score %d/%s \n",counter_correct,uttid);
token=500;
}
}
我也想过这样做
else if (strcmp(word, "FAHRERKENNUNG") == 0 &&(token==500))
{
//counter_correct = counter_correct + 1;
token = 496;
printf("Fahrerkennung on process \n");
//printf("token number %d\n", token);
printf("Enter the four digit of your drivers id \n");
}
else if((strstr(hyp,"NULL") == 0)
|| (strstr(hyp,"EINS") == 0)
|| (strstr(hyp,"ZWEI") == 0)
|| (strstr(hyp,"DREI") == 0)
|| (strstr(hyp,"VIER") == 0)
|| (strstr(hyp,"FüNF") == 0)
|| (strstr(hyp,"SECHS") == 0)
|| (strstr(hyp,"SIEBEN") == 0)
|| (strstr(hyp,"ACHT") == 0)
|| (strstr(hyp,"NEUN") == 0)
&& (token==496))
{
printf("%s\n",hyp);
token=500;
}
这里的问题是在fahrerkennung之后,如果我说的是另一个命令,它也将它作为输出。我想只继续这个过程,直到我们在输出中得到任意四个数字组合。
非常感谢..如果您需要更多说明..请随意询问。干杯!
答案 0 :(得分:2)
我建议将解析放在一个函数中:
// Store the strings to look for
const char * digits [] = {"NULL", "EINS", "ZWEI", "DREI", "VIER", "FüNF", "SECHS", "ACHT", "NEUN"};
size_t count_numbers_in_str(char * str)
{
size_t digits_found = 0;
for(size_t i=0; i<10; i++) // i<10: there are 10 elements in digits[]
{
char * tmp = str;
while(1)
{
tmp = strstr(tmp, digits[i]);
if(tmp) // Found a match
{
digits_found++;
// tmp points to the beginning of the found string
// move it 1 step forward to look for a new occurence
tmp++;
}
else // No matches or end of the string
{
break; // Exit while loop
}
}
}
// End of for loop: we looked for all digits in our list
return digits_found;
}
每次想要查找数字时都要调用此函数。仅当函数返回4
时才继续您的过程,即在给定字符串中找到了四位数的组合。
[编辑] 请注意,这会计算给定str
中数字字符串表示的所有出现次数。例如,如果&#34; SECHS&#34;出现两次,digits_found
将增加两次。
此过程针对digits
中的所有字符串完成。
因此,它可以在str
中识别这些子串的任意随机组合。