Table of Contents:

python中使用TTS

pyttsx3 是一个用于文本到语音转换的 Python 库。它允许你将文字转化为语音,并播放出来。

pyttsx3 是一个基于SAPI5、 ESpeak 和 NSSpeechSynthesizer 的 Python 包装器,用于实现文本到语音的转换。底层的工作原理取决于系统和平台,因为它使用了系统中可用的文本到语音引擎。

以下是 pyttsx3 在不同平台上的工作原理:

  1. Windows:
    • 在 Windows 上,pyttsx3 使用了 SAPI5(Speech API 5),这是 Windows 提供的本地语音合成引擎。
    • pyttsx3 利用 Python 的 ctypes 模块调用 Windows 上的 SAPI5 接口。
  2. Linux:
    • 在 Linux 上,pyttsx3 使用了 eSpeak,这是一个开源的文本到语音引擎。 pyttsx3会通过_dlopen打开 libespeak.so来调用语音合成的功能。
    • 通过 subprocess 模块调用 eSpeak 的命令行工具。
  3. macOS:
    • 在 macOS 上,pyttsx3 使用了 NSSpeechSynthesizer,这是 macOS 提供的语音合成引擎。
    • 通过 AppKit 框架调用 Objective-C 接口。

在每种情况下,pyttsx3 通过调用底层系统的语音合成引擎来实现文本到语音的转换。这样的设计使得 pyttsx3 能够适应不同平台,并使用各个系统上可用的最佳语音合成引擎。

深度学习在语音合成领域也有应用,例如 Tacotron 和 WaveNet 等模型,它们能够生成更自然和高质量的语音。然而,pyttsx3 并不使用这些深度学习模型,而是依赖于本地系统提供的传统的 TTS 引擎。深度学习实现通常需要大量的训练数据和计算资源,而传统的规则和合成方法在一些场景中仍然能够提供良好的效果。

python代码中的使用的报错

import pyttsx3
import soundcard        # 加上这一行就会报错,去掉没事儿

def text_to_speech(text):
    engine = pyttsx3.init()
    engine.say(text)
    engine.runAndWait()

text_to_speech("hello 你好")

报错内容如下:

Traceback (most recent call last):
  File "D:\program\pven\ship-command\Lib\site-packages\pyttsx3\__init__.py", line 20, in init
    eng = _activeEngines[driverName]
          ~~~~~~~~~~~~~~^^^^^^^^^^^^
  File "D:\program\Python311\Lib\weakref.py", line 136, in __getitem__
    o = self.data[key]()
        ~~~~~~~~~^^^^^
KeyError: None

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "d:\project\python\ship-command\test.py", line 10, in <module>
    text_to_speech("hello 你好")
  File "d:\project\python\ship-command\test.py", line 6, in text_to_speech
    engine = pyttsx3.init()
             ^^^^^^^^^^^^^^
  File "D:\program\pven\ship-command\Lib\site-packages\pyttsx3\__init__.py", line 22, in init
    eng = Engine(driverName, debug)
          ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\program\pven\ship-command\Lib\site-packages\pyttsx3\engine.py", line 30, in __init__
    self.proxy = driver.DriverProxy(weakref.proxy(self), driverName, debug)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\program\pven\ship-command\Lib\site-packages\pyttsx3\driver.py", line 50, in __init__
    self._module = importlib.import_module(name)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\program\Python311\Lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1206, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1178, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 940, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "D:\program\pven\ship-command\Lib\site-packages\pyttsx3\drivers\sapi5.py", line 1, in <module>
    import comtypes.client  # Importing comtypes.client will make the gen subpackage
    ^^^^^^^^^^^^^^^^^^^^^^
  File "D:\program\pven\ship-command\Lib\site-packages\comtypes\__init__.py", line 232, in <module>
    CoInitializeEx()
  File "D:\program\pven\ship-command\Lib\site-packages\comtypes\__init__.py", line 223, in CoInitializeEx
    _ole32.CoInitializeEx(None, flags)
  File "_ctypes/callproc.c", line 1000, in GetResult
OSError: [WinError -2147417850] 无法在设置线程模式后对其加以更改。

解决

pip uninstall pyttsx3
pip install pyttsx3==2.71

Qt中使用TTS

Qt的语音合成模块

linux下首先下载tts的动态库

sudo apt-get install  libqt5texttospeech5 libqt5texttospeech5-dev

源码位置;Qt5.12.12\5.12.12\Src\qtspeech\src\tts

其次再下载qt tts的插件

sudo apt-get install  qtspeech5-speechd-plugin

源码位置;Qt5.12.12\5.12.12\Src\qtspeech\src\plugins\tts

为什么要用动态库+插件的形式?
因为不同平台下的语音合成的实现方式不同,故Qt要提供一个统一的接口给用户,而不同平台的实现对应着一个插件
- windows对应的是 qtexttospeech_sapi.dll, 调用的是 sapi
- linux下对应的是nqtspeech5-speechd-plugin, 调用的是 speechdispatcher 服务提供的接口

插件动态库所在的目录为: plugins\texttospeech

tts引擎

espeak

sudo apt-get install  espeak  espeak-data  # espeak-data是其对应的各种语言的语言包

问题:espeak自带了中文语音库,但是运行Qt提供的官方的语音识别的例子的时候,可以识别出中文地区和地区对应的不同语音,但是不同的音乐都不能生成中文

espeak-ng

espeak-ng, 是espeak的下一代,ng:next generation, espeak不咋维护了,espeak-ng接手,是espeak的改进版

sudo apt-get install espeak-ng espeak-ng-data

检查 espeak、espeak-ng 是否支持中文
首先,确认你的 espeak-ng 是否已经支持中文。你可以通过以下命令检查:

espeak-ng --voices | grep zh

你应该能够看到类似以下的输出:

5  zh          chinese           中文

问题
1. espeak-ng默认版本没有带有中文语言包,需要下载源码,开启带中文的编译选项,程序才能支持中文
2. espeak-ng程序支持中文没问题,但是在Qt的示例程序中,连中文地区也识别不了

Speech Dispatcher

在 Ubuntu 系统中,Speech Dispatcher 是一个用于管理和提供语音合成服务的中间件。它允许多个应用程序通过统一的接口访问语音合成功能,并与不同的 TTS(文本转语音)引擎进行通信,如 espeak-ngFestival 等。Speech Dispatcher 提供了一个抽象层,应用程序可以通过它来调用不同的语音引擎,而不需要直接处理各个引擎的具体实现细节。

下载对应引擎的插件,如espeak、espeak-ng插件
espeak插件

sudo apt install  speech-dispatcher-espeak

espeak-ng插件

sudo apt install  speech-dispatcher-espeak-ng