实现浏览器语音呼起及语音录入及下载

主要分布三部分
第一部分:开始录音 ;第二部分:停止录音;第三部分:静默监听。

一、开始录音

代码如下:

document.getElementById('startRecording').onclick = async function() {
    if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
        try {
            audioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
            audioContext = new (window.AudioContext || window.webkitAudioContext)();
            const input = audioContext.createMediaStreamSource(audioStream);
            analyserNode = audioContext.createAnalyser();
            analyserNode.fftSize = 2048;
            input.connect(analyserNode);
            recorder = new Recorder(input);
            recorder.record();
            document.getElementById('startRecording').disabled = true;
            document.getElementById('stopRecording').disabled = false;
            monitorSilence();
        } catch (e) {
            alert('Unable to access microphone');
            console.error(e);
        }
    } else {
        alert('getUserMedia not supported in this browser');
    }
};

开始录音按钮点击事件:
检查浏览器是否支持getUserMedia,用于获取音频流。
如果支持,获取音频流并创建音频上下文和输入源。
创建分析节点并连接到输入源。
创建录音实例并开始录音。
禁用开始录音按钮,启用停止录音按钮。
调用monitorSilence函数开始监控静音。

二、终止录音

代码如下:

document.getElementById('stopRecording').onclick = stopRecording;
function stopRecording() {
    if (audioStream) {
        audioStream.getTracks().forEach(track => track.stop());
    }
    recorder.stop();
    recorder.exportWAV(function(blob) {
        const url = URL.createObjectURL(blob);
        const audio = document.getElementById('audioPlayback');
        audio.src = url;
        const downloadLink = document.getElementById('downloadLink');
        downloadLink.href = url;
        downloadLink.download = 'recorded_audio.wav';
        downloadLink.style.display = 'block';
    });

    document.getElementById('startRecording').disabled = false;
    document.getElementById('stopRecording').disabled = true;
}

停止录音按钮点击事件:
停止音频流。
停止录音。
导出录制的音频为WAV格式,并创建下载链接。
启用开始录音按钮,禁用停止录音按钮。

三、静默监听

代码如下:

function monitorSilence() {
    const bufferLength = analyserNode.fftSize;
    const dataArray = new Uint8Array(bufferLength);
    const checkSilence = () => {
        analyserNode.getByteFrequencyData(dataArray);
        const average = dataArray.reduce((sum, value) => sum + value, 0) / bufferLength;
        const db = 20 * Math.log10(average / 128);

        if (db < silenceThreshold) {
            if (!silenceTimeout) {
                silenceTimeout = setTimeout(stopRecording, silenceDelay);
            }
        } else {
            clearTimeout(silenceTimeout);
            silenceTimeout = null;
        }
        requestAnimationFrame(checkSilence);
    };

    checkSilence();
}

监控静音:
创建一个数组用于存储分析节点的频率数据。
定义一个函数checkSilence,获取频率数据并计算平均值。
将平均值转换为分贝值,并与静音阈值进行比较。
如果低于阈值,启动静音定时器,超过延迟时间则停止录音。
如果高于阈值,清除静音定时器。
使用requestAnimationFrame循环调用checkSilence函数。

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值