Поток ответа чтения диалога - PullRequest
0 голосов
/ 15 сентября 2018

Я использую клиентскую библиотеку 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;
    }
}
...