今天小编给大家介绍一个有趣的事情,让代码开口说话,简单点说就是python利用pyttsx3实现文字转语音。感觉还是蛮有趣的,并且支持中文哦。
首先我们先安装
pyttsx3
pip install pyttsx3
如果是windows操作系统,并且未安装pywin32, 需要安装pywin32
pip install pywin32
我们首先让代码说句Hello World,然后再说句中文
import pyttsx3 # 模块初始化 engine = pyttsx3.init() print('准备开始语音播报...') engine.say('Hello World') engine.say('孙肖宁') # 等待语音播报完毕, 不写这个是不可以的哦 engine.runAndWait()
是不是很简单呢
我们还可以进行语速控制、音量控制、更换发音人声音
import pyttsx3 # 模块初始化 engine = pyttsx3.init() print('准备开始语音播报...') # 语速控制,默认值为200 rate = engine.getProperty('rate') engine.setProperty('rate', rate - 50) # 音量控制,范围为0.0-1.0 volume = engine.getProperty('volume') engine.setProperty('volume', 0.6) # 添加朗读文本 engine.say('窗前明月光,疑是地上霜。') # 等待语音播报完毕 engine.runAndWait()
我们再来说下更换发音人的声音,目前中文仅支持3种
- 普通话:
com.apple.speech.synthesis.voice.ting-ting.premium
- 粤语 :
com.apple.speech.synthesis.voice.ting-ting.premium
台湾女生普通话:
com.apple.speech.synthesis.voice.mei-jia
import pyttsx3 # 模块初始化 engine = pyttsx3.init() volume = engine.getProperty('volume') # 普通话发音 voices = engine.setProperty( 'voice', "com.apple.speech.synthesis.voice.ting-ting.premium") # 标准的粤语发音 # voices = engine.setProperty( # 'voice', "com.apple.speech.synthesis.voice.sin-ji") # 台湾女生普通话发音 # voices = engine.setProperty( # 'voice', "com.apple.speech.synthesis.voice.mei-jia") print('准备开始语音播报...') # 输入语音播报词语 engine.setProperty('volume', 3) engine.say("窗前明月光,疑是地上霜。举头望明月,低头思故乡。") engine.runAndWait() engine.stop()
另外你可以尝试查看内置的其他声音,遍历下面的voices即可
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id)
- 普通话:
详解
语音引擎工厂类似于设计模式中的“工厂模式”,pyttsx3通过初始化来获取语音引擎。当我们第一次调用init操作的时候,会返回一个pyttsx3的engine对象,再次调用的时候,如果存在engine对象实例,就会使用现有的,否则再重新创建一个。
pyttsx.init([driverName : string, debug : bool]) → pyttsx.Engine
从方法声明上来看,第一个参数指定的是语音驱动的名称,这个在底层适合操作系统密切相关的。如下:drivename
:由pyttsx3.driver模块根据操作系统类型来调用,默认使用当前操作系统可以使用的最好的驱动。- sapi5 - SAPI5 on Windows
- nsss - NSSpeechSynthesizer on Mac OS X
- espeak - eSpeak on every other platform
debug:
要不要以调试状态输出,开发阶段可以设置为True。
函数说明
connect()
在给定的topic上添加回调通知参数:
topic(string)
:要描述的事件名称;cb(callable)
:回调函数。
- 返回值: dict
disconnect()
结束连接参数:
token(dict)
:回调失联的返回标记
- 返回值: Void
endLoop()
简单来说就是结束事件循环getProperty()
获取当前引擎实例的属性值参数:
name(string):rate
: 每分钟字数的语音速率,默认为每分钟200个。name(string):voice
: 语音的字符串标识符。name(string):voices
: pyttsx3.voice.Voice描述符对象列表。name(string):volume
:音量的大小。
- 返回值: Object
setProperty()
获取当前引擎实例的属性值参数:
name(string):rate
: 每分钟字数的语音速率,默认为每分钟200个。name(string):voice
: 语音的字符串标识符。name(string):volume
:音量的大小。value(int):rate
: 设置每分钟读的字数。value:voice
:设置发音,后文中会再讲到。valu(float):volume
:设置音量大小,0.0-1.0之间;默认1.0。
- 返回值: Object
say()
预设要朗读的文本数据参数:
text(unicode)
:要进行朗读的文本数据。name(strin)
:关联发音人(一般用不到)
runAndWait()
当事件队列中事件全部清空的时候返回startLoop()
开启事件队列参数:
[useDriverLoop(bool)]
:是否启用驱动循环。
stop()
停止当前讲话并清除命令队列。
One comment
感谢楼主的分享,但是有碰到过保存不了的情况吗