Table of Contents:

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

pyttsx3 是一个基于 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