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)临时方案

按段落拆分,中间判断是否中断

posted @ 2023-11-02 22:23  挖洞404  阅读(743)  评论(0编辑  收藏  举报