Watson Speech To Text API возвращает пустой ответ - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь получить стенограмму для записанного звука через микрофон с помощью Watson Text To Speech API. Используя Vue во внешнем интерфейсе, PHP во внутреннем и Guzzle, чтобы сделать запрос.

Запись звука начинается, когда пользователь нажимает кнопку, а также заканчивается нажатием кнопки, когда я отправляю данные в бэкэнд и делаю запрос в API. Проблема в том, что я получаю пустой ответ. Здесь нет ошибок или чего-либо еще.

Вот как далеко я продвинулся: во фронте я использую MediaRecorder для записи аудио, когда запись звука останавливается, я делаю большой двоичный объект из данных, записанных с соответствующим mimetype, и преобразую его в строку base64 и отправьте ее бэкэнду, например:

navigator.mediaDevices.getUserMedia({ audio: true })
.then(stream => {
    this.mediaRecorder = new MediaRecorder(stream);
    this.mediaRecorder.start();

    let audioChunks = [];
    this.mediaRecorder.addEventListener("dataavailable", event => {
        audioChunks.push(event.data);
    });

    this.mediaRecorder.addEventListener("stop", () => {
        const mimeType = this.mediaRecorder.mimeType;
        const audioBlob = new Blob(audioChunks, {type: mimeType});

        const audioTrack = stream.getAudioTracks()[0];
        stream.removeTrack(audioTrack);

        let reader = new FileReader();
        reader.readAsDataURL(audioBlob);

        reader.onload = () => {
            const recording = reader.result;

            this.makeRequest(url, 'POST', {'audio': recording, 'mimeType': mimeType})
                .then(response => {
                    // filter response
                })
                .catch(error => {
                    //
                });

            this.mediaRecorder = null;
        };
    });
})

В бэк-энде я декодирую строку base64 и сохраняю ее в файл, а затем отправляю в Speech To Text API, например так:

$data = json_decode($request->getContent());
$formatted_str = str_replace("data:{$data->mimeType};base64,", "", $data->audio);
$recording = base64_decode($formatted_str);

$filename = Uuid::uuid4()->toString() . ".webm";
file_put_contents($filename, $recording);

$client = new GuzzleClient([
   'base_uri' => $baseUrl
]);

try {
    $apiRequest = new \GuzzleHttp\Psr7\Request('POST', $clientUrl);
    $apiRequestParams = [
        'auth' => ['apikey', $apiKey],
        'headers' => [
            'Content-Type' => $data->mimeType
        ],
          'model' => 'en-GB_BroadbandModel',
          'body' => file_get_contents($filename)
    ];

    $response = $client->send($apiRequest, $apiRequestParams);

    $data = $response;

   return new JsonModel([
       'data' => $data
   ]);

Все, что я получаю, это ответ с пустым телом. Код статуса запроса - 200.

1 Ответ

0 голосов
/ 27 марта 2020

fopen для создания дескриптора файла и не будет читать никаких данных. Вы, вероятно, захотите file_get_contents

...