Использование GRPC только для подключения к диалоговому потоку StreamingDetectIntent, застрявшего в await responseStream.MoveNext - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь использовать DialogFlow API v2 с Unity.

Поскольку официального пакета SDK для Unity пока нет, я использовал Grkc beta Unity SDK и сгенерированный код C #, который я создал с помощью Protobuf и protoc из инструментов Grpc.

В этой ссылке спрятан бета-пакет Grpc Unity SDK.https://packages.grpc.io/ просто щелкните по идентификатору сборки, и вы найдете встроенный пакет Unity.

Я импортировал Google.Apis.Auth.OAuth2 и Grpc.Auth, которые не были включены в официальную бета-версию Unity Grpc.sdk.

Затем я написал этот код, который, кажется, работает нормально, за исключением того, что await responseStream.MoveNext () застрял.

Я считаю, что основная причина в том, что я не уверен, где установитьпуть к конечной точке: / v2 / projects / id-проекта / агент / намерения '

    GoogleCredential credential = GoogleCredential.FromJson(privateKey);

    Grpc.Core.Channel channel = new Grpc.Core.Channel("dialogflow.googleapis.com", credential.ToChannelCredentials());

    var client = new SessionsClient(channel);

    CallOptions options = new CallOptions();
    var duplexStream = client.StreamingDetectIntent();

    var responseHandlerTask = System.Threading.Tasks.Task.Run(async () =>
    {
        IAsyncEnumerator<StreamingDetectIntentResponse> responseStream = duplexStream.ResponseStream;
        while (await responseStream.MoveNext())//stuck here
        {
            StreamingDetectIntentResponse response = responseStream.Current;
        }
        // The response stream has completed
    });

    // Send requests to the server
    bool done = false;
    while (!done)
    {
        // Initialize a request
        var queryInput = new QueryInput();
        queryInput.AudioConfig = new InputAudioConfig();
        queryInput.AudioConfig.LanguageCode = "ja";
        queryInput.AudioConfig.SampleRateHertz = 141000;
        queryInput.AudioConfig.AudioEncoding = AudioEncoding.Linear16;

        StreamingDetectIntentRequest request = new StreamingDetectIntentRequest
        {
            Session = "",
            QueryInput = queryInput,
        };
        var bytes = File.ReadAllBytes("test.wav");
        request.InputAudio = Google.Protobuf.ByteString.CopyFrom(bytes);
        try
        {
            await duplexStream.RequestStream.WriteAsync(request);
        }
        catch (System.Exception e)
        {
            context.Post(state =>
            {
                Debug.LogErrorFormat("{0}\n{1}\n{2}\n{3}", e.Message, e.HelpLink, e.Source, e.StackTrace);
            }, null);
        }

        done = true;
    }

    await duplexStream.RequestStream.CompleteAsync();
    await responseHandlerTask;

Спасибо за продвижение.

1 Ответ

0 голосов
/ 17 декабря 2018

Я не добавил сеанс коррекции в запрос.Следующие исправили это.

StreamingDetectIntentRequest request = new StreamingDetectIntentRequest
{
    Session = "projects/project-id/agent/sessions/sessionid",
    QueryInput = queryInput,
};
...