Я пытаюсь получить стенограмму для записанного звука через микрофон с помощью 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.