DialogFlow не распознает аудиовходы

#javascript #node.js #dialogflow-es

#javascript #node.js #dialogflow-es

Вопрос:

Я использую чат-бота DialogFlow для обнаружения текстовых и аудиовходов, текст работает нормально, а аудио — нет, я читаю аудиофайлы, которые я генерирую (.mp3 и .wav), читаю их в nodejs и отправляю, но ответа нет, я получаю пустое намерение, оно даже не зарегистрированов истории DialogFlow, но когда я предоставляю ему образец аудио из DialogFlow, он работает нормально, вот мой код, я следую документации, предоставленной DialogFlow:

 const sessionId = uuid.v4();

  const sessionClient = new dialogflow.SessionsClient({
    projectId,
    keyFilename,
  });

  const readFile = util.promisify(fs.readFile);
  const inputAudio = await readFile('myfilepath.mp3');
  const sessionPath = sessionClient.projectAgentSessionPath(projectId, sessionId);
  const request = {
    session: sessionPath,
    queryInput: {
      audioConfig: {
        audioEncoding: 'AUDIO_ENCODING_LINEAR_16',
        sampleRateHertz: 16000,
        languageCode: 'en-US',
      },
    },
    inputAudio,
  };
  const [response] = await sessionClient.detectIntent(request);

  console.log('Detected intent:');
  console.log(response);

  const result = response.queryResult;

  console.log(`  Query: ${result.queryText}`);
  console.log(`  Response: ${result.fulfillmentText}`);
  

Ответ всегда

 {
  responseId: '',
  queryResult: {
    fulfillmentMessages: [],
    outputContexts: [],
    queryText: '',
    speechRecognitionConfidence: 0,
    action: '',
    parameters: null,
    allRequiredParamsPresent: false,
    fulfillmentText: '',
    webhookSource: '',
    webhookPayload: null,
    intent: null,
    intentDetectionConfidence: 0,
    diagnosticInfo: null,
    languageCode: 'en-US',
    sentimentAnalysisResult: null
  },
  webhookStatus: null,
  outputAudio: <Buffer >,
  outputAudioConfig: null
}
  

Есть ли конкретный способ создания аудиофайла, которому я должен следовать или что?

Спасибо.

Ответ №1:

Я думаю, что ваша проблема связана с кодировкой и частотой дискретизации ваших аудиофайлов.

Я смог воспроизвести сценарий и получить ваш response вывод, используя образцы из nodejs-dialogflow, в частности detect.js , с файлом MP3, в котором выполняется образец, подобный этому:

 node detect audio resources/book_a_room.mp3 -r 16000
  

При просмотре поддерживаемых кодировок в примере выполняется:

 node detect audio -help
  

Мы видим, что доступны следующие опции:

   -e, --encoding    The encoding of the input audio.
              [choices: "AUDIO_ENCODING_LINEAR_16", "AUDIO_ENCODING_FLAC", "AUDIO_ENCODING_MULAW", "AUDIO_ENCODING_AMR",
                  "AUDIO_ENCODING_AMR_WB", "AUDIO_ENCODING_OGG_OPUS", "AUDIO_ENCODING_SPEEX_WITH_HEADER_BYTE"] [default:
                                                                                             "AUDIO_ENCODING_LINEAR_16"]
  

Эти параметры также можно увидеть в справочнике API Dialogflow для AudioEncoding . Отсюда мы можем сделать вывод, что MP3 не является поддерживаемой кодировкой, и именно поэтому вы получаете этот response вывод.

Также при просмотре ссылки на API Dialogflow вы можете увидеть следующее:

… Обратитесь к документации Cloud Speech API для получения более подробной информации.

Заглянув в эту документацию и перейдя в раздел кодирования, вы можете увидеть, что:

Примечание: Преобразование речи в текст поддерживает WAV-файлы с аудио в кодировке LINEAR16 или MULAW.

Итак, возвращаясь к параметрам кодирования из API Dialogflow, мы видим, что для файлов WAV можно использовать следующие:

  • AUDIO_ENCODING_LINEAR_16
  • AUDIO_ENCODING_MULAW

Важно отметить, что AUDIO_ENCODING_LINEAR_16 эта опция установлена по умолчанию.

Таким образом, вы можете использовать файлы WAV с 1 каналом с правильной частотой дискретизации в соответствии с той, которая есть в вашем файле WAV (например, 44100), и тогда вы получите желаемый ответ. Например:

 node detect audio resources/book_a_room_1ch_16Khz.wav -r 16000
  

Или

 node detect audio resources/book-a-room_1ch_44.1Khz.wav -r 44100
  

В противном случае вы получите сообщения об ошибках, подобные следующим:

 { Error: 3 INVALID_ARGUMENT: Must use single channel (mono) audio, but WAV header indicates 2 channels.
    at Object.callErrorFromStatus ...
  

И

 { Error: 3 INVALID_ARGUMENT: sample_rate_hertz (16000) in RecognitionConfig must either be omitted or match the value in the WAV header ( 44100).
    at Object.callErrorFromStatus ...