跳转至

语音合成

语音合成,也被称为文语转换(Text to Speech,TTS),是一种将文本信息转换为自然流畅语音的技术。

原理

  • 基于规则:早期的语音合成技术常基于规则,语言学家和声学专家会制定一系列规则,包括对文本进行分词、词性标注、韵律分析等,然后根据这些规则将文本转换为对应的语音参数,再通过语音合成器生成语音。
  • 统计建模:随着技术发展,统计建模方法如隐马尔可夫模型(HMM)被广泛应用。该方法通过对大量语音数据的学习,建立起文本特征与语音特征之间的统计关系,从而根据输入文本生成相应语音。
  • 深度学习:当下,深度学习在语音合成领域占据主导地位。如 WaveNet、Tacotron 等模型,能够直接从文本中学习到丰富的语音特征表示,生成更加自然、流畅的语音。这些模型可以自动捕捉文本中的语义、语法和韵律等信息,进而合成高质量的语音。

运行实例

OriginMan使用到的TTS实现方式是通过大模型网关技术,将文本给到大模型网关,通过网关模型进行音频数据合成。

基于python

首先可以使用一个Python示例体验一下TTS。

cd /userdata/dev_ws/src/originman/originman_pydemo/audio
python3 audio_gengerator.py --txt "我是originman,一个帅气 的智能人形机器人" --output "originman.wav"

此时将会看到如下终端信息:

root@ubuntu:/userdata/dev_ws/src/originman/originman_pydemo/audio# python3 audio_gengerator.py --txt "我是originman,一个帅气 的智能人形机器人" --output "originman.wav"
2025-02-28 12:35:11,921 - INFO - Text-to-Speech initialized.
2025-02-28 12:35:11,921 - INFO - Received command-line text: '我是originman,一个帅气 的智能人形机器人'
2025-02-28 12:35:11,923 - INFO - Text split into 1 sentences
2025-02-28 12:35:11,925 - INFO - Synthesizing text: '我是originman,一个帅气 的智能人形机器人。'
2025-02-28 12:35:12,303 - INFO - Websocket connected
2025-02-28 12:35:14,489 - INFO - Audio saved to: originman.wav
2025-02-28 12:35:14,490 - INFO - Playing segment 1
2025-02-28 12:35:18,719 - INFO - All audio segments played
2025-02-28 12:35:18,720 - INFO - Last spoken text updated to: '我是originman,一个帅气 的智能人形机器人'
2025-02-28 12:35:18,723 - INFO - Last spoken text: '我是originman,一个帅气 的智能人形机器人'

其中 --txt 后接的内容即为文本转音频的数据,--output 后为合成音频后的数据。也可以不添加参数执行,即为终端输入文本,而后持续生成音频。

python3 audio_gengerator.py 
运行后即可在终端输入你想OriginMan说的内容!

root@ubuntu:/userdata/dev_ws/src/originman/originman_pydemo/audio# python3 audio_gengerator.py 
2025-02-28 12:38:04,677 - INFO - Text-to-Speech initialized.
2025-02-28 12:38:04,677 - INFO - Entering interactive mode. Enter text and press Enter to generate speech.
2025-02-28 12:38:04,678 - INFO - Press Ctrl+C to exit.
Enter text to synthesize (Ctrl+C to exit): 你好
2025-02-28 12:38:06,546 - INFO - Received input: '你好'
2025-02-28 12:38:06,548 - INFO - Text split into 1 sentences
2025-02-28 12:38:06,549 - INFO - Synthesizing text: '你好。'
2025-02-28 12:38:06,928 - INFO - Websocket connected
2025-02-28 12:38:07,762 - INFO - Playing segment 1
2025-02-28 12:38:08,358 - INFO - All audio segments played
2025-02-28 12:38:08,359 - INFO - Last spoken text updated to: '你好'

基于ROS2话题

既然可以使用Python实现,那必然可以用ROS2实现啦! 同时可以支持使用话题发布希望说的文本数据。

打开一个终端,执行以下指令:

ros2 run originman_llm_chat text_to_speech_node

此时可以看到log中输出相关的使用日志示例:

root@ubuntu:/userdata/dev_ws/src/originman/originman_pydemo/audio# ros2 run originman_llm_chat text_to_speech_node 
[INFO] [1740717712.694830884] [text_to_speech_node]: 使用示例:ros2 topic pub /tts_input std_msgs/msg/String "data: '请告诉我今天的天气。'"
[INFO] [1740717712.697192923] [text_to_speech_node]: 文本转语音节点已启动,等待输入/tts_input话题数据...

另外打开一个终端,输入提示内容

ros2 topic pub /tts_input std_msgs/msg/String "data: '请告诉我今天的天气。'"

image-20220923124819442

Attention

需要先完成联网操作,联网步骤请参考网络配置与远程开发方法

图片1