pyttsx3模块
1、介绍
pyttsx3模块是python的一个第三方模块,作用是进行语音合成。
- 无需请求api,本地合成,可以不受次数和字数限制
- 技术相对成熟,应用广泛,使用方便
2、pyttsx3.speak函数
import pyttsx3
pyttsx3.speak('你指尖跃动的电光,是我此生不灭的信仰')
- 这是该模块最简应用,调用speak函数时,会播放合成的语音
- 播放过程是依赖原线程,播放完毕后继续执行
def speak(text):
engine = init()
engine.say(text)
engine.runAndWait()
3、参考speak函数
import pyttsx3
def speak_text(text: str):
# 创建语音合成对象
engine = pyttsx3.init()
# 合成并播放
engine.say(text)
# 阻塞,等待合成过程和播放过程
engine.runAndWait()
speak_text('区区砂砾,不及我半分')
- 自定义函数,相比原生的speak函数可以进行参数调试,乃至开线程处理
- engine对象是prttsx3.engine.Engine类的对象
4、Engine类
def say(self, text, name=None):
- text参数,str类型,作为合成语音的内容
- 该方法将text参数的字符串合成语音,并且直接播放
- 该方法调用后会直接执行其后的语句
def save_to_file(self, text, filename, name=None)
- text参数,str类型,作为合成语音的内容
- filename参数,str类型,表示合成结果输出的文件路径
- 该方法是将text参数的字符串合成语音,保存到指定文件中。不会直接播放
- 因此该方法调用后会直接执行其后的语句
def runAndWait(self):
- 实际上,say和save_to_file方法都并不会实际执行,而是进行相关设置
- 该方法才是开启运行以及阻塞,等待任务完成才继续向后执行
def setProperty(self, name, value)
- 设置合成的相关属性
- voice,选择声音。值可以是声音对应的id
- rate,选择速率。int类型,表示每分钟多少单词
- volume,语音量,float类型,范围从0.0-1.0
def getProperty(self, name)
- 获取相关属性
- name为voice时,获取到的是str类型,表示id
- name为voices时,获取到的是list类型,其元素是pyttsx3.voice.Voice对象
- name为rate时,获取到的是int类型,默认值200
- name为volume时,获取到的是float类型,默认值1.0
def isBusy(self)
- 是否繁忙,返回bool类型
def stop(self)
- engine对象是可以重复调用say和save_to_file方法的,每次调用这两个方法其中一个,会开启允许执行的标志,runAndWait方法执行时,如果标志开启,则执行。反之则放弃本次任务。
- stop方法是修改标志为False。需要注意的是在runAndWait方法执行过程中,stop方法如果是开子线程执行,会进入阻塞状态直到runAndWait方法结束。
- stop方法在两个方法之前调用,对这两个方法的执行没有影响
- stop方法在两个方法之后,以及在runAndWaitf方法之前调用,会放弃本次执行
- stop方法在runAndWait方法执行时调用,会阻塞其所在线程等待执行完毕再结束stop方法
5、语音合成引擎
(1)查看本地支持的语音合成引擎
import pyttsx3
engine = pyttsx3.init()
voices = engine.getProperty('voices')
for voice in voices:
print(type(voice))
print("Name: %s, ID: %s, Age: %s, Age: %s, Languages Known: %s" % (voice.name, voice.id, voice.age, voice.gender, voice.languages))
<class 'pyttsx3.voice.Voice'>
Name: Microsoft Huihui Desktop - Chinese (Simplified), ID: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_ZH-CN_HUIHUI_11.0, Age: None, Age: None, Languages Known: []
<class 'pyttsx3.voice.Voice'>
Name: Microsoft Haruka Desktop - Japanese, ID: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_JA-JP_HARUKA_11.0, Age: None, Age: None, Languages Known: []
<class 'pyttsx3.voice.Voice'>
Name: Microsoft Zira Desktop - English (United States), ID: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-US_ZIRA_11.0, Age: None, Age: None, Languages Known: []
- 这里显示本地支持三种语音合成引擎
(2)设置语音合成引擎与测试
engine.setProperty('voice', engine.getProperty('voices')[0].id)
- Huihui,支持中文、数字和英文,即使混杂也可以识别依序读取。数字是中文读音,十进制读法
- Haruka,支持日语、数字和英文,中文会被跳过。数字是日语读音
- Zira,支持数字和英文,中文会被跳过。数字是英语读音,单独的数字会作为十进制读法,而混杂过程中会逐位读出
6、中断执行
(1)模块本身
相对而言,save_to_file方法工作耗时是比较少的,而say方法更容易占用较长耗时。
pyttsx3模块中的stop方法并不支持runAndWait方法执行过程中的中断,模块内暂时未发现其它可行机制。
(2)sys退出
- 将runAndWait的调用开子线程执行,并且将该子线程设置为守护线程
- sys.exit方法执行时,会杀死主线程,结束当前程序。所相关的守护线程也会结束
import pyttsx3
# 创建语音合成对象
engine = pyttsx3.init()
text = 'abc'
# 准备较长的语言文本以便测试
with open(file='document/content.txt', mode='r', encoding='utf-8') as f:
text = f.read()
def speak_text():
engine.setProperty('voice', engine.getProperty('voices')[0].id)
engine.say(text)
engine.runAndWait()
def control():
time.sleep(2)
print('abc')
sys.exit()
print('停止')
t = threading.Thread(target=control)
t.start()
t2 = threading.Thread(target=speak_text)
t2.daemon = True
t2.start()
(3)使用pygame进行语音播放
(4)临时方案
按段落拆分,中间判断是否中断