xiangyuecn / Recorder

html5 js 录音 mp3 wav ogg webm amr g711a g711u 格式,支持pc和Android、iOS部分浏览器、Hybrid App(提供Android iOS App源码)、微信,提供ASR语音识别转文字 H5版语音通话聊天示例 DTMF编码解码
https://xiangyuecn.github.io/Recorder/
MIT License
4.59k stars 1.01k forks source link

以base64编码的PCM音频流转成wav播放后都是噪音 #204

Open xiaoxiaoqian1217 opened 6 months ago

xiaoxiaoqian1217 commented 6 months ago

1.后端返回以base64编码pcm,需要加上wav头 base64编码如下: cGfDuaDjtrnQBoa5cGSWuVCLl7lwTpi5cI+juRDhrbngd6S5sG+3uTCk0rkwM9S5APf....

  1. 先转成blob文件对象

    function base64ToBlob(base64String: string, mimeType: string) {
        const byteChars = window.atob(base64String);
        const byteArray = new Uint8Array(byteChars.length);
        for (let i = 0; i < byteChars.length; i++) {
            byteArray[i] = byteChars.charCodeAt(i);
        }
        return new Blob([byteArray], { type: mimeType })
    
    }

    3.使用pcm2wav方法

    Recorder.pcm2wav({ sampleRate: 16000, bitRate: 16, blob: base64ToBlob(`${res.wav_raw_data}`, "audio/pcm") }, function (wavBlob, duration) {
                audioInfo.wav_raw_data = URL.createObjectURL(wavBlob)
            })

    4.生成了音频文件播放是噪音 image

请教一下大佬,不知道是哪里使用出了问题,一直没解决,大佬帮忙看下

xiangyuecn commented 6 months ago

自行检查音频内容是否是16位pcm,把base64保存起来,解码成二进制文件

拖进页面播放测试,8位 16位参数都试试 https://xiangyuecn.gitee.io/recorder/assets/工具-裸PCM转WAV播放测试.html

xiaoxiaoqian1217 commented 6 months ago

自行检查音频内容是否是16位pcm,把base64保存起来,解码成二进制文件

拖进页面播放测试,8位 16位参数都试试 https://xiangyuecn.gitee.io/recorder/assets/工具-裸PCM转WAV播放测试.html

感谢感谢,按照你说的解码成了二进制文件,拖进页面播放可以朗读出文字,之前是完全朗读不出来, 下面是我保存成文件测试的代码

function saveBase64AsFile(base64Str, fileName) {
        const byteChars = atob(base64Str);
        const byteNums = new Array(byteChars.length);
        for (let i = 0; i < byteChars.length; i++) {
            byteNums[i] = byteChars.charCodeAt(i);
        }
        const byteArray = new Uint8Array(byteNums);
        const file = new File([byteArray], fileName, { type: 'audio/octet-stream' });
        // 保存文件
        saveFile(file);
    }

image 看起来测试是成功的, 不知道是我代码哪里写的有问题

xiangyuecn commented 6 months ago

不支持双声道,简单点把 每4个字节 去掉后两个字节 转成单声道

xiaoxiaoqian1217 commented 6 months ago

不支持双声道,简单点把 每4个字节 去掉后两个字节 转成单声道

怎么转呀,这个是要算法同事转成单身道还是我们自己转,可以简单给下思路吗

xiangyuecn commented 6 months ago

1 1 2 2 1 1 2 2 1 1 2 2 每4个字节,只取前两个字节1 1,后两个字节2 2丢掉

xiaoxiaoqian1217 commented 6 months ago

1 1 2 2 1 1 2 2 1 1 2 2 每4个字节,只取前两个字节1 1,后两个字节2 2丢掉

方便提供下相关JS代码实现dem吗

xiangyuecn commented 6 months ago

https://xiangyuecn.gitee.io/recorder/assets/工具-裸PCM转WAV播放测试.html

这个页面源码里面有

xiaoxiaoqian1217 commented 6 months ago

image

我把采样率改成了44100 ,16bitRate单声道,没有杂音,但是语速特别块,比之前 16000, 16bitRate 双声道 清晰很多,且没有杂音, 不知道能不能调整朗读的语速

xiaoxiaoqian1217 commented 6 months ago

来反馈了,最后找到问题所在了, 算法同事给我返回的base64数据编码的pcm是浮点型的数据, 但是库中使用的是Int16Array操作的pcm,导致播放的音频有电流声, 不知道博主能不能考虑下支持浮点型。