1 分未満の音声ファイルは問題なく文字起こしされますが、それより長いファイルを文字起こししようとすると、Google Speech API から空の応答が返されます。
次の SoX コマンドを使用して .wav ファイルを作成します。
sox input.flac --channels=1 --bits=16 --rate=16000 --encoding=signed-integer --endian=little output.wav
ファイルは期待どおりに再生されます。SoXi を実行すると、次の情報が得られます。
Input File : 'output.wav'
Channels : 1
Sample Rate : 16000
Precision : 16-bit
Duration : 00:02:35.71 = 2491408 samples ~ 11678.5 CDDA sectors
File Size : 4.98M
Bit Rate : 256k
Sample Encoding: 16-bit Signed Integer PCM
次に、それを Google ストレージにアップロードします。これは、API が文字起こしを行うには、1 分を超えるファイルはすべて gs バケットに存在する必要があるとドキュメントに記載されているためです。
次に、次のコードを実行して、文字起こし操作を開始します。
use \Google\Cloud\ServiceBuilder;
$cloud = new ServiceBuilder([
'keyFilePath' => '/var/www/cert/gcloud_key.json',
'projectId' => 'm****n-141000'
]);
$speech = $cloud->speech();
$operation = $speech->beginRecognizeOperation(
"gs://m****n-141000.appspot.com/output.wav", [
'encoding' => 'LINEAR16',
'sampleRate' => 16000
]);
$isComplete = $operation->isComplete();
while (!$isComplete) {
sleep(1);
$operation->reload();
$isComplete = $operation->isComplete();
}
var_dump($operation->results());
返される応答は空です。完全な応答は次のようになります。
object(stdClass)#27 (4) {
["name"]=>
string(19) "1904326252537199795"
["metadata"]=>
object(stdClass)#24 (4) {
["@type"]=>
string(70) "type.googleapis.com/google.cloud.speech.v1beta1.AsyncRecognizeMetadata"
["progressPercent"]=>
int(100)
["startTime"]=>
string(27) "2017-01-02T09:36:45.780425Z"
["lastUpdateTime"]=>
string(27) "2017-01-02T09:36:46.720260Z"
}
["done"]=>
bool(true)
["response"]=>
object(stdClass)#26 (1) {
["@type"]=>
string(70) "type.googleapis.com/google.cloud.speech.v1beta1.AsyncRecognizeResponse"
}
}
リクエストが実行され、正常に完了したが、実際の応答がないことを示唆しています。どこが間違っていますか?