Преобразование речи в текст из облака Google, возвращающее пустой результат или ошибку

#google-cloud-platform #google-cloud-speech

#google-облачная платформа #google-cloud-speech

Вопрос:

Уже 4 дня я усердно работаю над тем, чтобы заставить работать API преобразования речи в текст в облаке Google, но по-прежнему не вижу света в конце туннеля. Много искал в сети, много читал документацию, но результата не вижу.

Наш сайт bbsradio.com , мы пытаемся автоматически извлечь расшифровку из наших mp3-файлов с помощью Google speech-to-text api. Код написан на PHP и почти точная копия этого: https://github.com/GoogleCloudPlatform/php-docs-samples/blob/master/speech/src/transcribe_async.php я вижу, что процесс завершен, и он доступен здесь « $operation->pollUntilComplete(); «, но он не показывает, что он был успешным в « if ($operation->operationSucceeded()) { » и не возвращает никаких ошибок $operation->getError() .

Я конвертирую mp3 в необработанный файл следующим образом: ffmpeg -y -loglevel panic -i /public_html/sites/default/files/show-archives/audio-clips-9-23-2020/911freefall2020-05-24.mp3 -f s16le -acodec pcm_s16le -vn -ac 1 -ar 16000 -map_metadata -1 /home/mp3_to_raw/911freefall2020-05-24.raw

Хотя я пробовал и с форматом FLAC, не сработало. Я протестировал преобразованный файл FLAC с помощью проигрывателя Windows Media, я могу четко прослушивать разговор. Я проверил файлы с частотой 16000 Гц, канал = 1 и его 16 бит. Я вижу, что файл загружен в облачное хранилище. Проверил это:

https://cloud.google.com/speech-to-text/docs/troubleshooting и https://cloud.google.com/speech-to-text/docs/best-practices

Есть много обсуждений и документации, кажется, на данный момент ничего не помогает. Если кто-то действительно может помочь мне разобраться в проблеме, это будет действительно действительно здорово!

Ответ №1:

TLDR; конвертируйте из MP3 в 1-канальный файл FLAC с той же частотой дискретизации, что и ваш MP3-файл.

Длинное объяснение:

Поскольку вы используете файлы MP3 в качестве входных данных процесса, вероятно, артефакты сжатия MP3 могут повредить вам при повторной дискретизации до 16 кГц (вы не можете этого услышать, но алгоритм будет).

Чтобы подтвердить эту теорию:

  • При выполнении ffprobe -hide_banner filename.mp3 он выведет что-то вроде этого:
   Metadata:
    ...
  Duration: 00:02:12.21, start: 0.025057, bitrate: 320 kb/s
    Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 320 kb/s
    Metadata:
      encoder         : LAME3.99r
  
  • В этом случае частота дискретизации подходит для Google-Spech-Api. Просто перекодируйте файл без изменения частоты дискретизации (удалите -ar 16000 из вашей команды ffmpeg)

  • У вас могут возникнуть проблемы, если исходный битрейт MP3 низкий. 320 КБ / с кажется безопасным (если в записи не много шума).

  • Примите во внимание, что голос, перекодированный со скоростью 64 КБ / с (качество линии ISDN), может быть понят человеком только при наличии некоторого шума.

Комментарии:

1. Спасибо за предложение. Я попробовал с предложением. Все еще не работает. Я попробовал с проверенным файлом mp3, я вижу, что он работает, так что код в порядке. Файл mp3, который я тестирую, имеет частоту 32000 Гц, битрейт 80 КБ / с, канал 2 (преобразован в flac с моно). Наверняка есть некоторые связанные с параметром файла mp3.

2. @Md.ShafiqHossain — Жаль это слышать. MP3 хорош для архивирования звука для людей. В настоящее время у машин возникают проблемы с этим. Я не знаю о работающем восстановителе MP3 -> to simple wave (с суперразрешением). Все еще продолжается работа.

3. Я пробовал с файлом wav, но безуспешно. Параметр файла WAV выглядит следующим образом: Продолжительность: 01:57:52.82, битрейт: 1411 кб / с Поток # 0: 0: Аудио: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Гц, стерео, s16, 1411 кб / с, преобразованный вFLAC, подобный этому: Продолжительность: 01:57:52.82, начало: 0.000000, битрейт: 153 кб / с Поток # 0: 0: Аудио: flac, 16000 Гц, моно, s16 <br> Также пробовал с 44100 Гц, тот же результат безуспешен.

Ответ №2:

Наконец-то я нашел решение и причину проблемы. На самом деле получение пустых результатов является ошибкой кода php api. Что вам нужно сделать:

Замените это:

 $operation->pollUntilComplete();
  

этим:

 while(!$operation->isDone()){
       $operation->pollUntilComplete();
}
  

Прочитайте это: введите описание ссылки здесь