gpt4 book ai didi

javascript - scriptNode.onaudioprocess 已弃用,还有其他选择吗?

转载 作者:行者123 更新时间:2023-12-04 12:31:05 30 4
gpt4 key购买 nike

我想在通话时获取音频缓冲区,我做了这个方法来检测它,但是我收到消息,这个方法 onaudioprocess 已被弃用并且没有被触发,有没有其他替代方法的例子。

audioContext = new AudioContext({ sampleRate: 16000 });
scriptNode = (audioContext.createScriptProcessor || audioContext.createJavaScriptNode).call(audioContext, 1024, 1, 1);
scriptNode.onaudioprocess = function (audioEvent) {
if (recording) {
input = audioEvent.inputBuffer.getChannelData(0);
// convert float audio data to 16-bit PCM
var buffer = new ArrayBuffer(input.length * 2);
var output = new DataView(buffer);
for (var i = 0, offset = 0; i < input.length; i++, offset += 2) {
var s = Math.max(-1, Math.min(1, input[i]));
output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true);
}
ws.send(buffer);
}
};

最佳答案

MediaStream Recording API MediaDevices.getUserMedia() 方法,您可以从麦克风流式传输音频并将其流式传输到录音机。然后录音机可以发送Blob每当 ondataavailable 时通过 WebSockets 对象事件在记录器上触发。
下面的函数创建一个流并将其传递给 MediaRecorder 实例。该实例将记录您的麦克风音频并能够将其发送到您的 WebSocket。 MediaRecorder 的实例返回以控制记录器。

async function streamMicrophoneAudioToSocket(ws) {
let stream;
const constraints = { video: false, audio: true };

try {
stream = await navigator.mediaDevices.getUserMedia(constraints);
} catch (error) {
throw new Error(`
MediaDevices.getUserMedia() threw an error.
Stream did not open.
${error.name} -
${error.message}
`);
}

const recorder = new MediaRecorder(stream);

recorder.addEventListener('dataavailable', ({ data }) => {
ws.send(data);
});

recorder.start();
return recorder;
});
这样你也可以 停止如果您愿意,可以调用 stop() 进行录音记录仪上的方法。
(async () => {
const ws = new WebSocket('ws://yoururl.com');
const recorder = await streamMicrophoneAudioToSocket(ws);

document.addEventListener('click', event => {
recorder.stop();
});
}());

关于javascript - scriptNode.onaudioprocess 已弃用,还有其他选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65447236/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com