Я пытаюсь преобразовать видеоролик mp4 в аудиофайл FLAC, а затем речевая речь Google выплевывает слова из видео, чтобы я мог определить, были ли указаны конкретные слова.
У меня все работает, кроме того, что я получаю ошибку от Speech API:
{ "error": { "code": 400, "message": "Sample rate in request does not match FLAC header.", "status": "INVALID_ARGUMENT" } }
Я использую FFMPEG, чтобы преобразовать mp4 в файл FLAC. Я указываю, что файл FLAC должен быть 16 бит в команде, но когда я нажимаю правой кнопкой мыши на файл FLAC, Windows говорит мне, что это 302 Кбит / с.
Вот мой PHP-код:
// convert mp4 video to 16 bit flac audio file $cmd = 'C:/wamp/www/ffmpeg/bin/ffmpeg.exe -i C:/wamp/www/test.mp4 -c:a flac -sample_fmt s16 C:/wamp/www/test.flac'; exec($cmd, $output); // convert flac to text so we can detect if certain words were said $data = array( "config" => array( "encoding" => "FLAC", "sampleRate" => 16000, "languageCode" => "en-US" ), "audio" => array( "content" => base64_encode(file_get_contents("test.flac")), ) ); $json_data = json_encode($data); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://speech.googleapis.com/v1beta1/speech:syncrecognize?key=MY_API_KEY'); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json")); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($ch);
Исправлено это, будучи очень специфичным в моей команде FFMPEG:
$cmd = 'C:/wamp/www/ffmpeg/bin/ffmpeg.exe -i C:/wamp/www/test.mp4 -acodec flac -bits_per_raw_sample 16 -ar 44100 -ac 1 C:/wamp/www/test.flac';
Ответ kjdion84 работал хорошо, и я немного поиграл, чтобы выяснить причину.
В соответствии с этим ответом, все кодировки поддерживают только 1 канал (моно) аудио
Я создал файл FLAC с помощью этой команды:
ffmpeg -i test.mp3 test.flac
Частота выборки в запросе не соответствует заголовку FLAC
Но добавление -ac 1
(установка количества аудиоканалов в 1) устранило эту проблему.
ffmpeg -i test.mp3 -ac 1 test.flac
Вот мой полный код Node.js
const Speech = require('@google-cloud/speech'); const projectId = 'EnterProjectIdGeneratedByGoogle'; const speechClient = Speech({ projectId: projectId }); // The name of the audio file to transcribe var fileName = '/home/user/Documents/test/test.flac'; // The audio file's encoding and sample rate const options = { encoding: 'FLAC', sampleRate: 44100 }; // Detects speech in the audio file speechClient.recognize(fileName, options) .then((results) => { const transcription = results[0]; console.log(`Transcription: ${transcription}`); }, function(err) { console.log(err); });
Частота выборки может быть 16000 или 44100 или другие допустимые, а кодировка может быть FLAC или LINEAR16. Облачные словари