用例:我正在开发一个网络应用,以帮助学生学习阅读。在阅读网络应用程序上的文本时记录学生。信号通过200ms的段发送到后端,并在学生完成阅读之前进行分析,以便在阅读期间提供实时反馈。服务器将在每次分段分析后发送反馈。
在网络应用中,代码如下所示:
navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(stream => {
const mediaRecorder = new MediaRecorder(stream)
mediaRecorder.start(200)
mediaRecorder.ondataavailable = event => {
socket.emit('my_event', Blob([event.data]))
}
})
在chrome上,生成的媒体类型是webm。 我想知道如何处理后端的数据,这样我就可以在录制结束前用numpy分析媒体。
现在我找不到比以下更好的方法:
from pydub import AudioSegment
def blobToSignal(blob, is_first_sequence):
webm_header = b'\x1aE...'
fp = tempfile.NamedTemporaryFile()
fp.write(blob) if is_first_sequence else fp.write(webm_header + blob)
fp.seek(0)
samples = AudioSegment.from_file(fp.name, 'webm').get_array_of_samples()
fp.close()
return samples # this is almost a numpy array (analyzable)
我尝试更改前面以返回Float32Array而不是webm:
navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(stream => {
audio_context = new AudioContext()
var audioInput = audio_context.createMediaStreamSource(stream)
var recorder = audio_context.createScriptProcessor(8096, 1, 1)
recorder.onaudioprocess = event => {
socket.emit(
'my_event',
Array.from(event.inputBuffer.getChannelData(0))
)
}
audioInput.connect(recorder)
recorder.connect(audio_context.destination)
这样后端可以使用原始信号,但这种方法需要太高的带宽(~1Mb / s)。
所以我的问题是:
感谢您的帮助!