DialogFlow StreamingDetectIntentResponse не возвращает ResponseId, QueryText, Transcript или что-либо, кроме LanguageCode - PullRequest
0 голосов
/ 17 декабря 2018

Я успешно использовал Grpc в Unity, отправил запрос потоку Dialog и получил ответ.Вы можете проверить детали здесь

Однако весь возвращаемый результат является следующим

{"queryResult": {"languageCode": "ja"}}

Ожидаемый идентификатор ответа, текст запроса и т. Д. Не возвращаются.При тестировании в console.dialogflow.com я получаю следующий результат

{"responseId": "cdf8003e-6599-4a28-9314-f4462c36e21b", "queryResult": {"queryText": "お は よ うす ざ い ま す "," speechRecognitionConfidence ": 0.92638445," languageCode ":" ja "}}

Однако, когда я попытался в console.dialogflow.com и ничего не сказал, я получил

{"queryResult": {"languageCode": "ja"}}

Так что, возможно, кодировка InputAudio как-то неверна.

Вот как я это делаю

var serializedByteArray = convertToBytes(samples);
request.InputAudio = Google.Protobuf.ByteString.CopyFrom(serializedByteArray);

И преобразование в байты выглядит следующим образом:

public static byte[] convertToBytes(float[] audio)
{
    List<byte> bytes = new List<byte>();

    foreach (float audioI in audio) {
        bytes.AddRange(BitConverter.GetBytes(audioI));
    }

    return bytes.ToArray();
}

Источник звука определяется следующим образом, где sampleRate равен 16000

audioSource.clip = Microphone.Start(null, true, 30, sampleRate);

.частота дискретизации hz правильно.

queryInput.AudioConfig.SampleRateHertz = sampleRate;

Редактировать:

Я записал записанные байты из единицы в файл (все потоки были добавлены вместе) и написал консольное приложение для тестированиядвоичный файл, сгенерированный, но использующий DetectIntent, а не потоковое обнаружение Intent.

GoogleCredential credential = GoogleCredential.FromJson(privateKey);

var url = "dialogflow.googleapis.com";

Grpc.Core.Channel channel = new Grpc.Core.Channel(url, credential.ToChannelCredentials());


var client = SessionsClient.Create(channel);


CallOptions options = new CallOptions();

DetectIntentRequest detectIntentRequest = new DetectIntentRequest();
detectIntentRequest.Session = "projects/projectid/agent/sessions/" + "detectIntent";
QueryInput queryInput = new QueryInput();
queryInput.AudioConfig = new InputAudioConfig();
queryInput.AudioConfig.LanguageCode = "ja";
queryInput.AudioConfig.SampleRateHertz = sampleRate;//must be between 8khz and 48khz
queryInput.AudioConfig.AudioEncoding = AudioEncoding.Linear16;

detectIntentRequest.QueryInput = queryInput;

detectIntentRequest.InputAudio = Google.Protobuf.ByteString.CopyFrom(File.ReadAllBytes("D:\\temp\\audio.bytes"));
 var response = client.DetectIntent(detectIntentRequest);
        Console.WriteLine(response.ToString());
        Console.WriteLine(response.ResponseId);
Console.Read();

Я все еще получаю это (и пустой response.ResponseId)

{"queryResult": {"languageCode": "ja"}}

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

1 Ответ

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

Наконец-то нашел ответ.То, как я конвертировал float источника данных в линейный 16-байтовый массив, было явно неправильным.Вот код, который работал Кредиты на этот пост на форуме Unity.

...