我试图将mp4视频片段转换为FLAC音频文件,然后谷歌语音吐出视频中的单词,以便我可以检测是否有特定的单词。
除了我从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告诉我它是302kbps。
这是我的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);
答案 0 :(得分:6)
通过在我的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';
答案 1 :(得分:1)
kjdion84的回答运作良好,我发挥了更多的作用来找出根本原因。
根据this回答,所有编码仅支持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。 Cloud Speech Docs