golang实现音频文件pcm转wav格式

该博客讲述了在处理腾讯TTS接口限制时,如何将超过110个字的文章拆分并转换为PCM音频,然后通过添加文件头转化为WAV格式以便播放和拼接。在转化过程中,由于PCM格式没有文件头导致无法播放,通过手动添加RIFF/WAVE文件头解决了这个问题,实现了长文本的音频合成。
摘要由CSDN通过智能技术生成

背景:公司有个文章转语音的需求,调用的是腾讯的tts接口,但是接口有限制,每次只能请求110个字,文章字数有800字以上,所以开始采用的是字符串拆分,分别请求,返回的base64音频直接拼接,浏览器可以正常播放,但此时有个问题,下载下来只有一段;原因是tts接口返回mp3格式的时候会带有文件头,不能直接拼接

解决方案:
返回pcm格式的音频(这个是不带文件头的),然后拼接。
但是pcm格式的音频无法播放,需要转化成可播放的音频格式,这里转的是wav格式。
代码如下:

/**
dst:二进制字符串
numchannel:1=单声道,2=多声道
saplerate:采样率 8000/16000
*/
func PcmToWav(dst string, numchannel int, saplerate int) (resDst string) {
	byteDst := []byte(dst)
	longSampleRate := saplerate
	byteRate := 16 * saplerate * numchannel / 8
	totalAudioLen := len(byteDst)
	totalDataLen := totalAudioLen + 36
	var header = make([]byte, 44)
	// RIFF/WAVE header
	header[0] = 'R'
	header[1] = 'I'
	header[2] = 'F'
	header[3] = 'F'
	header[4] = byte(totalDataLen & 0xff)
	header[5] = byte((totalDataLen >> 8) & 0xff)
	header[6] = byte((totalDataLen >> 16) & 0xff)
	header[7] = byte((totalDataLen >> 24) & 0xff)
	//WAVE
	header[8] = 'W'
	header[9] = 'A'
	header[10] = 'V'
	header[11] = 'E'
	// 'fmt ' chunk
	header[12] = 'f'
	header[13] = 'm'
	header[14] = 't'
	header[15] = ' '
	// 4 bytes: size of 'fmt ' chunk
	header[16] = 16
	header[17] = 0
	header[18] = 0
	header[19] = 0
	// format = 1
	header[20] = 1
	header[21] = 0
	header[22] = byte(numchannel)
	header[23] = 0
	header[24] = byte(longSampleRate & 0xff)
	header[25] = byte((longSampleRate >> 8) & 0xff)
	header[26] = byte((longSampleRate >> 16) & 0xff)
	header[27] = byte((longSampleRate >> 24) & 0xff)
	header[28] = byte(byteRate & 0xff)
	header[29] = byte((byteRate >> 8) & 0xff)
	header[30] = byte((byteRate >> 16) & 0xff)
	header[31] = byte((byteRate >> 24) & 0xff)
	// block align
	header[32] = byte(2 * 16 / 8)
	header[33] = 0
	// bits per sample
	header[34] = 16
	header[35] = 0
	//data
	header[36] = 'd'
	header[37] = 'a'
	header[38] = 't'
	header[39] = 'a'
	header[40] = byte(totalAudioLen & 0xff)
	header[41] = byte((totalAudioLen >> 8) & 0xff)
	header[42] = byte((totalAudioLen >> 16) & 0xff)
	header[43] = byte((totalAudioLen >> 24) & 0xff)

	headerDst := string(header)
	resDst = headerDst + dst
	return
}

实际上pcm格式的文件无法播放的原因就是没有文件头,这里转化操作就是给它拼上一个文件头。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值