跳转至

文字转语音

点击这里,边看视频讲解,边学习以下内容

edge-tts 库

最近(2023年3月)发现一个 Python 的 edge-tts 库, 可以用来实现文本转语音操作。

这个库使用的是: 微软 edge 浏览器使用的 文字转语音引擎

安装

执行如下命令即可安装 edge-tts python 库

pip3 install edge-tts

使用

安装好后,就可以调用 命令 执行语音转化,比如

edge-tts --text "自动化测试第2步,需要您手机微信扫码登录,成功后,请按回车继续" --write-media d:\byhy\1.mp3 --voice zh-CN-YunxiNeural


其中

--text 参数 指明保存的mp3文件路径。

--write-media 参数 指明保存的mp3文件路径。


--voice zh-CN-YunjianNeural 指明了使用哪种 语言和风格的 发音人

系统中可以使用的 发音人 可以通过命令 edge-tts --list-voices 查看。


如果我们要转化的文本内容很长,通常是保存内容到文件,然后通过 -f 参数 指明转换文件

edge-tts -f "d:\byhy\xy.txt" --write-media "d:\byhy\xy.mp3" --voice zh-CN-YunxiNeural


可以通过参数 --rate 来调整语速,比如

edge-tts -f "d:\byhy\xy.txt" --write-media "d:\byhy\xy.mp3" --voice zh-CN-YunxiNeural --rate=-50%


这里, --rate=-50% 让语速变慢了 50%

如果想加快语速可以使用加号,比如 --rate=+50%

开发批量转化程序

我们可以使用这个功能开发 批量转化文件 为mp3,实现听书功能。

参考代码如下

VOICE = "zh-CN-YunjianNeural"

from PySide2 import QtWidgets
import os

class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        btn_chooseFolder = QtWidgets.QPushButton('选择目录', self)
        btn_chooseFolder.setFixedSize(100,25)
        self.label_path = QtWidgets.QLabel('', self)
        self.folderPath = ''
        btn_run = QtWidgets.QPushButton('开始', self)
        btn_run.setFixedSize(60,25)

        # 创建一个水平layout作为内部layout
        hl = QtWidgets.QHBoxLayout()
        hl.addWidget(btn_chooseFolder)
        hl.addWidget(self.label_path)
        hl.addWidget(btn_run)

        self.textEdit = QtWidgets.QPlainTextEdit(self)   

        # 创建上级layout
        layout = QtWidgets.QVBoxLayout()      
        # 添加 子layout
        layout.addLayout(hl)
        # 添加内部控件
        layout.addWidget(self.textEdit)  

        # 指定容器控件自身使用的layout
        self.setLayout(layout)

        # 注册按钮点击处理
        btn_chooseFolder.clicked.connect(self.chooseFolder)
        btn_run.clicked.connect(self.run)

    def chooseFolder(self):

        filePath = QtWidgets.QFileDialog.getExistingDirectory(self, "选择文件所在目录")
        self.label_path.setText(filePath)
        self.folderPath = filePath

    def run(self):
        for (dirpath, dirnames, filenames) in os.walk(self.folderPath):
            for fn in filenames:
                # 把 dirpath 和 每个文件名拼接起来 就是全路径
                fpath = os.path.join(dirpath, fn)
                self.textEdit.appendPlainText(fpath+'\n')

                mp3Path = os.path.join(dirpath, fn.replace('.txt','.mp3'))
                cmd = f'edge-tts --voice {VOICE} -f "{fpath}" --write-media "{mp3Path}"'
                print(cmd)
                os.system(cmd)


app = QtWidgets.QApplication([])
window = Window()
window.resize(400, 200)
window.show()
app.exec_()