Мне нужно сделать некоторые транскрипции в реальном времени из телефонных звонков twilio с помощью API речи в текст Google, и я следил за несколькими демонстрационными приложениями, показывающими, как это настроить. Мое приложение в. net core 3.1, и я использую webhooks с определенным методом обратного вызова Twilio. После извлечения мультимедиа из Twilio с помощью обратного вызова, он передается как необработанный звук в кодировке base64, как вы можете видеть здесь.
https://www.twilio.com/docs/voice/twiml/stream
Я ссылался на это демо на Live транскрипции , а также пытаюсь имитировать c оператор case в c#. Все подключается правильно, а медиа и полезные данные передаются в мое приложение из Twilio.
Строка аудио затем преобразуется в байт [] для передачи Задаче, которая должна транскрибировать звук
byte[] audioBytes = Convert.FromBase64String(info);
Я следую примерам, основанным на документах Google, которые либо транслируются из файла или аудиовхода (например, микрофона). Если мой вариант использования отличается, у меня уже есть байты для каждой порции аудио. Примеры, на которые я ссылался, можно увидеть здесь. Транскрибирование аудио с потокового ввода
Ниже приведена моя реализация последнего, хотя и используются необработанные аудио байты. Эта задача ниже выполняется, когда соединение веб-сокета Twilio достигает события мультимедиа. Я передаю полезную нагрузку прямо в нее. Из журнала консоли я попадаю в журнал "Ответы на печать", нажав ... журнал консоли, но он НЕ попадет в блок while (await responseStream.MoveNextAsync())
и не запишет запись в консоль. Я не получаю никаких ошибок назад (которые ломают приложение.) Это возможно даже сделать? Я также попытался загрузить байты в объект потока памяти и передать их, как это делают примеры из Google c.
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;
}