Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
xiaoxiaoqian1217 opened this issue Dec 21, 2023 · 9 comments
Open

Comments

@xiaoxiaoqian1217
Copy link

1.后端返回以base64编码pcm,需要加上wav头
base64编码如下: cGfDuaDjtrnQBoa5cGSWuVCLl7lwTpi5cI+juRDhrbngd6S5sG+3uTCk0rkwM9S5APf....
2. 先转成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
Copy link
Owner

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

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

@xiaoxiaoqian1217
Copy link
Author

自行检查音频内容是否是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
Copy link
Owner

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

@xiaoxiaoqian1217
Copy link
Author

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

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

@xiangyuecn
Copy link
Owner

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

@xiaoxiaoqian1217
Copy link
Author

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

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

@xiangyuecn
Copy link
Owner

@xiaoxiaoqian1217
Copy link
Author

xiaoxiaoqian1217 commented Dec 22, 2023

image

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

@xiaoxiaoqian1217
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants