因此,我正在开发一个音频记录器,用于浏览器使用Open AI whisper转录文本。然而,只有MediaRecorder dataavailable的第一次迭代被保存为有效的.webm文件,然后它们被保存为二进制文件。我也尝试硬编码.webm,并记录打印为audio/webm的blob.type。
我正在使用mediarecorder时间片选项每15秒创建一个新文件:mediaRecorder.start(15000);
有人能告诉我这里可能出了什么问题吗?
当前代码:
前端代码:
window.handleSuccess = function (stream) {
const options = {mimeType: 'audio/webm;codecs=opus'};
const recordedChunks = [];
const mediaRecorder = new MediaRecorder(stream, options);
mediaRecorder.addEventListener('dataavailable', function (e) {
const reader = new FileReader();
reader.readAsArrayBuffer(e.data);
reader.onloadend = function () {
const blob = new Blob([new Uint8Array(reader.result)], { type: 'audio/webm' });
recordedChunks.push(blob);
// post data to server
const formData = new FormData();
formData.append('audio', blob, 'filename.webm');
formData.append('audio_mime', blob.type);
formData.append('meeting_id', meetingId);
fetch('/api/audio', {
method: 'POST',
body: formData,
accept: 'application/json',
}).then((response) => {
console.log(response);
}).catch((error) => {
console.error(error);
});
};
});
字符串
Laravel后端代码
public function uploadAudio(Request $request): JsonResponse
{
$mime = $request->input('audio_mime');
$extensionMap = [
'audio/webm' => 'webm',
];
$extension = $extensionMap[$mime] ?? 'webm';
$audioName = time() . '.' . $extension;
$request->audio->move(storage_path('audio'), $audioName);
Audio::create([
'audio_file' => $audioName,
'meeting_id' => $request->get('meeting_id'),
]);
return response()->json([
'message' => 'Audio uploaded successfully',
'audio' => $audioName,
], 201);
}
型
1条答案
按热度按时间cgyqldqp1#
只有当您将所有块合并组合在一起时,
MediaRecorder
生成的文件才需要是有效文件。单个块不必是有效文件。在WebM的情况下,第一个块似乎是一个有效的文件,因为WebM支持附加额外的音频。换句话说,第一个块是一个有效的文件。第一个和第二个块组合也是一个有效的文件。但是第二个块本身不是一个有效的文件。
如果你想继续使用WebM,你可以手动解析第一个块来提取头,然后将头附加到后面的每个块中,使其成为一个有效的文件。
如果你不介意较大的文件大小,你也可以用一个额外的库将音频录制为PCM。这使得添加标题变得更容易。
下面是它如何与
extendable-media-recorder
一起工作的例子:字符串
这里有一个简单的演示项目的链接:https://stackblitz.com/edit/js-h48mqc?file=index.js。