2016-09-28 9 views
1

私はmp4ビデオクリップをFLACオーディオファイルに変換しようとしています。特定の言葉が言われました。Google Speech API「要求のサンプルレートがFLACヘッダーと一致しません」

私はすべてが私はスピーチのAPIからエラーを取得していますことを除いて取り組んでいます

{ 
    "error": { 
    "code": 400, 
    "message": "Sample rate in request does not match FLAC header.", 
    "status": "INVALID_ARGUMENT" 
    } 
} 

私はFLACファイルにMP4に変換するためにFFMPEGを使用しています。私はFLACファイルがコマンドの16ビットであることを指定していますが、FLACファイルを右クリックすると、Windowsは302kbpsであることを伝えています。ここで

は私のPHPコードです:

私のFFMPEGコマンドに非常に特異的であることによってそれを修正
// 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

サンプルフォーマット(符号付き16に設定したもの)とサンプルレートには違いがあります。 – fakedad

+0

ありがとう、私はそれを理解し、答えを提供しました。 Google Speech APIは、ビット、サンプル、およびチャンネルが非常に欲しいと思われます。 – kjdion84

答えて

6

$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'; 
+0

ああ私の神...これは実際に働いた....これは過去24時間以来私を殺している............世界のどのように短いコマンドが動作していないのですか? – Mahesh

1

kjdion84の答えはうまく働いた、と私は見つけるためにもう少しを果たしました根本的な原因。

私は、このコマンドでFLACファイル作成されたすべてのエンコーディングサポートのみ1つのチャンネル(モノラル)オーディオ

this答えを1として:要求に

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

+1

これは素晴らしいです。私の答えよりもずっと短く、簡単です。もし私が愛しているものがあれば、それは簡単です。 – kjdion84

関連する問題