3

J'essaie de spécifier des mots-clés dans le discours-texte Unity SDK de Watson, mais je ne sais pas comment faire cela.Pour le SDK Speech-To-Text Unity de Watson, comment pouvez-vous spécifier des mots-clés?

La page des détails ne montre pas un exemple (voir ici: https://www.ibm.com/watson/developercloud/doc/speech-to-text/output.shtml),

et d'autres messages du forum sont écrits pour les applications Java (voir ici: How to specify phonetic keywords for IBM Watson speech2text service?).

J'ai essayé de coder en dur ces valeurs dans la classe RecognizeRequest créé dans la « Reconnaître » fonctionnent comme si, mais sans succès:

** EDIT - cette fonction ne sera jamais appelé - **

public bool Recognize(AudioClip clip, OnRecognize callback) 
    { 
     if (clip == null) 
      throw new ArgumentNullException("clip"); 
     if (callback == null) 
      throw new ArgumentNullException("callback"); 

     RESTConnector connector = RESTConnector.GetConnector(SERVICE_ID, "/v1/recognize"); 
     if (connector == null) 
      return false; 

     RecognizeRequest req = new RecognizeRequest(); 
     req.Clip = clip; 
     req.Callback = callback; 

     req.Headers["Content-Type"] = "audio/wav"; 
     req.Send = WaveFile.CreateWAV(clip); 
     if (req.Send.Length > MAX_RECOGNIZE_CLIP_SIZE) 
     { 
      Log.Error("SpeechToText", "AudioClip is too large for Recognize()."); 
      return false; 
     } 
     req.Parameters["model"] = m_RecognizeModel; 
     req.Parameters["continuous"] = "false"; 
     req.Parameters["max_alternatives"] = m_MaxAlternatives.ToString(); 
     req.Parameters["timestamps"] = m_Timestamps ? "true" : "false"; 
     req.Parameters["word_confidence"] = m_WordConfidence ? "true" :false"; 

     //these "keywords" and "keywords_threshold" and "keywordsThreshold" parameters 
     //are just my guess for how to set these values    
     req.Parameters["keywords"] = new string[] {"fun", "match", "test" }; 
     req.Parameters["keywordsThreshold"] = .2; 
     req.Parameters["keywords_threshold"] = .2; 
     //end my test insertions 

     req.OnResponse = OnRecognizeResponse; 

     return connector.Send(req); 
    } 

mais la valeur de résultat SpeechRecognitionEvent renvoyée ne contient aucun keywords_result. C'est mon but. J'essaie de voir la confiance pour chaque mot-clé dans l'objet keywords_result comme ça, mais l'objet keywords_result revient comme null. Est-ce que quelqu'un a implémenté avec succès l'évaluation de la confiance des mots clés avec le SDK Speech-To-Text de Watson dans Unity ou C#? Toutes les idées et suggestions sont les bienvenues.

PS Ceci est mon premier post :)

+0

