0

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;
    }
4

1 に答える 1