Google Cloud Speech API ничего не возвращает для аудио длительностью более 1 минуты

Аудиофайлы короче 1 минуты транскрибируются без проблем, но когда я пытаюсь транскрибировать более длинный файл, Google Speech API возвращает пустой ответ.

Я создаю свой .wav-файл, используя следующую команду SoX:

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, потому что в документации говорится, что любой файл, размер которого превышает 1 минуту, должен храниться в корзине gs, чтобы API расшифровал его.

Затем я запускаю следующий фрагмент кода, чтобы начать операцию транскрибирования:

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"}
}

Предполагается, что запрос был выполнен и успешно выполнен, но без какого-либо реального ответа. Куда я иду не так?

1

Решение

Смотрите документацию здесь: https://cloud.google.com/speech/docs/basics

Обратите внимание, что никаких результатов пока нет. Речевой API продолжит обрабатывать предоставленное аудио и использовать эту операцию для хранения возможных результатов, которые появятся в поле ответа операции (типа AsyncRecognizeResponse) после завершения запроса.

Я предполагаю, что есть способ предоставить функцию обратного вызова, которая будет обрабатывать фактический ответ, который включает транскрипцию.

0

Другие решения

Речевая документация API (https://cloud.google.com/speech/docs/encoding) говорит, что файлы WAV не поддерживаются. Это должен быть необработанный файл без заголовков (с расширением * .raw). Преобразование sox должно иметь определение «—type = FILETYPE», но, к сожалению, я не уверен, что это «—type = raw» или что-то еще.

0

Вы должны передать Google Cloud Storage объекты.

Так что постарайтесь:

use \Google\Cloud\ServiceBuilder;

$cloud = new ServiceBuilder([
'keyFilePath' => '/var/www/cert/gcloud_key.json',
'projectId' => 'm****n-141000'
]);

$storage = $cloud->storage();
$bucket = $storage->bucket($bucket_name);
$object = $bucket->object($audio_filename);

$speech = $cloud->speech();

$operation = $speech->beginRecognizeOperation(
$object, [
'encoding' => 'LINEAR16',
'sampleRate' => 16000
]);

$isComplete = $operation->isComplete();

while (!$isComplete) {
sleep(1);
$operation->reload();
$isComplete = $operation->isComplete();
}

var_dump($operation->results());
0
По вопросам рекламы [email protected]