Я успешно использовал 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"}}
Спасибо за продвижение.