16 #include "SpeechRecognizerModule.h"
20 std::wstring s2ws(
const std::string& s)
23 int slength = (int)s.length() + 1;
24 len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
25 wchar_t* buf =
new wchar_t[len];
26 MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
31 std::string ws2s(LPCWSTR s)
33 char *pmbbuf = (
char *)malloc( 100 );
34 wcstombs( pmbbuf, s, 100 );
37 std::vector<std::string> &split(
const std::string &s,
char delim, std::vector<std::string> &elems) {
38 std::stringstream ss(s);
40 while (std::getline(ss, item, delim)) {
41 elems.push_back(item);
45 std::vector<std::string> split(
const std::string &s,
char delim) {
46 std::vector<std::string> elems;
47 split(s, delim, elems);
53 bool SpeechRecognizerModule::configure(ResourceFinder &rf )
55 setName( rf.check(
"name",Value(
"speechRecognizer")).asString().c_str() );
56 m_timeout = rf.check(
"timeout",Value(10000)).asInt32();
57 USE_LEGACY = !rf.check(
"noLegacy");
58 m_forwardSound = rf.check(
"forwardSound");
59 m_tmpFileFolder = rf.getHomeContextPath();
60 interruptRecognition =
false;
63 string grammarFile = rf.check(
"grammarFile",Value(
"defaultGrammar.grxml")).asString();
64 grammarFile = rf.findFile(grammarFile);
66 std::wstring tmp = s2ws(grammarFile);
67 LPCWSTR cwgrammarfile = tmp.c_str();
69 m_useTalkBack = rf.check(
"talkback");
72 bool everythingIsFine =
true;
74 everythingIsFine = SUCCEEDED( m_cpRecoEngine.CoCreateInstance(CLSID_SpInprocRecognizer));
75 everythingIsFine &= SUCCEEDED( SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &m_cpAudio));
76 everythingIsFine &= SUCCEEDED( m_cpRecoEngine->CreateRecoContext( &m_cpRecoCtxt ));
80 const ULONGLONG ullInterest = SPFEI(SPEI_RECOGNITION);
81 everythingIsFine &= SUCCEEDED(m_cpRecoCtxt->SetInterest(ullInterest, ullInterest));
84 everythingIsFine &= SUCCEEDED( m_cpRecoEngine->SetInput(m_cpAudio, TRUE));
85 everythingIsFine &= SUCCEEDED( m_cpRecoEngine->SetRecoState( SPRST_ACTIVE ));
88 everythingIsFine &= SUCCEEDED( m_cpRecoCtxt->CreateGrammar( 1, &m_cpGrammarFromFile ));
89 everythingIsFine &= SUCCEEDED( m_cpGrammarFromFile->SetGrammarState(SPGS_DISABLED));
90 everythingIsFine &= SUCCEEDED( m_cpGrammarFromFile->LoadCmdFromFile(cwgrammarfile, SPLO_DYNAMIC));
94 everythingIsFine &= SUCCEEDED( m_cpRecoCtxt->CreateGrammar( 2, &m_cpGrammarRuntime ));
95 everythingIsFine &= SUCCEEDED( m_cpGrammarRuntime->SetGrammarState(SPGS_DISABLED));
98 everythingIsFine &= SUCCEEDED(m_cpRecoCtxt->CreateGrammar( GID_DICTATION, &m_cpGrammarDictation ));
99 everythingIsFine &= SUCCEEDED(m_cpGrammarDictation->LoadDictation(NULL, SPLO_STATIC));
100 everythingIsFine &= SUCCEEDED(m_cpGrammarDictation->SetDictationState(SPRS_INACTIVE));
103 everythingIsFine &= SUCCEEDED(m_cAudioFmt.AssignFormat(SPSF_22kHz16BitMono));
104 hr = m_cpRecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, &m_cAudioFmt.FormatId(), m_cAudioFmt.WaveFormatExPtr());
112 if( everythingIsFine )
116 pName +=
"/recog/continuous:o";
117 m_portContinuousRecognition.open( pName );
121 pName +=
"/recog/continuousGrammar:o";
122 m_portContinuousRecognitionGrammar.open( pName );
126 pName +=
"/recog/sound:o";
127 m_portSound.open( pName );
132 pName +=
"/tts/iSpeak:o";
133 m_port2iSpeak.open( pName );
137 pName +=
"/tts/iSpeak/rpc";
138 m_port2iSpeakRpc.open( pName );
139 if (Network::connect(m_port2iSpeak.getName(),
"/iSpeak")&&Network::connect(m_port2iSpeakRpc.getName(),
"/iSpeak/rpc"))
140 yInfo() <<
"Connection to iSpeak succesfull" ;
142 yWarning() <<
"Unable to connect to iSpeak. Connect manually." ;
147 m_portRPC.open( pName );
152 everythingIsFine &= SUCCEEDED(m_cpGrammarFromFile->SetRuleState(NULL, NULL, SPRS_ACTIVE));
153 everythingIsFine &= SUCCEEDED( m_cpGrammarFromFile->SetGrammarState(SPGS_ENABLED));
156 return (everythingIsFine);
158 yarp::sig::Sound SpeechRecognizerModule::toSound(CComPtr<ISpRecoResult> cpRecoResult)
161 CComPtr<ISpStreamFormat> cpStreamFormat = NULL;
163 bool successGetPhrase = SUCCEEDED(cpRecoResult->GetPhrase(&pPhrase));
164 hr = cpRecoResult->GetAudio(0, pPhrase->Rule.ulCountOfElements, &cpStreamFormat);
166 CComPtr<ISpStream> cpStream;
169 string sPath = m_tmpFileFolder +
"//tmp.wav";
173 hr = SPBindToFile(s2ws(sPath).c_str(), SPFM_CREATE_ALWAYS, &cpStream, &m_cAudioFmt.FormatId(), m_cAudioFmt.WaveFormatExPtr(), SPFEI_ALL_EVENTS);
181 hr = cpStreamFormat->Stat(&stats, NULL);
189 hr = cpStreamFormat->Read(bBuffer, 1000, &cbRead);
191 if (SUCCEEDED(hr) && cbRead > 0)
194 hr = cpStream->Write(bBuffer, cbRead, &cbWritten);
208 yarp::sig::file::read(s, sPath.c_str());
215 bool SpeechRecognizerModule::updateModule()
222 while (event.GetFrom(m_cpRecoCtxt) == S_OK)
224 switch (event.eEventId)
226 case SPEI_SOUND_START:
229 yInfo() <<
"Sound in...";
241 yWarning() <<
"Chunk of sound detected: Recognition is null";
247 case SPEI_RECOGNITION:
251 static const WCHAR wszUnrecognized[] = L
"<Unrecognized>";
253 CSpDynamicString dstrText;
254 if (SUCCEEDED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE,
257 SPPHRASE* pPhrase = NULL;
258 bool successGetPhrase = SUCCEEDED(event.RecoResult()->GetPhrase(&pPhrase));
259 int confidence=pPhrase->Rule.Confidence;
261 string fullSentence = ws2s(dstrText);
262 yInfo() <<
"Recognized "<<fullSentence<<
" with confidence "<<confidence ;
267 bOut.addString(fullSentence);
268 bOut.addInt32(confidence);
269 m_portContinuousRecognition.write(bOut);
272 if (successGetPhrase)
277 yarp::sig::Sound& rawSnd = m_portSound.prepare();
278 rawSnd = toSound(event.RecoResult());
283 int wordCount = pPhrase->Rule.ulCountOfElements;
284 string rawPhrase =
"";
285 for(
int i=0; i< wordCount; i++){
286 rawPhrase += ws2s(pPhrase->pElements[i].pszDisplayText) +
" ";
287 yDebug() <<
"word : " << ws2s(pPhrase->pElements[i].pszDisplayText) ;
289 yInfo() <<
"Raw sentence: "<<rawPhrase ;
290 if (&pPhrase->Rule == NULL)
292 yError() <<
"Cannot parse the sentence!";
297 bOutGrammar.addString(rawPhrase);
298 bOutGrammar.addList()=toBottle(pPhrase,&pPhrase->Rule);
299 yInfo() <<
"Sending semantic bottle : " << bOutGrammar.toString();
300 m_portContinuousRecognitionGrammar.write(bOutGrammar);
301 ::CoTaskMemFree(pPhrase);
315 Bottle SpeechRecognizerModule::toBottle(SPPHRASE* pPhrase,
const SPPHRASERULE* pRule)
317 Bottle bCurrentLevelGlobal;
319 const SPPHRASERULE* siblingRule = pRule;
320 while (siblingRule != NULL)
322 Bottle bCurrentSubLevel;
323 bCurrentSubLevel.addString(ws2s(siblingRule->pszName));
326 if(siblingRule->pFirstChild != NULL )
328 bCurrentSubLevel.addList()=toBottle(pPhrase, siblingRule->pFirstChild);
332 string nodeString =
"";
333 for(
unsigned int i=0; i<siblingRule->ulCountOfElements; i++)
335 nodeString += ws2s(pPhrase->pElements[siblingRule->ulFirstElement + i].pszDisplayText);
336 if (i<siblingRule->ulCountOfElements-1)
339 bCurrentSubLevel.addString(nodeString);
341 siblingRule = siblingRule->pNextSibling;
342 if (pRule->pNextSibling !=NULL)
343 bCurrentLevelGlobal.addList() = bCurrentSubLevel;
345 bCurrentLevelGlobal = bCurrentSubLevel;
348 return bCurrentLevelGlobal;
352 bool SpeechRecognizerModule::respond(
const Bottle& cmd, Bottle& reply)
354 reply.addString(
"ACK");
355 string firstVocab = cmd.get(0).asString();
357 if (firstVocab ==
"tts")
359 string sentence = cmd.get(1).asString();
361 reply.addString(
"OK");
363 else if (firstVocab ==
"RGM" || firstVocab ==
"rgm" )
365 string secondVocab = cmd.get(1).asString();
366 if (secondVocab==
"vocabulory")
367 handleRGMCmd(cmd.tail().tail(), reply);
369 else if (firstVocab ==
"recog")
371 handleRecognitionCmd(cmd.tail(), reply);
373 else if (firstVocab ==
"asyncrecog")
375 handleAsyncRecognitionCmd(cmd.tail(), reply);
377 else if (firstVocab ==
"interrupt")
379 handleInterrupt(cmd.tail(), reply);
382 reply.addString(
"UNKNOWN");
388 bool SpeechRecognizerModule::handleInterrupt(
const Bottle& cmd, Bottle& reply)
390 yInfo() <<
"Grammar interrupted";
391 interruptRecognition =
true;
392 yarp::os::Time::delay(0.5);
393 interruptRecognition =
true;
394 reply.addString(
"OK");
399 bool SpeechRecognizerModule::handleRGMCmd(
const Bottle& cmd, Bottle& reply)
401 string firstVocab = cmd.get(0).asString();
402 if (firstVocab ==
"add")
404 string vocabulory = cmd.get(1).asString();
405 if (vocabulory[0] !=
'#')
408 reply.addString(
"ERROR");
411 string word = cmd.get(2).asString();
412 m_vocabulories[vocabulory].push_back(word);
413 refreshFromVocabulories(m_cpGrammarFromFile);
414 reply.addString(
"OK");
418 if (firstVocab ==
"addAuto")
420 string vocabuloryType = cmd.get(1).asString();
421 yInfo() <<
"Trying to enrich the "<<vocabuloryType<<
" vocabulary.";
423 say(
"Let's improve my dictionary.");
426 int TRIALS_BEFORE_SPELLING = 2;
430 while(!isFine && trial<TRIALS_BEFORE_SPELLING)
432 say(
"Please, say the word.");
435 newWord=getFromDictaction(m_timeout);
436 say(
"I understood "+ newWord +
". Did you say that?");
438 Bottle cmdTmp, replyTmp;
439 cmdTmp.addString(
"grammarSimple");
440 cmdTmp.addString(
"Yes I did.|No I did not.|Skip");
441 bool gotAConfirmation =
false;
442 while(!gotAConfirmation)
445 handleRecognitionCmd(cmdTmp,replyTmp);
448 if (replyTmp.get(0).asString() ==
"Skip")
450 say(
"Fine, we give up.");
451 reply.addString(
"ERROR");
456 (replyTmp.get(0).asString() ==
"Yes" ||
457 replyTmp.get(0).asString() ==
"No");
460 if ( replyTmp.get(0).asString() ==
"Yes")
467 int TRIALS_BEFORE_GIVING_UP = 2;
469 while(!isFine && trial<TRIALS_BEFORE_GIVING_UP)
471 say(
"Sorry, I cannot get it. Please, spell this word for me?");
472 string spelledWord =
"";
473 while(spelledWord ==
"")
474 spelledWord=getFromDictaction(m_timeout,SPTOPIC_SPELLING);
475 newWord = spelledWord;
477 say(
"I understood "+ newWord +
". Is that right?");
479 Bottle cmdTmp, replyTmp;
480 cmdTmp.addString(
"grammarSimple");
481 cmdTmp.addString(
"Yes I did.|No I did not.|Skip");
482 bool gotAConfirmation =
false;
483 while(!gotAConfirmation)
486 handleRecognitionCmd(cmdTmp,replyTmp);
489 if (replyTmp.get(0).asString() ==
"Skip")
491 say(
"Fine, we give up.");
492 reply.addString(
"ERROR");
498 (replyTmp.get(0).asString() ==
"Yes" ||
499 replyTmp.get(0).asString() ==
"No");
502 if ( replyTmp.get(0).asString() ==
"Yes")
510 say(
"Sorry, I think we should give up with this word.");
511 reply.addString(
"ERROR");
515 say(
"Perfect! I know the word " + newWord);
516 m_vocabulories[vocabuloryType].push_back(newWord);
517 refreshFromVocabulories(m_cpGrammarFromFile);
518 reply.addString(newWord);
523 reply.addString(
"UNKNOWN");
528 bool SpeechRecognizerModule::handleAsyncRecognitionCmd(
const Bottle& cmd, Bottle& reply)
531 string firstVocab = cmd.get(0).asString();
532 if (firstVocab ==
"getGrammar")
534 reply.addString(
"NOT_IMPLEMENTED");
538 if (firstVocab ==
"clear")
540 bool everythingIsFine=
true;
541 SPSTATEHANDLE rootRule;
542 everythingIsFine &= SUCCEEDED(m_cpGrammarFromFile->SetGrammarState(SPGS_DISABLED));
543 everythingIsFine &= SUCCEEDED(m_cpGrammarFromFile->GetRule(L
"rootRule", NULL, SPRAF_TopLevel | SPRAF_Active, TRUE, &rootRule));
544 everythingIsFine &= SUCCEEDED(m_cpGrammarFromFile->ClearRule(rootRule));
545 everythingIsFine &= SUCCEEDED(hr = m_cpGrammarFromFile->Commit(NULL));
546 everythingIsFine &= SUCCEEDED(m_cpGrammarFromFile->SetGrammarState(SPGS_ENABLED));
547 everythingIsFine &= SUCCEEDED(m_cpGrammarFromFile->SetRuleState(NULL, NULL, SPRS_ACTIVE));
548 everythingIsFine &= SUCCEEDED(m_cpRecoCtxt->Resume(0));
549 reply.addString(
"Cleared");
553 if (firstVocab ==
"addGrammar")
555 string grammar = cmd.get(1).asString();
556 bool everythingIsFine = setGrammarCustom(m_cpGrammarFromFile,grammar,
true);
557 reply.addString(
"Added");
561 if (firstVocab ==
"loadXML")
563 string xml = cmd.get(1).asString();
564 ofstream fileTmp(
"grammarTmp.grxml");
568 std::wstring tmp = s2ws(
"grammarTmp.grxml");
569 LPCWSTR cwgrammarfile = tmp.c_str();
571 bool everythingIsFine =
true;
573 everythingIsFine &= SUCCEEDED( m_cpGrammarFromFile->SetGrammarState(SPGS_DISABLED));
574 everythingIsFine &= SUCCEEDED( m_cpGrammarFromFile->LoadCmdFromFile(cwgrammarfile, SPLO_DYNAMIC));
576 everythingIsFine &= SUCCEEDED( m_cpGrammarFromFile->SetGrammarState(SPGS_ENABLED));
577 everythingIsFine &= SUCCEEDED(m_cpGrammarFromFile->SetRuleState(NULL, NULL, SPRS_ACTIVE));
578 everythingIsFine &= SUCCEEDED(m_cpRecoCtxt->Resume(0));
580 refreshFromVocabulories(m_cpGrammarFromFile);
581 reply.addString(
"Loaded");
589 bool SpeechRecognizerModule::refreshFromVocabulories(CComPtr<ISpRecoGrammar> grammarToModify)
592 bool everythingIsFine =
true;
594 everythingIsFine &= SUCCEEDED(grammarToModify->SetGrammarState(SPGS_DISABLED));
597 for(map<
string, list<string> >::iterator vIt = m_vocabulories.begin(); vIt != m_vocabulories.end(); vIt++)
600 string removedSharp =vIt->first;
601 removedSharp.erase(0,1);
602 std::wstring tmp = s2ws(removedSharp);
603 LPCWSTR cwRuleName = tmp.c_str();
605 SPSTATEHANDLE hinit,hstate;
608 everythingIsFine &= SUCCEEDED(hr = grammarToModify->GetRule(cwRuleName, NULL, SPRAF_Dynamic,
false, &hinit));
609 everythingIsFine &= SUCCEEDED(hr = grammarToModify->ClearRule(hinit));
610 for(list<string>::iterator wordIt = vIt->second.begin() ; wordIt != vIt->second.end(); wordIt++)
612 std::wstring wordTmp = s2ws(*wordIt);
613 LPCWSTR cwWord = wordTmp.c_str();
614 everythingIsFine &= SUCCEEDED( grammarToModify->AddWordTransition(hinit, NULL, cwWord, NULL, SPWT_LEXICAL, 1, NULL) );
618 everythingIsFine &= SUCCEEDED(grammarToModify->Commit(NULL));
619 everythingIsFine &= SUCCEEDED(grammarToModify->SetGrammarState(SPGS_ENABLED));
620 everythingIsFine &= SUCCEEDED(grammarToModify->SetRuleState(NULL, NULL, SPRS_ACTIVE));
621 yInfo() <<
"Grammar is paused, DO NOT SPEAK! (if next message is coming after too long, check your microphone level and lower it!" ;
622 everythingIsFine &= SUCCEEDED(m_cpRecoCtxt->Resume(NULL));
623 yInfo() <<
"Grammar is resumed : everything is fine = " << everythingIsFine;
625 return everythingIsFine;
629 string SpeechRecognizerModule::getFromDictaction(
int timeout, LPCWSTR options )
631 bool everythingIsFine = TRUE;
632 everythingIsFine &= SUCCEEDED(m_cpGrammarDictation->UnloadDictation());
633 everythingIsFine &= SUCCEEDED(m_cpGrammarDictation->LoadDictation(options, SPLO_STATIC));
634 everythingIsFine &= SUCCEEDED(m_cpGrammarDictation->SetDictationState( SPRS_ACTIVE ));
635 yInfo() <<
"Dictation is on..." ;
639 botTmp = waitNextRecognition(m_timeout);
643 list< pair<string, double> > results = waitNextRecognitionLEGACY(m_timeout);
644 for(list< pair<string, double> >::iterator it = results.begin(); it != results.end(); it++)
646 botTmp.addString(it->first);
650 yInfo() <<
"Dictation is off...";
651 yInfo() <<
"Got : "<<botTmp.toString();
653 everythingIsFine &= SUCCEEDED(m_cpGrammarDictation->SetDictationState( SPRS_INACTIVE ));
654 everythingIsFine &=SUCCEEDED(m_cpGrammarFromFile->SetGrammarState(SPGS_ENABLED));
655 return botTmp.toString();
659 bool SpeechRecognizerModule::handleRecognitionCmd(
const Bottle& cmd, Bottle& reply)
661 string firstVocab = cmd.get(0).asString();
663 if (firstVocab ==
"timeout")
665 m_timeout = cmd.get(1).asInt32();
670 else if (firstVocab ==
"dictation")
672 bool everythingIsFine = TRUE;
673 everythingIsFine &= SUCCEEDED(m_cpGrammarDictation->SetDictationState( SPRS_ACTIVE ));
674 yInfo() <<
"Dictation is on..." ;
678 reply.addList() = waitNextRecognition(m_timeout);
682 list< pair<string, double> > results = waitNextRecognitionLEGACY(m_timeout);
683 if (results.size()>0)
684 for(list< pair<string, double> >::iterator it = results.begin(); it != results.end(); it++)
686 reply.addString(it->first);
687 reply.addFloat64(it->second);
690 reply.addString(
"-1");
692 yInfo() <<
"Dictation is off...";
695 everythingIsFine &= SUCCEEDED(m_cpGrammarDictation->SetDictationState( SPRS_INACTIVE ));
696 everythingIsFine &=SUCCEEDED(m_cpGrammarFromFile->SetGrammarState(SPGS_ENABLED));
701 else if (firstVocab ==
"grammarXML")
703 string xml = cmd.get(1).asString();
704 ofstream fileTmp(
"grammarTmp.grxml");
708 std::wstring tmp = s2ws(
"grammarTmp.grxml");
709 LPCWSTR cwgrammarfile = tmp.c_str();
711 bool everythingIsFine =
true;
712 everythingIsFine &= SUCCEEDED( m_cpGrammarRuntime->SetGrammarState(SPGS_DISABLED));
713 everythingIsFine &= SUCCEEDED( m_cpGrammarRuntime->LoadCmdFromFile(cwgrammarfile, SPLO_DYNAMIC));
714 everythingIsFine &= SUCCEEDED(m_cpGrammarRuntime->SetRuleState(NULL, NULL, SPRS_ACTIVE));
715 everythingIsFine &= SUCCEEDED(m_cpRecoCtxt->Resume(0));
717 refreshFromVocabulories(m_cpGrammarRuntime);
722 else if (firstVocab ==
"choices")
725 for (
int wI = 1; wI < cmd.size(); wI++)
727 choices+=cmd.get(wI).asString();
731 setGrammarCustom(m_cpGrammarRuntime,choices,
false);
733 else if (firstVocab ==
"grammarSimple")
735 string RADStyle = cmd.get(1).asString();
736 yInfo() <<
"Setting runtime grammar to : "<<RADStyle ;
737 setGrammarCustom(m_cpGrammarRuntime,RADStyle,
false);
741 reply.addString(
"UNKNOWN");
746 SUCCEEDED(m_cpGrammarFromFile->SetGrammarState(SPGS_DISABLED));
747 SUCCEEDED(m_cpGrammarRuntime->SetGrammarState(SPGS_ENABLED));
752 reply.addList() = waitNextRecognition(m_timeout);
756 list< pair<string, double> > results = waitNextRecognitionLEGACY(m_timeout);
757 if (results.size()>0)
758 for(list< pair<string, double> >::iterator it = results.begin(); it != results.end(); it++)
760 reply.addString(it->first);
761 reply.addFloat64(it->second);
764 reply.addString(
"-1");
767 SUCCEEDED(m_cpGrammarRuntime->SetGrammarState(SPGS_DISABLED));
768 SUCCEEDED(m_cpGrammarFromFile->SetGrammarState(SPGS_ENABLED));
772 Bottle SpeechRecognizerModule::waitNextRecognition(
int timeout)
774 yInfo() <<
"Recognition: blocking mode on" ;
777 bool gotSomething =
false;
778 double endTime = Time::now() + timeout/1000.0;
779 interruptRecognition =
false;
782 yInfo() <<
"=========== GO Waiting for recog! ===========" ;
784 while(Time::now()<endTime && !gotSomething && !interruptRecognition)
787 const float ConfidenceThreshold = 0.3f;
792 m_cpRecoCtxt->GetEvents(1, &curEvent, &fetched);
796 yInfo() <<
" received something in waitNextRecognition" ;
798 ISpRecoResult* result =
reinterpret_cast<ISpRecoResult*
>(curEvent.lParam);
799 CSpDynamicString dstrText;
800 result->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &dstrText, NULL);
801 string fullSentence = ws2s(dstrText);
802 yInfo() <<fullSentence ;
805 bOutGrammar.addString(fullSentence);
807 SPPHRASE* pPhrase = NULL;
808 result->GetPhrase(&pPhrase);
809 bOutGrammar.addList() = toBottle(pPhrase,&pPhrase->Rule);
810 yInfo() <<
"Sending semantic bottle : "<<bOutGrammar.toString() ;
811 m_cpRecoCtxt->GetEvents(1, &curEvent, &fetched);
815 yarp::sig::Sound& rawSnd = m_portSound.prepare();
816 rawSnd = toSound(result);
823 if(interruptRecognition) {
824 yDebug() <<
"interrupted speech recognizer!";
826 yInfo() <<
"Recognition: blocking mode off";
831 list< pair<string, double> > SpeechRecognizerModule::waitNextRecognitionLEGACY(
int timeout)
833 yInfo() <<
"Recognition LEGACY: blocking mode on" ;
834 list< pair<string, double> > recognitionResults;
836 bool gotSomething =
false;
837 double endTime = Time::now() + timeout/1000.0;
838 while(Time::now()<endTime && !gotSomething && !interruptRecognition)
841 const float ConfidenceThreshold = 0.3f;
846 m_cpRecoCtxt->GetEvents(1, &curEvent, &fetched);
851 ISpRecoResult* result =
reinterpret_cast<ISpRecoResult*
>(curEvent.lParam);
854 CSpDynamicString dstrText;
855 result->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &dstrText, NULL);
856 string fullSentence = ws2s(dstrText);
857 yInfo() <<fullSentence ;
861 vector<string> words = split(fullSentence,
' ');
862 for(
unsigned int w=0;w<words.size();w++)
865 recognitionResults.push_back(make_pair(words[w], -1.0));
867 m_cpRecoCtxt->GetEvents(1, &curEvent, &fetched);
870 interruptRecognition =
false;
871 yInfo() <<
"Recognition: blocking mode off" ;
872 return recognitionResults;
876 void SpeechRecognizerModule::say(
string s,
bool wait)
878 yInfo() <<
"TTS: "<<s ;
881 m_port2iSpeak.write(b);
884 yarp::os::Bottle cmd,reply;
885 cmd.addVocab32(VOCAB(
's',
't',
'a',
't'));
886 std::string status =
"speaking";
887 bool speechStarted =
false;
888 while(wait&&(!speechStarted ||status==
"speaking"))
890 m_port2iSpeakRpc.write(cmd,reply);
891 status = reply.get(0).asString();
892 if (!speechStarted && status !=
"quiet")
894 speechStarted =
true;
896 yarp::os::Time::delay(0.2);
902 bool SpeechRecognizerModule::setGrammarCustom(CComPtr<ISpRecoGrammar> grammarToModify,
string grammar,
bool append)
905 SPSTATEHANDLE runtimeRootRule;
906 bool everythingIsFine =
true;
907 everythingIsFine &= SUCCEEDED(grammarToModify->SetGrammarState(SPGS_DISABLED));
908 everythingIsFine &= SUCCEEDED(grammarToModify->GetRule(L
"rootRule", NULL, SPRAF_TopLevel | SPRAF_Active, TRUE, &runtimeRootRule));
910 everythingIsFine &= SUCCEEDED(grammarToModify->ClearRule(runtimeRootRule));
913 map<string, SPSTATEHANDLE> vocabRules;
914 for(map<
string, list<string> >::iterator vIt = m_vocabulories.begin(); vIt != m_vocabulories.end(); vIt++)
917 std::wstring tmp = s2ws(vIt->first);
918 LPCWSTR cwRuleName = tmp.c_str();
921 everythingIsFine &= SUCCEEDED(grammarToModify->GetRule(cwRuleName, NULL, SPRAF_Dynamic, TRUE, &vocabRules[vIt->first]));
922 everythingIsFine &= SUCCEEDED(grammarToModify->ClearRule(vocabRules[vIt->first]));
923 for(list<string>::iterator wordIt = vIt->second.begin() ; wordIt != vIt->second.end(); wordIt++)
925 std::wstring wordTmp = s2ws(*wordIt);
926 LPCWSTR cwWord = wordTmp.c_str();
927 everythingIsFine &= SUCCEEDED( grammarToModify->AddWordTransition(vocabRules[vIt->first], NULL, cwWord, NULL, SPWT_LEXICAL, 1, NULL) );
933 vector<string> sentences = split(grammar,
'|');
934 for(vector<string>::iterator it = sentences.begin() ; it != sentences.end() ; it++)
937 vector<string> words = split(*it,
' ');
938 SPSTATEHANDLE beforeWordHandle = runtimeRootRule;
939 SPSTATEHANDLE afterWordHandle;
940 for(vector<string>::iterator itWord = words.begin() ; itWord != words.end() ; itWord++)
945 everythingIsFine &= SUCCEEDED(grammarToModify->CreateNewState(beforeWordHandle, &afterWordHandle));
948 if ( (*itWord)[0] ==
'#' && m_vocabulories.find(*itWord) != m_vocabulories.end())
950 everythingIsFine &= SUCCEEDED(grammarToModify->AddRuleTransition(beforeWordHandle, afterWordHandle, vocabRules[*itWord], 1, NULL));
954 std::wstring wordTmp = s2ws(*itWord);
955 LPCWSTR cwWord = wordTmp.c_str();
956 everythingIsFine &= SUCCEEDED( grammarToModify->AddWordTransition(beforeWordHandle, afterWordHandle, cwWord, NULL, SPWT_LEXICAL, 1, NULL) );
958 beforeWordHandle = afterWordHandle;
960 everythingIsFine &= SUCCEEDED( grammarToModify->AddWordTransition(beforeWordHandle, NULL, NULL, NULL, SPWT_LEXICAL, 1, NULL) );
962 everythingIsFine &= SUCCEEDED(grammarToModify->Commit(NULL));
963 everythingIsFine &= SUCCEEDED(grammarToModify->SetGrammarState(SPGS_ENABLED));
964 everythingIsFine &= SUCCEEDED(grammarToModify->SetRuleState(NULL, NULL, SPRS_ACTIVE));
965 everythingIsFine &= SUCCEEDED(m_cpRecoCtxt->Resume(0));
967 return everythingIsFine;
974 bool SpeechRecognizerModule::loadGrammarFromRf(ResourceFinder &RF)
976 Bottle &bAgent = RF.findGroup(
"agent");
977 Bottle &bAction = RF.findGroup(
"action");
978 Bottle &bObject = RF.findGroup(
"object");
980 Bottle bMessenger, bReply;
982 yInfo() <<
"Agents are: " ;
983 for (
int iBottle = 1 ; iBottle < bAgent.size() ; iBottle++)
985 yInfo() <<
"\t" << bAgent.get(iBottle).toString();
987 bMessenger.addString(
"add");
988 bMessenger.addString(
"#agent");
989 bMessenger.addString(bAgent.get(iBottle).toString());
991 handleRGMCmd(bMessenger, bReply);
993 yInfo() <<
"\t\t" << bReply.toString() ;
996 yInfo() <<
"\n" <<
"Actions are: " ;
997 for (
int iBottle = 1 ; iBottle < bAction.size() ; iBottle++)
999 yInfo() <<
"\t" << bAction.get(iBottle).toString();
1001 bMessenger.addString(
"add");
1002 bMessenger.addString(
"#action");
1003 bMessenger.addString(bAction.get(iBottle).toString());
1005 handleRGMCmd(bMessenger, bReply);
1007 yInfo() <<
"\t\t" << bReply.toString() ;
1010 yInfo() <<
"\n" <<
"Objects are: " ;
1011 for (
int iBottle = 1 ; iBottle < bObject.size() ; iBottle++)
1013 yInfo() <<
"\t" << bObject.get(iBottle).toString();
1015 bMessenger.addString(
"add");
1016 bMessenger.addString(
"#object");
1017 bMessenger.addString(bObject.get(iBottle).toString());
1019 handleRGMCmd(bMessenger, bReply);
1021 yInfo() <<
"\t\t" << bReply.toString() ;
1024 Bottle bGrammarMain, bGrammarDef;
1027 bGrammarMain.addString(
"addGrammar");
1028 bGrammarMain.addString(
"#agent #action #object");
1030 yInfo() <<
"\n" << bGrammarMain.toString() ;
1034 yInfo() <<
"\n" << bReply.toString() ;