什么是语音合成?

语音合成通常指的是人工产生的语音,这种语音可以模仿人类的语音模式、语调和节奏。它在多种应用中都有使用,包括但不限于:语音助手、读屏软件、自动客服和电子学习平台。

语音合成的基本工作原理:

语音合成系统通常包括以下几个步骤:

  1. 文本分析

    • 预处理:将输入的文本处理成可以被系统理解的格式,可能包括去除无关字符、扩展缩写等。
    • 词法分析:对文本进行分词,识别句子中的单词和标点符号。
    • 语法分析:理解句子结构,包括主语、谓语和宾语等成分,以及它们之间的关系。
    • 语义分析:确定单词的意思和句子的整体意思,以确保语音的正确发音和语调。
    • 排列语音合成单元:确定用于发音的基本语音单位,这些单位可以是音素、音节或词。
  2. 数字信号处理

    • 语音数据库:许多TTS系统有一个包含了许多预录制的语音片段的数据库。
    • 语音合成:根据文本分析的结果,从数据库中选择合适的语音片段,通过数字信号处理技术进行拼接和平滑过渡。
    • 调整语调和节奏:根据分析的语法和语义信息调整语音的高低(基频)和速度,使其听起来更自然。

语音合成的应用:

语音合成技术有广泛的应用场景:

  1. 辅助技术:帮助视力受限或阅读障碍的人士阅读电子文本。
  2. 导航系统:为GPS和地图应用提供语音提示。
  3. 虚拟助手:如苹果的Siri、亚马逊的Alexa、谷歌助手等。
  4. 电话系统:在自动语音应答系统中为用户提供信息。
  5. 电子游戏:为没有配音的角色提供语音。

python中的语言合成库

在Python中,有多个库可以用来进行语音合成。这些库利用不同的技术和平台来生成人声,有的依赖于本地计算机的资源,有的则通过互联网连接到云服务。下面是一些流行的Python语音合成库:

gTTS (Google Text-to-Speech)

gTTS 是一个Python库,它提供了一个接口来连接谷歌的文本转语音服务。它非常简单易用,可以输出多种语言的听起来较为自然的语音。

特点:

- 依赖于互联网连接,因为它使用Google的在线服务

  • 支持多种语言和口音。
  • 可以将生成的语音保存为MP3文件。

安装方式:

可以通过pip来安装gTTS:

pip install gTTS

使用示例:

from gtts import gTTS

tts = gTTS('hello world', lang='en')
tts.save('hello.mp3')

运行程序,可以看到在目录下生成了hello.mp3文件

pyttsx3

pyttsx3 是一个文本到语音转换库,它同样可以用于Python应用中。与gTTS不同,它是一个离线库,不需要网络连接,因为它使用的是本地机器的TTS引擎。

特点:

  • 离线工作,不依赖于网络连接。
  • 跨平台,可以在Windows、macOS和Linux上使用。
  • 允许调整语音的属性,如速度、音量和音调。

安装方式:

可以通过pip来安装pyttsx3:

pip install pyttsx3

使用示例:

import pyttsx3

engine = pyttsx3.init()
engine.say("Hello World")
engine.runAndWait()

SpeechRecognition

虽然SpeechRecognition主要是用于语音识别,但它也可以配合其他库一起使用,来实现文本到语音的功能。例如,它可以与pyttsx3搭配使用,将识别的语音转换为文本,然后再将文本转换回语音。

特点:

  • 提供了对多个语音识别服务的接口,包括Google语音识别、Microsoft Bing Voice Recognition等。
  • 可以用于创建交互式的应用,实现听写和命令响应。

安装方式:

可以通过pip来安装SpeechRecognition:

pip install SpeechRecognition

其他库

除了上述提到的两个最流行的库之外,还有一些其他的库也可以用于语音合成,例如:

  • espeak: 一个多语言的TTS软件,通过命令行接口控制。
  • SAPI:Windows系统上的语音API,可以通过pyttsx3库来访问。

总结

Python的语音合成库提供了多种将文本转换为语音的方法。不同的库有不同的特点和使用场景。例如,gTTS适合需要多语言支持和依赖云服务的应用,而pyttsx3适合需要离线工作和跨平台功能的应用。选择哪个库取决于你的具体需求,以及你的应用是否可以依赖网络连接。

下面我们来重点分析gtts以及pyttsx3的使用

gTTS:谷歌的文本转语音

gTTS是一个接口到Google翻译的文本转语音API的Python库。它非常简单易用,只需要几行代码就可以让你的应用说话。
gTTS库通过其主要的gTTS类为用户提供了一个快速简便的文本到语音的接口。通过savewrite_to_fp方法,用户可以轻松地生成语音并将其保存为文件或者直接写入到数据流中。此外,通过处理语言和语速的选项,用户可以定制化生成的语音,使其满足特定的需求。

使用gTTS

from gtts import gTTS
import os

# 要转换为语音的文本
my_text = "Hello, welcome to the world of Python."

# 选择语言
language = 'en'

# 创建gTTS对象
myobj = gTTS(text=my_text, lang=language, slow=False)

# 保存为mp3文件
myobj.save("welcome.mp3")

# 播放生成的语音
os.system("mpg321 welcome.mp3")

