仓库源文站点原文


layout: post comments: true title: 自制TTS引擎第0.01步-Python实现拼接单字wav文件 description: date: 2019-10-07 00:00:00 -0700

categories: 命名 Python

2019-10-07_audacity

一些参考资料在: 怎样自己做一个tts引擎?

演示(文本源自小学一年级课文): Python实现wav文件合并演示1: 我是中国人​ Python实现拼接wav文件演示: 我是小学生​

尚未找到开源和成熟的中文TTS引擎, 于是先自己摸索一下. 实现思路很原始, 自己读一系列单字, 用Audacity录成wav文件. 再写个Python脚本, 将输入文本中的单字对应的wav文件进行直接拼接生成新wav文件.

源码和单字音频资源在: wav文件处理/合成.py

import wave

# 参考: https://blog.csdn.net/qq_39516859/article/details/79819276
def 从wav文件读取信息(文件名):
    #打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据。
    文件 = wave.open(文件名,"rb")
    #读取格式信息
    帧数 = 文件.getnframes()
    信息 = {
        "帧": 文件.readframes(帧数),
        "频道数": 文件.getnchannels(),
        "量化位数": 文件.getsampwidth(),
        "帧速": 文件.getframerate()
    }
    文件.close()
    return 信息

# 参考: https://blog.csdn.net/zzZ_CMing/article/details/81739193
def 合成(文字):
    帧 = b''
    格式信息 = {}
    for 字 in 文字:
        # TODO: 多系统/
        格式信息 = 从wav文件读取信息("单字/" + 字 + ".wav")
        帧 += 格式信息["帧"]

    文件 = wave.open("输出/" + 文字 + ".wav", 'wb')
    文件.setnchannels(格式信息["频道数"])
    文件.setsampwidth(格式信息["量化位数"])
    文件.setframerate(格式信息["帧速"])
    文件.writeframes(帧)
    文件.close()

    print("*"*10, "合成结束\n")

合成("我是中国人")
合成("我是小学生")

待改进