Est-ce que cela doit être fait avec Watson? Sinon, regardez [ici] (http://stackoverflow.com/a/39613264/3785314). – Programmer

+0

Je pense que vous devez essayer le seuil inférieur. Essayez 0,1 au lieu de 0,2 ou même 0,00001 –

+0

Le langage Speech-To-Text d'Unity utilise Watson pour fonctionner. Voir ici dans la section des commentaires: https://www.assetstore.unity3d.com/en/#!/content/69399 –

Répondre

3

avère que je avais besoin de spécifier les mots-clés dans la fonction « SendStart » comme ceci:

private void SendStart() { 
     if (m_ListenSocket == null) 
      throw new WatsonException("SendStart() called with null connector."); 

     Dictionary<string, object> start = new Dictionary<string, object>(); 
     start["action"] = "start"; 
     start["content-type"] = "audio/l16;rate=" + m_RecordingHZ.ToString() + ";channels=1;"; 
     start["continuous"] = EnableContinousRecognition; 
     start["max_alternatives"] = m_MaxAlternatives; 
     start["interim_results"] = EnableInterimResults; 
     start["word_confidence"] = m_WordConfidence; 
     start["timestamps"] = m_Timestamps; 

     //specify keywords here 
     start["keywords"] = keywordsToCheck.ToArray(); 
     start["keywords_threshold"] = 0.05; 
     //end additions here 

     m_ListenSocket.Send(new WSConnector.TextMessage(Json.Serialize(start))); 
     m_LastStartSent = DateTime.Now; 
    } 

et écrire du code pour analyser les keyword_results correctement la fonction « ParseRecognizeResponse »:

private SpeechRecognitionEvent ParseRecognizeResponse(IDictionary resp){ 

     if (resp == null) 
      return null; 


     List<SpeechRecognitionResult> results = new List<SpeechRecognitionResult>(); 
     IList iresults = resp["results"] as IList; 
     if (iresults == null) 
      return null; 

     foreach (var r in iresults) 
     { 
      IDictionary iresult = r as IDictionary; 
      if (iresults == null) 
       continue; 

      SpeechRecognitionResult result = new SpeechRecognitionResult(); 

      //added this section, starting here 
      IDictionary iKeywords_result = iresult["keywords_result"] as IDictionary; 
      result.keywords_result = new KeywordResults(); 
      List<KeywordResult> keywordResults = new List<KeywordResult>(); 
      foreach (string key in keywordsToCheck) { 
       if (iKeywords_result[key] != null) { 
        IList keyword_Results = iKeywords_result[key] as IList; 
        if (keyword_Results == null) { 
         continue; 
        } 
        foreach (var res in keyword_Results) { 
         IDictionary kw_resultDic = res as IDictionary; 
         KeywordResult keyword_Result = new KeywordResult(); 
         keyword_Result.confidence = (double)kw_resultDic["confidence"]; 
         keyword_Result.end_time = (double)kw_resultDic["end_time"]; 
         keyword_Result.start_time = (double)kw_resultDic["start_time"]; 
         keyword_Result.normalized_text = (string)kw_resultDic["normalized_text"]; 
         keywordResults.Add(keyword_Result); 
        } 
       } 
      } 
      result.keywords_result.keyword = keywordResults.ToArray();     
      //ends here 

      result.final = (bool)iresult["final"]; 

      IList ialternatives = iresult["alternatives"] as IList; 
      if (ialternatives == null) 
       continue; 

      List<SpeechRecognitionAlternative> alternatives = new List<SpeechRecognitionAlternative>(); 
      foreach (var a in ialternatives) 
      { 
       IDictionary ialternative = a as IDictionary; 
       if (ialternative == null) 
        continue; 

       SpeechRecognitionAlternative alternative = new SpeechRecognitionAlternative(); 
       alternative.transcript = (string)ialternative["transcript"]; 
       if (ialternative.Contains("confidence")) 
        alternative.confidence = (double)ialternative["confidence"]; 

       if (ialternative.Contains("timestamps")) 
       { 
        IList itimestamps = ialternative["timestamps"] as IList; 

        TimeStamp[] timestamps = new TimeStamp[itimestamps.Count]; 
        for (int i = 0; i < itimestamps.Count; ++i) 
        { 
         IList itimestamp = itimestamps[i] as IList; 
         if (itimestamp == null) 
          continue; 

         TimeStamp ts = new TimeStamp(); 
         ts.Word = (string)itimestamp[0]; 
         ts.Start = (double)itimestamp[1]; 
         ts.End = (double)itimestamp[2]; 
         timestamps[i] = ts; 
        } 

        alternative.Timestamps = timestamps; 
       } 
       if (ialternative.Contains("word_confidence")) 
       { 
        IList iconfidence = ialternative["word_confidence"] as IList; 

        WordConfidence[] confidence = new WordConfidence[iconfidence.Count]; 
        for (int i = 0; i < iconfidence.Count; ++i) 
        { 
         IList iwordconf = iconfidence[i] as IList; 
         if (iwordconf == null) 
          continue; 

         WordConfidence wc = new WordConfidence(); 
         wc.Word = (string)iwordconf[0]; 
         wc.Confidence = (double)iwordconf[1]; 
         confidence[i] = wc; 
        } 

        alternative.WordConfidence = confidence; 
       } 

       alternatives.Add(alternative); 
      } 
      result.alternatives = alternatives.ToArray(); 
      results.Add(result); 
     } 

     return new SpeechRecognitionEvent(results.ToArray());       
    } 

si bien que, lorsque OnRecognize est transmis cette SpeechRecognitionEvent, je l'ai changé le code pour l'affichage alternatif mot s et leur score de confiance, à l'affichage des résultats de mots clés et leur score de confiance, comme si:

private void OnRecognize(SpeechRecognitionEvent result) { 
    //Debug.Log("Recognizing!"); 
    m_ResultOutput.SendData(new SpeechToTextData(result)); 

    if (result != null && result.results.Length > 0) { 
     if (m_Transcript != null) 
      m_Transcript.text = ""; 

     foreach (var res in result.results) { 
      //start keyword recognition changes here 
      if (res.keywords_result != null) { 
       if (res.keywords_result.keyword != null) { 
        foreach (var keyword in res.keywords_result.keyword) { 
         m_Transcript.text += string.Format("{0} ({1}, {2:0.00})\n", 
          keyword.normalized_text, res.final ? "Final" : "Interim", keyword.confidence); 
        } 
       } 
      } 
      //end here     
     } 
    } 
} 

Note, en utilisant les résultats des mots clés les valeurs de confiance est beaucoup plus précieux que de faire une vérification hardcoded pour voir si le mot alternatives Watson est obtenir correspondre vos mots clés, puis en utilisant la valeur de confiance là-bas. Les valeurs de confiance reviennent beaucoup plus haut lors de la vérification des valeurs de confiance keyword_results.keyword []. Car elles vérifient déjà ces mots. Cela a été l'impulsion pour passer à travers ce processus et analyser la valeur de résultat SpeechRecognitionEvent pour inclure correctement les valeurs keywords_result. Pour un peu d'expérience, je suis en train de créer un jeu de rythme pour les enfants dyslexiques afin d'apprendre la formation des mots, alors pensez Guitar Hero à Sesame Street.