Как использовать API речи Google для аудио с 2 каналами

У нас есть аудиозаписи с 2 людьми, говорящими по разным каналам. Я пробую официальную документацию для node.js здесь. Прежде всего, я получил ошибку, что размер полезной нагрузки превышает максимальный предел.

ubuntu@ip-xxxx:~/nodejs-docs-samples/speech$ node recognize.js async /home/ubuntu/output.wav
(node:18306) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Request payload size exceeds the limit: 10485760 bytes.

Однако в документации только что упоминались ограничения по длине записи, а не по размеру файла. Вот ссылка.

Есть ли обходной путь для этого?

Кроме того, я попытался с меньшим размером файла и получил ошибку конфигурации:

ubuntu@ip-xxx:~/nodejs-docs-samples/speech$ node recognize.js async /home/ubuntu/output2.wav
(node:18291) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Invalid Configuration, Does not match Wav File Header.
Wav Header Contents:
Encoding: LINEAR16
Channels: 2
Sample Rate: 16000.
Request Contents:
Encoding: linear16
Channels: 1
Sample Rate: 16000.

Я не уверен, позволяет ли API использовать 2-канальный аудиовход, поскольку я не смог найти такую ​​​​конфигурацию в документации. Однако я нашел эту ссылку, где предлагается разделить звук на отдельные каналов и использовать их отдельно. Каков рекомендуемый способ сделать это программно?


person Mandeep Singh    schedule 02.02.2017    source источник


Ответы (1)


Я принял этот подход в конце концов

  • Разделите файлы на каналы, используя sox
  • загрузите оба аудио канала в облачное хранилище Google (для локальных файлов API речи не будет обрабатываться, если длина записи превышает 1 минуту. Поэтому, если файлы большие, их необходимо загрузить в облачное хранилище Google)
  • Пропустите каждый из файлов через API распознавания речи
  • Храните стенограммы отдельно. Мы не можем объединить их, поскольку API речи Google не предоставляет временную метку для слов.

Вот вспомогательная функция для разделения файлов на каналы

function splitFileToChannels (fileName) {
  let output = {
    channel1: `${fileName}_channel1.wav`,
    channel2: `${fileName}_channel2.wav`
  };
  let channel1Command = `sox ${fileName} ${fileName}_channel1.wav remix 1`;
  let channel2Command = `sox ${fileName} ${fileName}_channel2.wav remix 2`;
  return Promise.all([
    childProcess.execAsync(channel1Command),
    childProcess.execAsync(channel2Command)
  ])
  .then(() => {
    return output;
  });
}

Кроме того, мне пришлось сначала преобразовать файл mp3 в формат wav перед разделением на каналы.

person Mandeep Singh    schedule 09.02.2017
comment
Для будущих читателей: некоторые части этого решения здесь устарели из-за бета-изменений в Google Speech-to-Text API, включая временные коды на уровне слов, диаризацию говорящих и ASR на каждом канале. Дополнительные сведения см. здесь: cloud.google.com/speech-to- text/docs/multi-channel Однако все еще существуют некоторые проблемы с обработкой 2-канальных wav-файлов с помощью инструментов диаризации. - person Nick Ruiz; 10.11.2018