主要功能
主要实现将文本音频数据转为wav文件。
通过我上一个博客的python编程读取wav文件数据得到的txt格式音频数据,再通过此程序实现将之前的文本音频数据再还原为wav语音文件。
程序
程序主要由命令行读入参数和将数据文件转化成合成语音文件所需的数据格式。以及设置采样率,声道数,采样深度等,再合成语音文件。
#文本数据文件转为.wav语音文件import numpy as npimport sysimport wave #语音文件处理包import getoptdef main(argv): #定义一个函数try: #首先执行try后的程序,如果输入格式不对,则执行except getopt.GetoptError:后的程序opts, args = getopt.getopt(argv[1:], "i:o:r:d:c:h", ["input", "output","rate=","depth=","channel=","help"])except getopt.GetoptError:print('输入格式错误,应该输入:python txt2wav.py -i text2.txt -o txt2wav.wav -r 16000 -d 2 -c 2\n或者输入格式为:python txt2wav.py -i text2.txt -o txt2wav.wav --rate=16000 --depth=2 --channel=2')#print(' or: python holiday03.py -i wavData(all).txt -o Intro02.wav --rate=16000 --depth=2 --channel=2')sys.exit()for opt, arg in opts:if opt in ("-h", "--help"): #打印帮助print("输入格式为:")print('python txt2wav.py -i text2.txt -o txt2wav.wav -r 16000 -d 2 -c 2')print('或者为:python txt2wav.py -i text2.txt -o txt2wav.wav --rate=16000 --depth=2 --channel=2')print("其中txt2wav.py为程序文件,text2.txt为采用语音转数据得到的语音数据文件,\ntxt2wav.wav为要转为的语音文件名称,-r或--rate代表采样率,-d或者--depth代表采样深度,-c或者--channel代表声道数")sys.exit()elif opt in ("-i", "--input"): #输入为txt数据文件input = argelif opt in ("-o", "--output"): #输出为wav语音文件output = argelif opt in ("-r", "--rate"):#输入的采样频率rate = argrate=int(rate)elif opt in ("-d", "--depth"): #输入的量化位数depth = argdepth = int(depth)elif opt in ("-c", "--channel"): #输入的声道数channel = argchannel = int(channel)'''f = open(input)data_lists = f.readlines() # 读出的是str类型dataset = []# 对每一行作循环for data in data_lists:data1 = data.strip('\n') # 去掉开头和结尾的换行符data2 = data1.split('\t') # 把tab作为间隔符dataset.append(data2) # 把这一行的结果作为元素加入列表datasetf.close()wave_data = np.array(dataset)'''f = open(input) #打开输入文件'''long = f.readlines() #一次性读取文件所有行linenumber = len(long)print("文件行数(即采样点数):",linenumber + 1)'''print("声道数:",channel)print("量化位数:",depth)print("采样频率:", rate)line = f.readline() # 每次读出txt文件中的一行内容data = [] #初始化一个空矩阵i=0while line: #当未读到文件最后时num = list(map(np.short,line.split())) # 用list函数把map函数返回的迭代器遍历展开成一个列表,map(np.short, line.split())表示把切分出的列表的每个值,把它们转成short型,并返回迭代器data.append(num) #将从文件中读到的数据放入列表的两个中括号之间i = i+1line = f.readline()f.close()wavdata = np.array(data) # 将列表数据转换成数组print("文件行数(即采样点数):",i)f = wave.open(output, "wb") #新建并打开wav文件# 配置声道数、量化位数和采样频率f.setnchannels(channel) # 配置声道数f.setsampwidth(depth) # 配置量化位数f.setframerate(rate) # 配置采样频率f.writeframes(wavdata.tostring()) # 将wav_data转换为二进制数据写入文件f.close()if __name__ == "__main__":# sys.argv[1:]为要处理的参数列表,sys.argv[0]为脚本名,所以用sys.argv[1:]过滤掉脚本名。main(sys.argv)#运行的命令行#python txt2wav.py -i text3.txt -o test3(还原).wav -r 16000 -d 2 -c 1#python txt2wav.py -i text2.txt -o test2(还原).wav -r 16000 -d 2 -c 2#python txt2wav.py -i English.txt -o English(还原).wav -r 44100 -d 2 -c 1
运行
1 帮助文档:
python txt2wav.py -h
结果
输入格式为:python txt2wav.py -i text2.txt -o txt2wav.wav -r 16000 -d 2 -c 2或者为:python txt2wav.py -i text2.txt -o txt2wav.wav --rate=16000 --depth=2 --channel=2其中txt2wav.py为程序文件,text2.txt为采用语音转数据得到的语音数据文件,txt2wav.wav为要转为的语音文件名称,-r或--rate代表采样率,-d或者--depth代表采样深度,-c或者--channel代表声道数
2 语音数据转语音文件
python txt2wav.py -i text2.txt -o test2(还原).wav -r 16000 -d 2 -c 2
其中text2.txt
代表语音数据test2(还原).wav
代表还原的语音文件-r
代表采样率,-d
代表采样深度,-c
代表声道数。
"蓝天白云"数据转语音结果
另一种运行方式:
python txt2wav.py -i text2.txt -o test2(还原).wav --rate 16000 --depth 2 --channel 2
结果:
3 "英文发音"数据文件转语音文件
python txt2wav.py -i English.txt -o English(还原).wav -r 44100 -d 2 -c 1
结果
将还原得到的语音wav文件再通过我上一个博客写的程序python编程读取wav文件数据
,对比原语音wav文件转为txt数据文件的结果,同时采用人耳听声音的方式,对比两个语音文件,发现无差别,可知结果正确。