gTTS的优点是它支持多种语言并且输出的语音非常自然。但由于它依赖于外部服务,因此需要互联网连接。

gTTs主要功能函数:

gTTS 类

gTTS库的核心是gTTS类,它负责执行文本到语音的转换。

初始化

当创建一个新的gTTS对象时,可以提供以下参数:

gTTS(text='Hello', lang='en', slow=False, lang_check=True, pre_processor_funcs=[...], tokenizer_func=..., lang_detect_func=...)
  • text: 要转换为语音的字符串。
  • lang: 语音的ISO 639-1语言代码,如en代表英语,es代表西班牙语。
  • slow: 布尔值,标志着语音是以正常速度播放(False)还是以慢速播放(True)。
  • lang_check: 布尔值,指示是否检查提供的语言是否支持。
  • pre_processor_funcs: 预处理函数列表,用于在发出TTS请求之前对文本进行处理。
  • tokenizer_func: 分词函数,用于将文本分割成可以处理的小部分。
  • lang_detect_func: 语言检测函数,用于检查lang参数是否有效。

save 方法

一旦创建了gTTS对象,可以调用save方法将生成的语音保存到文件:

tts = gTTS(text='Hello', lang='en')
tts.save("hello.mp3")
  • 这个方法接受一个文件名,并将合成的语音保存为该文件。

write_to_fp 方法

write_to_fp方法可以将生成的语音写入一个类文件对象中,这对于在不保存为实际文件的情况下处理语音流非常有用:

with open("hello.mp3", "wb") as f:
    tts = gTTS(text='Hello', lang='en')
    tts.write_to_fp(f)
  • 这个方法接受一个打开的文件对象,并且写入合成的语音数据。

其他内部函数

gTTS还包含一些内部函数,用于处理文本、执行HTTP请求以及处理Google TTS API的响应。这些函数通常不需要直接调用,它们在gTTS类的方法中被隐式使用。

异常

gTTS库可能在以下情况下引发异常:

  • 当提供的语言代码不被支持时,会引发ValueError
  • 如果在请求过程中出现问题,比如网络连接问题,将引发requests库的异常,如RequestException

pyttsx3:一个跨平台的文本转语音库

pyttsx3 是一个文本到语音(TTS)转换库,它在 Python 中实现了跨平台的语音合成能力。与依赖于网络连接的 gTTS 不同,pyttsx3 使用计算机的本地语音合成引擎,因此不需要互联网连接即可工作。pyttsx3 支持 Windows、macOS 和 Linux 平台,并能够与它们的本地 TTS 引擎进行交互。

pyttsx3 库用法分析:

初始化引擎

import pyttsx3
engine = pyttsx3.init()

init 函数用于初始化语音合成引擎。它可以选择性地接受一个驱动器名称参数,如果你想使用特定的语音合成器。如果不传递任何参数,它将使用默认的语音合成器。

设置属性

pyttsx3 允许你设置多种语音属性,包括但不限于语速、音量和语音。

engine.setProperty('rate', 150) # 设置语速,以字/分钟为单位
engine.setProperty('volume', 0.9) # 设置音量,范围是0.0到1.0
engine.setProperty('voice', voices[0].id) # 设置语音
  • rate 方法用于设置语音的播放速度。
  • volume 方法用于设置音量水平。
  • voice 方法用于选择特定的语音。在 pyttsx3 中,你可以通过 engine.getProperty('voices') 获取可用的语音列表。

朗读文本

engine.say("Hello, World!")
engine.runAndWait()
  • say 方法将文本放入队列等待播放。你可以多次调用 say 方法来添加更多的文本。
  • runAndWait 方法将实际处理队列中的所有待处理项,并开始语音合成。它会在所有队列中的语音播放完毕前阻塞。

停止和结束

engine.stop()

stop 方法会立即停止所有的语音合成。

事件处理

pyttsx3 支持事件回调,你可以在引擎的特定状态下执行代码。

def onStart(name):
   print('开始说话')

def onWord(name, location, length):
   print('当前单词')

def onEnd(name, completed):
   print('说话完成')

engine.connect('started-utterance', onStart)
engine.connect('started-word', onWord)
engine.connect('finished-utterance', onEnd)
  • connect 方法用于将事件处理函数连接到指定的事件。

获取属性

rate = engine.getProperty('rate') # 获取当前语速
volume = engine.getProperty('volume') # 获取当前音量
voice = engine.getProperty('voice') # 获取当前语音

getProperty 方法用于获取当前的属性值。

保存到文件

engine.save_to_file('Hello World', 'test.mp3')
engine.runAndWait()
  • save_to_file 方法允许你将文本直接保存到音频文件而不是播放。

这些是 pyttsx3 库的一些核心功能,使得它成为一个强大且灵活的工具,适用于需要离线语音合成的各种应用。它特别适合于桌面应用程序,并且可以与用户的操作系统无缝集成。

总结

语音合成技术为我们提供了一种新的与计算机和应用程序交互的方式。通过使用Python,我们可以轻松地将这项技术集成到我们的项目中。gTTSpyttsx3库都可以很方便的实现可听的合成语音,两者各有优点,gTTS合成效果好,使用简单,无需设置诸多参数,缺点在于需要联网使用。pyttsx3可以离线使用,并且支持各个系统平台,缺点在于合成效果不如gTTS并且使用略复杂。