使用C程序仅从已识别的文本中搜索四个单词

时间:2014-08-01 10:37:37

标签: c string if-statement logical-operators

我使用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之后,如果我说的是另一个命令,它也将它作为输出。我想只继续这个过程,直到我们在输出中得到任意四个数字组合。

非常感谢..如果您需要更多说明..请随意询问。干杯!

1 个答案:

答案 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中识别这些子串的任意随机组合。