Я использую клиентскую библиотеку Dialogflow v2 для c #, чтобы отправить запрос на обнаружение потоковой передачи.Я изо всех сил пытаюсь прочитать поток ответа.
С помощью следующего кода я получаю этот ответ:
IAsyncEnumerator<StreamingDetectIntentResponse> responseStream = duplexStream.ResponseStream;
while (await responseStream.MoveNext())
{
StreamingDetectIntentResponse response = responseStream.Current;
Console.WriteLine(response);
}
//Response
...
{ "recognitionResult": { "messageType": "TRANSCRIPT", "transcript": "sometime next week" } }
{ "recognitionResult": { "messageType": "END_OF_SINGLE_UTTERANCE" } }
{ "recognitionResult": { "messageType": "TRANSCRIPT", "transcript": "sometime next week", "isFinal": true, "confidence": 0.888456166 } }
Exception thrown: 'Grpc.Core.RpcException' in mscorlib.dll
{ "responseId": "...", "queryResult": {...}}//truncated
Я предполагаю, что вышеупомянутая ошибка из-за того, что я не записываю полную асинхронность, если Single Utterance имеет значение true.Я попытался решить эту проблему с помощью следующего кода и получить следующие ошибки:
IAsyncEnumerator<StreamingDetectIntentResponse> responseStream = duplexStream.ResponseStream;
while (await responseStream.MoveNext())
{
StreamingDetectIntentResponse response = responseStream.Current;
Console.WriteLine(response);
if (response.RecognitionResult.MessageType == StreamingRecognitionResult.Types.MessageType.EndOfSingleUtterance)
{
await duplexStream.WriteCompleteAsync();
done = true;
Console.WriteLine("A single utterance has been spoken");
}
}
//Response
...
{ "recognitionResult": { "messageType": "TRANSCRIPT", "transcript": "sometime next week" } }
{ "recognitionResult": { "messageType": "END_OF_SINGLE_UTTERANCE" } }
A single utterance has been spoken
Exception thrown: 'System.InvalidOperationException' in Google.Api.Gax.Grpc.dll
{ "recognitionResult": { "messageType": "TRANSCRIPT", "transcript": "sometime next week", "isFinal": true, "confidence": 0.892199934 } }
{ "responseId": "...", "queryResult": {...}}//truncated
Exception thrown: 'System.NullReferenceException' in myconsoleapp.exe
Исключение для Exception thrown: 'System.InvalidOperationException' in Google.Api.Gax.Grpc.dll
равно Cannot call WriteAsync after WriteCompleteAsync
Исключение для 'System.NullReferenceException'
- это Reference not set to an instance of an object at line: if (response.RecognitionResult.MessageType == StreamingRecognitionResult.Types.MessageType.EndOfSingleUtterance)
Все это находится в моем консольном приложении, которое копирует мое реальное приложение, я надеюсь, что исправление этих проблем позволит мне напрямую исправить мое реальное приложение.Остальной код:
public async Task StreamingDetectIntent()
{
bool done = false;
SessionsClient sessionsClient = SessionsClient.Create();
SessionsClient.StreamingDetectIntentStream duplexStream = sessionsClient.StreamingDetectIntent();
Task.Run(async () =>
{
//See above snippets for the code in this section. This section appears to be causing the errors
});
while (!done)
{
StreamingDetectIntentRequest request = new StreamingDetectIntentRequest
{
Session = new SessionName("telebot-pianomoves-v1", "iq3464rfdw").ToString(),
SingleUtterance = true,
QueryInput = new QueryInput() {
AudioConfig = new InputAudioConfig()
{
AudioEncoding = Google.Cloud.Dialogflow.V2.AudioEncoding.Linear16,
SampleRateHertz = 16000,
LanguageCode = "en-US",
},
},
};
await duplexStream.WriteAsync(request);
byte[] bytes = System.IO.File.ReadAllBytes(@"C:\Users\hjstu\Desktop\Telebot\shortrecording.wav");
Array.Copy(bytes, 44, bytes, 0, bytes.Length - 44);
foreach (var batch in AsBatches(bytes, 320))
{
await duplexStream.WriteAsync(new StreamingDetectIntentRequest()
{
InputAudio = Google.Protobuf.ByteString.CopyFrom(batch)
});
System.Threading.Thread.Sleep(17);
}
}
}
public static IEnumerable<T[]> AsBatches<T>(T[] input, int n)
{
for (int i = 0, r = input.Length; r >= n; r -= n, i += n)
{
var result = new T[n];
Array.Copy(input, i, result, 0, n);
yield return result;
}
}