程序三:音频数据转wav文件
完整工程文件:
链接:https://pan.baidu.com/s/1dcoTGhIeDxsRz-RUr2Paxw
提取码:jy48
一:需求分析
文本音频数据转wav文件,并进行测试
txt2wav -i wavtxt.txt -o yyy.wav -rate 16000 -depth 16
将本地的采样数据.txt读出,重新生成wav文件,需要考虑单声道和双声道
二:参考知识
1.所需文件知识
本地.txt信息
lanTian2.txt lanTian2.wav的采样值
BAC009S0003W0121.txt BAC009S0003W0121.wav的采样值
语音信息
lanTian.mav 声道数1 采样率8000 量化位数2
lanTian2.mav 声道数2 采样率16000 量化位数2
BAC009S0003W0121.wav 声道数1 采样率16000 量化位数2
2.sys 模块
在 Python 中,sys 模块是一个非常常用且十分重要的模块,通过模块中的 sys.argv 就可以访问到所有的命令行参数,它的返回值是包含所有命令行参数的列表(list),
参数个数: len(sys.argv)
脚本名: sys.argv[0]
参数1: sys.argv[1]
参数2: sys.argv[2]
三:python代码
holiday03.py
import wave
import numpy as np
import sys
import getopt
def main(argv):
try:
opts, args = getopt.getopt(argv, "hi:o:r:d:c:", ["help", "input=", "output=","rate=","depth=","channel="])
except getopt.GetoptError:
print('Error: python holiday03.py -i wavData(all).txt -o Intro02.wav -r 16000 -d 2 -c 2')
print(' or: python holiday03.py -i wavData(all).txt -o Intro02.wav --rate=16000 --depth=2 --channel=2')
sys.exit(2)
# 处理 返回值options是以元组为元素的列表。
for opt, arg in opts:
if opt in ("-h", "--help"):
print("为真实还原,输入的参数尽量和原语音一致")
print('python holiday03.py -i wavData(all).txt -o Intro02.wav -r 16000 -d 2 -c 2')
print('or: python tholiday03.py -i wavData(all).txt -o Intro02.wav --rate=16000 --depth=2 --channel=2')
sys.exit()
elif opt in ("-i", "--input"):
input = arg
elif opt in ("-o", "--output"):
output = arg
elif opt in ("-r", "--rate"):
rate = arg
rate=int(rate)
elif opt in ("-d", "--depth"):
depth = arg
depth = int(depth)
elif opt in ("-c", "--channel"):
channel = int(arg)
# wavData(all).txt
# wavData(single).txt
# https://blog.csdn.net/qq_35451572/article/details/79663356
f = open(input)
line = f.readline()
data_list = []
while line:
#把切分出的列表的每个值, 把它们转成np.short型, 并返回迭代器
num = list(map(np.short, line.split())) # np.short
#用list函数把map函数返回的迭代器遍历展开成一个列表
data_list.append(num)
line = f.readline()
f.close()
wave_data = np.array(data_list)
# 打开WAV文档
f = wave.open(output, "wb")
# 配置声道数、量化位数和取样频率
f.setnchannels(channel) # 配置声道数
f.setsampwidth(depth) # 配置量化位数
#f.setframerate(framerate) # 配置取样频率
f.setframerate(rate) # 配置取样频率
# f.setnframes(38000)
# 将wav_data转换为二进制数据写入文件
f.writeframes(wave_data.tostring())
f.close()
if __name__ == "__main__":
# sys.argv[1:]为要处理的参数列表,sys.argv[0]为脚本名,所以用sys.argv[1:]过滤掉脚本名。
main(sys.argv[1:])
#python holiday03.py -i lanTian2.txt -o lanTian2(还原).wav -r 16000 -d 2 -c 2
#python holiday03.py -i BAC009S0003W0121.txt -o BAC009S0003W0121(还原).wav -r 16000 -d 2 -c 1
四:实现结果
1.请求帮助
python holiday03.py -h
2.单声道语音还原
python holiday03.py -i BAC009S0003W0121.txt -o BAC009S0003W0121(还原).wav -r 16000 -d 2 -c 1
3.双声道语音还原
python holiday03.py -i lanTian2.txt -o lanTian2(还原).wav -r 16000 -d 2 -c 2
五:结果对比
还原
python holiday03.py -i lanTian2.txt -o lanTian2(还原).wav -r 16000 -d 2 -c 2
五:结果对比
将还原的语音跟以前的语音播放对比,结果为一致