.. _py_tts:
16. TTS(文本转语音)
==============================================
本示例演示如何使用 TTS(文本转语音)模块让 PiCrawler 说话。
支持两种引擎:\ **Piper**\ (高质量神经 TTS)和\ **Espeak**\ (轻量级经典 TTS)。
输入任意文本,机器人将朗读出来。
**运行代码**
.. raw:: html
.. code-block::
cd ~/picrawler/examples
sudo python3 16_tts.py
程序运行后,将显示引擎类型和模型。输入任意句子并按 **Enter** —— 机器人将
朗读它。输入 ``quit`` 退出,或按\ **Ctrl+C**\ 。
**代码**
.. note::
您可以**修改/重置/复制/运行/停止**\ 以下代码。但在此之前,您需要进入源代码
路径,如 ``picrawler\examples``。修改代码后,可以直接运行以查看效果。
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from robot_hat.tts import Piper, Espeak
# 使用 robot_hat TTS 模块的文本转语音演示
# 按 Ctrl+C 退出
# 设置 USE_PIPER=True 使用高质量神经 TTS(Piper),False 使用 Espeak
USE_PIPER = True
# Piper 模型:"en_US-ryan-low"(英语),"zh_CN-huayan-x_low"(中文)
TTS_MODEL = "zh_CN-huayan-x_low"
def main():
print("=== PiCrawler 文本转语音演示 ===")
if USE_PIPER:
print(f"引擎:Piper ({TTS_MODEL})")
tts = Piper(model=TTS_MODEL)
else:
print("引擎:Espeak")
tts = Espeak()
print("输入要朗读的文本,或输入 'quit' 退出")
print()
try:
while True:
text = input("要朗读的文本:").strip()
if text.lower() == 'quit':
break
if text:
print(f"正在朗读:{text}")
tts.say(text)
except KeyboardInterrupt:
print("\n正在退出...")
if __name__ == "__main__":
main()
**工作原理**
#. 两种可用的 TTS 引擎
.. code-block:: python
from robot_hat.tts import Piper, Espeak
``robot_hat`` 包提供两种 TTS 引擎:
- **Piper**\ :基于神经网络的引擎,产生自然、高质量的语音。需要语音模型文件。
- **Espeak**\ :轻量级、基于规则的引擎,在最小资源下运行。
#. 选择引擎和模型
.. code-block:: python
USE_PIPER = True
TTS_MODEL = "zh_CN-huayan-x_low"
将 ``USE_PIPER`` 设为 ``True`` 使用 Piper,或设为 ``False`` 使用 Espeak。
使用 Piper 时,``TTS_MODEL`` 选择语音。常用模型:
- ``"en_US-ryan-low"`` — 美式英语男声
- ``"zh_CN-huayan-x_low"`` — 中文女声
#. 创建 TTS 实例
.. code-block:: python
if USE_PIPER:
tts = Piper(model=TTS_MODEL)
else:
tts = Espeak()
根据 ``USE_PIPER`` 标志,实例化相应的引擎。两个引擎共享相同的 ``say()``
接口,因此切换引擎不需要其他代码更改。
#. 输入循环
.. code-block:: python
while True:
text = input("要朗读的文本:").strip()
if text.lower() == 'quit':
break
if text:
print(f"正在朗读:{text}")
tts.say(text)
程序提示您输入文本:
- 输入任意句子并按 **Enter** 让机器人朗读。
- 输入 ``quit`` 退出循环。
- 随时按 **Ctrl+C** 中断。
#. 与 STT 的对比
本课是 :ref:`py_stt` 的配套内容。STT(语音识别)和 TTS(语音合成)
共同构成 PiCrawler 语音接口的输入和输出部分。