我正在尝试创建一个为机器学习项目录制音频的程序,我想使用谷歌colab,这样人们就不必在他们的系统上安装或运行任何东西,我在网上找到了这个录制和播放的例子音频:
cell 1 包含录制音频的 js 代码和将其转换为字节对象的 python 代码:
# all imports
from io import BytesIO
from base64 import b64decode
from google.colab import output
from IPython.display import Javascript
RECORD = """
const sleep = time => new Promise(resolve => setTimeout(resolve, time))
const b2text = blob => new Promise(resolve => {
const reader = new FileReader()
reader.onloadend = e => resolve(e.srcElement.result)
reader.readAsDataURL(blob)
})
var record = time => new Promise(async resolve => {
stream = await navigator.mediaDevices.getUserMedia({ audio: true })
recorder = new MediaRecorder(stream)
chunks = []
recorder.ondataavailable = e => chunks.push(e.data)
recorder.start()
await sleep(time)
recorder.onstop = async ()=>{
blob = new Blob(chunks)
text = await b2text(blob)
resolve(text)
}
recorder.stop()
})
"""
def record(sec=3):
print("")
print("Speak Now...")
display(Javascript(RECORD))
sec += 1
s = output.eval_js('record(%d)' % (sec*1000))
print("Done Recording !")
b = b64decode(s.split(',')[1])
return b #byte stream
单元 2 运行录音功能:
audio = record(2)
单元格 3 创建一个显示项目,以便您可以播放录音:
import IPython.display as ipd
ipd.display(ipd.Audio(audio))
最后我会让用户说一个词 1 秒钟,我遇到的问题是,用户被告知说话的时间和实际录音开始的时间之间存在差异,如果我立即说话我讲话的开头不在音频文件中。有没有办法在出现说话命令和实际录音开始时更精确地排队?
我认为差异是因为设置所需的时间。特别是,在我们到达 recorder.start() 之前运行以下代码的时间
stream = await navigator.mediaDevices.getUserMedia({ audio: true })
recorder = new MediaRecorder(stream)
chunks = []
recorder.ondataavailable = e => chunks.push(e.data)
另外,当执行
print("Speak Now...")
时,应该紧接着执行recorder.start()。
所以我认为我们可以通过提前设置来减少延迟: print("Speak Now...");录音机.start()
我也想使用这个代码,但是它解决了吗?我可以在某个地方找到解决方案以便我可以录制音频吗?谢谢你帮我。