Uniapp移动端要进行websoket语音转文字,但是用AudioContext会报错Cannot read property 'AudioContext' of undefined",是不是Uniapp不能使用AudioContext函数,不能的话=怎么把Uniapp的录音实时转化为Blob类型发送呢?急求!
该回答引用ChatGPT
Uniapp 支持使用 AudioContext 函数,但需要注意几点:
需要在页面的 script 标签中导入 webAudio.js ,然后在方法中调用。
需要在 manifest.json 文件中声明需要使用录音权限:
{
"app-plus": {
"permissions": {
"record": {
"desc": "用于录制音频"
}
}
}
}
对于将录音实时转换为 Blob 类型发送的问题,可以将录音数据进行分段处理,每一段处理后合并成一个 Blob 对象,然后发送给后端进行语音转文字处理。具体实现可参考以下代码:
function startRecord() {
uni.getRecorderManager().start({
format: 'mp3',
sampleRate: 16000,
numberOfChannels: 1,
encodeBitRate: 16000,
frameSize: 2048
})
this.recording = true
// 开始录音时初始化录音数据和 AudioContext 对象
this.recorderData = []
this.audioContext = new (window.AudioContext || window.webkitAudioContext)()
// 获取麦克风输入流
navigator.mediaDevices.getUserMedia({ audio: true }).then(stream => {
this.audioInput = this.audioContext.createMediaStreamSource(stream)
this.recorder = this.audioContext.createScriptProcessor(2048, 1, 1)
// 处理录音数据并合并为 Blob 对象
this.recorder.onaudioprocess = e => {
if (!this.recording) return
const buffer = e.inputBuffer.getChannelData(0)
this.recorderData.push(new Float32Array(buffer))
if (this.recorderData.length === 10) {
const audioBlob = new Blob(this.recorderData, { type: 'audio/mp3' })
this.recorderData = []
// 发送语音数据到后端进行语音转文字处理
this.sendAudioData(audioBlob)
}
}
// 连接 AudioContext 对象
this.audioInput.connect(this.recorder)
this.recorder.connect(this.audioContext.destination)
})
}
function stopRecord() {
this.recording = false
uni.getRecorderManager().stop()
}
以上代码中,startRecord 方法在开始录音时初始化录音数据和 AudioContext 对象,然后获取麦克风输入流,并将录音数据分段处理后合并成 Blob 对象发送给后端。stopRecord 方法则停止录音,并结束语音数据的处理。