TwilioBase64媒体负载谷歌语音到文本API没有响应



我需要使用谷歌语音到文本api对twilio电话进行一些实时转录,我已经使用了一些演示应用程序来展示如何设置。我的应用程序在.net内核3.1中,我使用的是带有Twilio定义的回调方法的webhook。在通过回调从Twilio检索媒体时,它以原始音频的形式传递,编码在base64中,如您所见。

https://www.twilio.com/docs/voice/twiml/stream

我也在Live Transcarbing上引用了这个演示,并试图模仿c#中的case语句。一切都连接正确,媒体和有效负载从Twilio传递到我的应用程序中。

然后将音频字符串转换为字节[],以传递给需要转录音频的Task

byte[] audioBytes = Convert.FromBase64String(info);

我下面的例子是基于谷歌文档的,这些文档要么来自文件,要么来自音频输入(如麦克风(。我的用例不同的是,我已经有了每个音频块的字节。我引用的例子可以在这里看到。从流输入转录音频

下面是我对后者的实现,尽管使用了原始音频字节。当Twilio网络套接字连接命中媒体事件时,会命中下面的任务。我直接将有效载荷传递到它中。从控制台日志中,我可以看到"打印响应"命中。。。控制台日志,但它不会进入while (await responseStream.MoveNextAsync())块并将转录本记录到控制台。我没有收到任何错误(破坏应用程序(。这可能吗?我还尝试过将字节加载到一个memorystream对象中,并像Google文档示例一样将它们传入。

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

经过这一切,我发现这段代码运行良好,只需要在Twilio流生命周期中的不同事件中进行分解和调用。config部分需要放置在连接事件期间。打印消息任务需要放置在媒体事件中。然后,当从Twilio关闭websocket时,需要将WriteCompleteAsync放置在停止事件中。

另一个需要考虑的重要项目是发送到谷歌STT的请求数量,以确保过多的请求不会使配额过载,目前的配额似乎是每分钟300个请求。

最新更新