Google 演讲 API "Sample rate in request does not match FLAC header"

Google Speech API "Sample rate in request does not match FLAC header"

我正在尝试将 mp4 视频剪辑转换为 FLAC 音频文件,然后让 google 语音吐出视频中的单词,以便我可以检测是否说了特定单词。

我的一切正常,除了我从语音中收到错误 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);

通过在我的 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的回答很好,我多玩了一点才找出根本原因。

根据 this 回答,所有编码 仅支持 1 个通道(单声道) 音频

我正在使用此命令创建 FLAC 文件:

ffmpeg -i test.mp3 test.flac

Sample rate in request does not match FLAC header

但是添加 -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