将 int8 opus 编码数组转换为原始波形 (Python)
Convert int8 opus-encoded array into raw waveform (Python)
我有一个 js 脚本,可以从麦克风录制音频并通过 websocket 将其发送到 python REST API。
部分 js 脚本(在控制台中工作):
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
var options = {mimeType: "audio/webm;codecs=opus", audioBitsPerSecond:16000};
mediaRecorder = new MediaRecorder(stream, options);
mediaRecorder.addEventListener("dataavailable", function(event) {
var reader = new FileReader();
reader.addEventListener("loadend", function() {
var int8View = new Int8Array(reader.result);
console.log(int8View);
});
reader.readAsArrayBuffer(event.data);
});
mediaRecorder.start(200);
如果我理解正确的话,这段代码输出的 int8array 是 opus 编码的音频。
如何使用 python 将其解码为原始波形(例如 soundfile.read 会 return 的东西)?
我可以使用 ffmpeg 来解码 opus,但它适用于文件,我怎样才能把这个数组变成一个合适的 .opus或者 .ogg 文件在 python 端(因为我不想通过 websocket 发送文件)?
how can I turn this array into a proper .opus or .ogg file?
您正在通过 audio/webm;codecs=opus
捕获 Webm 文件流,因此需要将其从 Webm 转换为 Ogg Opus。相反,您可以简单地按原样下载或发送 Webm Opus 流作为文件:
const recordedBuffers = []
reader.addEventListener('loadend', () => {
recordedBuffers.push(reader.result)
})
function download() {
const a = document.createElement('a')
a.href = URL.createObjectURL(new Blob(recordedBuffers))
a.download = 'my-recorded-audio.webm'
a.click()
}
function saveToServer(url) {
return fetch(url, {
method: 'post',
body: new Blob(recordedBuffers),
headers: {
'content-type': 'application/octet-stream', // optional
'content-type': 'audio/webm', // optional
},
})
}
我有一个 js 脚本,可以从麦克风录制音频并通过 websocket 将其发送到 python REST API。
部分 js 脚本(在控制台中工作):
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
var options = {mimeType: "audio/webm;codecs=opus", audioBitsPerSecond:16000};
mediaRecorder = new MediaRecorder(stream, options);
mediaRecorder.addEventListener("dataavailable", function(event) {
var reader = new FileReader();
reader.addEventListener("loadend", function() {
var int8View = new Int8Array(reader.result);
console.log(int8View);
});
reader.readAsArrayBuffer(event.data);
});
mediaRecorder.start(200);
如果我理解正确的话,这段代码输出的 int8array 是 opus 编码的音频。
如何使用 python 将其解码为原始波形(例如 soundfile.read 会 return 的东西)?
我可以使用 ffmpeg 来解码 opus,但它适用于文件,我怎样才能把这个数组变成一个合适的 .opus或者 .ogg 文件在 python 端(因为我不想通过 websocket 发送文件)?
how can I turn this array into a proper .opus or .ogg file?
您正在通过 audio/webm;codecs=opus
捕获 Webm 文件流,因此需要将其从 Webm 转换为 Ogg Opus。相反,您可以简单地按原样下载或发送 Webm Opus 流作为文件:
const recordedBuffers = []
reader.addEventListener('loadend', () => {
recordedBuffers.push(reader.result)
})
function download() {
const a = document.createElement('a')
a.href = URL.createObjectURL(new Blob(recordedBuffers))
a.download = 'my-recorded-audio.webm'
a.click()
}
function saveToServer(url) {
return fetch(url, {
method: 'post',
body: new Blob(recordedBuffers),
headers: {
'content-type': 'application/octet-stream', // optional
'content-type': 'audio/webm', // optional
},
})
}