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」と認識されました。 ここからソースコードアーカイブをダウンロードします 。
制限なしで利用できるようになるまで、テクノロジーをお楽しみください!