.NETアプリケーションでGoogle Voice Searchを使用する





Google Chromeブラウザーでは、しばらくの間音声認識が利用できました。 たとえば、 ここでその外観を確認できます



元のChromiumは公開されているためこの技術を地球上の平和の始まりという利己的な目的に使用できるかどうかを探りたいという自然な欲求があります。



よくあることですが、この記事ではすべてがすでに行われています。 すべてが非常にシンプルであることが判明したため、 FLACまたはSpeex形式の音声データを使用して、アドレスwww.google.com/speech-api/v1/recognizeに POSTリクエストを行う必要があります。 C#を使用してWAVEファイルの認識のデモを実装します。





元のトピックの著者のように、Speexを混乱させません。 サウンドをWave形式からFLACに変換するために、 Cuetoolsライブラリを使用しました 。 何らかの理由で、2つを除く任意の数のチャンネルでFLACを保存しようとすると、コードに例外がスローされましたが、このチェックをコメントアウトするだけで、Googleが完全に理解するモノファイルは安全に保存されます。



/// <summary>  wav-  flac </summary> /// <returns> </returns> public static int Wav2Flac(String wavName, string flacName) { int sampleRate = 0; IAudioSource audioSource = new WAVReader(wavName, null); AudioBuffer buff = new AudioBuffer(audioSource, 0x10000); FlakeWriter flakewriter = new FlakeWriter(flacName, audioSource.PCM); sampleRate = audioSource.PCM.SampleRate; FlakeWriter audioDest = flakewriter; while (audioSource.Read(buff, -1) != 0) { audioDest.Write(buff); } audioDest.Close(); audioDest.Close(); return sampleRate; }
      
      







誰かが欲求を持っている場合、一時的なFLACファイルに保存せずに実装する問題はないと思いますが、例を複雑にしません。 Googleが400エラーで高いサンプリングレート(44100)のファイルに反応したことに気づいただけですが、最大可能周波数である8および16 kHzが問題なく動作することはわかりませんでした。



Google Voiceを照会する主な方法:

  public static String GoogleSpeechRequest(String flacName, int sampleRate) { WebRequest request = WebRequest.Create("https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU"); request.Method = "POST"; byte[] byteArray = File.ReadAllBytes(flacName); // Set the ContentType property of the WebRequest. request.ContentType = "audio/x-flac; rate=" + sampleRate; //"16000"; request.ContentLength = byteArray.Length; // Get the request stream. Stream dataStream = request.GetRequestStream(); // Write the data to the request stream. dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); // Get the response. WebResponse response = request.GetResponse(); dataStream = response.GetResponseStream(); // Open the stream using a StreamReader for easy access. StreamReader reader = new StreamReader(dataStream); // Read the content. string responseFromServer = reader.ReadToEnd(); // Clean up the streams. reader.Close(); dataStream.Close(); response.Close(); return responseFromServer; }
      
      







DataContractJsonSerializerを介してJSON応答の逆シリアル化を行います。率直に言って、私は強くありません。さらに、Googleからの結果は常に次の形式で送信されます。



{"status":0,"id":"4531050901df65542082eacfebf3bb1b-1","hypotheses":[{"utterance":" ","confidence":0.89697623}]}







したがって、次の簡単な逆シリアル化で十分でした。コメントをお待ちしております。



 [DataContract] public class RecognizedItem { [DataMember] public string utterance; [DataMember] public float confidence; } [DataContract] public class RecognitionResult { [DataMember] public string status; [DataMember] public string id; [DataMember] public RecognizedItem[] hypotheses; } public static RecognitionResult Parse(String toParse) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(RecognitionResult)); MemoryStream stream1 = new MemoryStream(ASCIIEncoding.UTF8.GetBytes(toParse)); RecognitionResult result= (RecognitionResult)ser.ReadObject(stream1); return result; }
      
      











スクリーンショットでは、「自転車を購入」が完全に正しく認識され、「2回」は「1 2 rus」と認識されました。 ここからソースコードアーカイブをダウンロードします



制限なしで利用できるようになるまで、テクノロジーをお楽しみください!



All Articles