Как воспроизвести выходной звук из диалогового потока (массив int) - PullRequest
0 голосов
/ 03 июня 2019

Я использую диалоговый поток для распознавания речи и намерений, но когда я получаю ответ с выходным звуком, я не могу найти способ воспроизвести звуковой ответ.Аудиоответ приходит в формате какого-то массива.Объект JSON выглядит следующим образом (это параметр данных, который я пытаюсь преобразовать в аудио):

{
   "type":"Buffer",
   "data":[255,251,16,196,0,0,0,0,1,164,20,0,0,32,...]},
   "latency":2906,
   "fulfillmentMessages":["Here's your Adele playlist."],
   "parameters":
      {
         "any":[],
         "music-artist":["Adele"]},
         "success":true
      }
}

Я уже пытался преобразовать его в ArrayBuffer, а затем декодировать, но это не выгляделодля работы либо

  playByteArray(byteArray) {
    var arrayBuffer = new ArrayBuffer(byteArray.length);
    var bufferView = new Uint8Array(arrayBuffer);
    for (let i = 0; i < byteArray.length; i++) {
      bufferView[i] = byteArray[i];
    }
    let context = new AudioContext();
    context.decodeAudioData(
      arrayBuffer,
      function(buffer) {
        this.play(buffer);
      }.bind(this)
    );
  }

  play(buf) {
    // Create a source node from the buffer
    let context = new AudioContext();
    var source = context.createBufferSource();
    source.buffer = buf;
    // Connect to the final output node (the speakers)
    source.connect(context.destination);
    // Play immediately
    source.start(0);
  }

edit: это пример JSON, который я получаю от DialogFlow: https://drive.google.com/open?id=1Y2UegyJ9BEwL6AR77Skly7prA4UalsNM

1 Ответ

0 голосов
/ 05 июня 2019

Кажется, проблема была в бэкэнде.У нас была неправильная конфигурация: outputAudioConfig в запросе должен выглядеть следующим образом:

outputAudioConfig: {
      audioEncoding: `OUTPUT_AUDIO_ENCODING_LINEAR_16`,
      sampleRateHertz: 44100
    }

, но для audioEncoding было задано значение "OUTPUT_AUDIO_ENCODING_MP3"

Кроме того, они также добавили неверный параметр:

 queryParams: {
      payload: structjson.jsonToStructProto({ source: "ACTIONS_ON_GOOGLE" }) // Let's pretend to be Google
    }

После удаления этого параметра сработал код, указанный в моем вопросе. Спасибо @Kolban за то, что он указал, что массив ответов не был правильным с самого начала.

...