Google の音声テキスト変換 API を使用して、twilio 通話からリアルタイムの文字起こしを行う必要があり、これを設定する方法を示すいくつかのデモ アプリに従いました。私のアプリケーションは .net core 3.1 で、Twilio 定義のコールバック メソッドで Webhook を使用しています。コールバックを介して Twilio からメディアを取得すると、ここで確認できるように、Base64 でエンコードされた Raw オーディオとして渡されます。
https://www.twilio.com/docs/voice/twiml/stream
私はこのデモを Live Transcriptingでも参照しており、c# で case ステートメントを模倣しようとしています。すべてが正しく接続され、メディアとペイロードが Twilio から問題なくアプリに渡されます。
次に、音声文字列は byte[] に変換され、音声の書き起こしが必要な Task に渡されます。
byte[] audioBytes = Convert.FromBase64String(info);
ファイルまたはオーディオ入力 (マイクなど) からストリーミングする Google ドキュメントに基づいた例に従っています。ユース ケースが異なるのは、オーディオの各チャンクのバイトが既にあることです。私が参照した例は、ここで見ることができます。ストリーミング入力からの音声の書き起こし
以下は、生のオーディオバイトを使用していますが、後者の私の実装です。以下のこのタスクは、Twilio Websocket 接続がメディア イベントにヒットしたときにヒットします。ペイロードを直接渡します。while (await responseStream.MoveNextAsync())
コンソール ログから、Print Responses hit... コンソール ログを取得していますが、ブロックに入らず、トランスクリプトをコンソールに記録しません。エラーは返されません (アプリケーションが壊れます)。これは可能ですか? また、バイトをメモリストリームオブジェクトにロードして、Google doc の例と同様に渡すことも試みました。
static async Task<object> StreamingRecognizeAsync(byte[] audioBytes)
{
var speech = SpeechClient.Create();
var streamingCall = speech.StreamingRecognize();
// Write the initial request with the config.
await streamingCall.WriteAsync(
new StreamingRecognizeRequest()
{
StreamingConfig = new StreamingRecognitionConfig()
{
Config = new RecognitionConfig()
{
Encoding =
RecognitionConfig.Types.AudioEncoding.Mulaw,
SampleRateHertz = 8000,
LanguageCode = "en",
},
InterimResults = true,
SingleUtterance = true
}
}); ;
// Print responses as they arrive.
Task printResponses = Task.Run(async () =>
{
Console.WriteLine("Print Responses hit...");
var responseStream = streamingCall.GetResponseStream();
while (await responseStream.MoveNextAsync())
{
StreamingRecognizeResponse response = responseStream.Current;
Console.WriteLine("Response stream moveNextAsync Hit...");
foreach (StreamingRecognitionResult result in response.Results)
{
foreach (SpeechRecognitionAlternative alternative in result.Alternatives)
{
Console.WriteLine("Google transcript " + alternative.Transcript);
}
}
}
});
//using (MemoryStream memStream = new MemoryStream(audioBytes))
//{
// var buffer = new byte[32 * 1024];
// int bytesRead;
// while ((bytesRead = await memStream.ReadAsync(audioBytes, 0, audioBytes.Length)) > 0)
// {
// await streamingCall.WriteAsync(
// new StreamingRecognizeRequest()
// {
// AudioContent = Google.Protobuf.ByteString
// .CopyFrom(buffer, 0, bytesRead),
// });
// }
//}
await streamingCall.WriteAsync(
new StreamingRecognizeRequest()
{
AudioContent = Google.Protobuf.ByteString
.CopyFrom(audioBytes),
});
await streamingCall.WriteCompleteAsync();
await printResponses;
return 0;
}