python 利用pyttsx3文字转语音过程详解


Posted in Python onSeptember 25, 2019

这篇文章主要介绍了python 利用pyttsx3文字转语音过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

# -*- coding: utf-8 -*-
import pyttsx3
engine = pyttsx3.init()
with open("all.txt",'r',encoding='utf-8') as f:
  while 1:
    line = f.readline()
    print(line, end = '')
    engine.say(line)
    engine.runAndWait()
import pyttsx3
with open('all.txt','r',encoding='utf-8') as f:
  line = f.read()#文件不大,一次性读取
  engine = pyttsx3.init()
  #调整频率
  rate = engine.getProperty('rate')
  engine.setProperty('rate', rate-50)
  # 调整音量
  volume = engine.getProperty('volume')
  engine.setProperty('volume', volume+0.25)
  engine.say(line)
  engine.runAndWait()

安装

pip install pyttsx3

语音引擎工厂

类似于设计模式中的“工厂模式”,pyttsx3通过初始化来获取语音引擎。当我们第一次调用init操作的时候,会返回一个pyttsx3的engine对象,再次调用的时候,如果存在engine对象实例,就会使用现有的,否则再重新创建一个。

pyttsx.init([driverName : string, debug : bool]) → pyttsx.Engine

从方法声明上来看,第一个参数指定的是语音驱动的名称,这个在底层适合操作系统密切相关的。如下:

1.drivename:由pyttsx3.driver模块根据操作系统类型来调用,默认使用当前操作系统可以使用的最好的驱动

sapi5 - SAPI5 on Windows

nsss - NSSpeechSynthesizer on Mac OS X

espeak - eSpeak on every other platform

2.debug: 这第二个参数是指定要不要以调试状态输出,建议开发阶段设置为True

引擎接口

要想很好的运用一个库,不了解其API是不行的。下面来看看pyttsx3。engine.Engine的引擎API。

方法签名 参数列表 返回值 简单释义
connect(topic : string, cb : callable)  topic:要描述的事件名称;cb:回调函数  →   dict  在给定的topic上添加回调通知
disconnect(token : dict)  token:回调失联的返回标记  Void 结束连接
endLoop() None → None  简单来说就是结束事件循环
getProperty(name : string)  name有这些枚举值“rate, vioce,vioces,volumn  → object  获取当前引擎实例的属性值
setProperty(name : string)  name有这些枚举值“rate, vioce,vioces,volumn → object  设置当前引擎实例的属性值
say(text : unicode, name : string)  text:要进行朗读的文本数据; name: 关联发音人,一般用不到 → None 预设要朗读的文本数据,这也是“万事俱备,只欠东风”中的“万事俱备”
runAndWait() None → None  这个方法就是“东风”了。当事件队列中事件全部清空的时候返回
startLoop([useDriverLoop : bool])  useDriverLoop:是否启用驱动循环 → None  开启事件队列

元数据音调

在pyttsx3.voice.Voice中,处理合成器的发音。

age

发音人的年龄,默认为None

gender

以字符串为类型的发音人性别: male, female, or neutral.默认为None

id

关于Voice的字符串确认信息. 通过 pyttsx3.engine.Engine.setPropertyValue()来设置活动发音签名. 这个属性总是被定义。

languages

发音支持的语言列表,如果没有,则为一个空的列表。

name

发音人名称,默认为None.

更多测试

朗读文本

import pyttsx3
engine = pyttsx3.init()
engine.say('Sally sells seashells by the seashore.')
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()

事件监听

import pyttsx3
def onStart(name):
 print 'starting', name

def onWord(name, location, length):
 print 'word', name, location, length

def onEnd(name, completed):
 print 'finishing', name, completed

engine = pyttsx3.init()
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()

打断发音

import pyttsx3
def onWord(name, location, length):
 print('word', name, location, length)
 if location > 10:
  engine.stop()
engine = pyttsx3.init()
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()

更换发音人声音

engine = pyttsx3.init()
voices = engine.getProperty('voices')
for voice in voices:
 engine.setProperty('voice', voice.id)
 engine.say('The quick brown fox jumped over the lazy dog.')

engine.runAndWait()

语速控制

engine = pyttsx3.init()
rate = engine.getProperty('rate')
engine.setProperty('rate', rate+50)
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()

音量控制

engine = pyttsx3.init()
volume = engine.getProperty('volume')
engine.setProperty('volume', volume-0.25)
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()

执行一个事件驱动循环

engine = pyttsx3.init()
def onStart(name):
 print('starting', name)

def onWord(name, location, length):
 print('word', name, location, length)

def onEnd(name, completed):
 print('finishing', name, completed)
 if name == 'fox':
  engine.say('What a lazy dog!', 'dog')
 elif name == 'dog':
  engine.endLoop()

engine = pyttsx3.init()
engine.say('The quick brown fox jumped over the lazy dog.', 'fox')
engine.startLoop()

使用一个外部的驱动循环

engine = pyttsx3.init()
engine.say('The quick brown fox jumped over the lazy dog.', 'fox')
engine.startLoop(False)
# engine.iterate() must be called inside externalLoop()
externalLoop()
engine.endLoop()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单介绍Python中的JSON使用
Apr 28 Python
Saltstack快速入门简单汇总
Mar 01 Python
Python连接PostgreSQL数据库的方法
Nov 28 Python
Python解决八皇后问题示例
Apr 22 Python
Python中文件的读取和写入操作
Apr 27 Python
对python模块中多个类的用法详解
Jan 10 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
如何使用Python 打印各种三角形
Jun 28 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
pycharm 实现本地写代码,服务器运行的操作
Jun 08 Python
Python爬虫设置ip代理过程解析
Jul 20 Python
python中Array和DataFrame相互转换的实例讲解
Feb 03 Python
python retrying模块的使用方法详解
Sep 25 #Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 #Python
python 魔法函数实例及解析
Sep 25 #Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 #Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 #Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 #Python
python异步编程 使用yield from过程解析
Sep 25 #Python
You might like
pdo中使用参数化查询sql
2011/08/11 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
PHP chop()函数讲解
2019/02/11 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
js word表格动态添加代码
2010/06/07 Javascript
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
JS特权方法定义作用以及与公有方法的区别
2013/03/18 Javascript
jquery $.each() 使用小探
2013/08/23 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
2013/09/11 Javascript
JavaScript修改浏览器tab标题小技巧
2015/01/06 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
Jquery调用iframe父页面中的元素及方法
2016/08/23 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
vue.js实现简单轮播图效果
2017/10/10 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
JavaScript枚举选择jquery插件代码实例
2020/11/17 jQuery
[03:00]2014DOTA2国际邀请赛 Titan淘汰潸然泪下Ohaiyo专访
2014/07/15 DOTA
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
房地产员工找工作的自我评价
2013/11/15 职场文书
班级安全教育实施方案
2014/02/23 职场文书
车辆工程专业求职信
2014/06/14 职场文书
2014年电教工作总结
2014/12/19 职场文书
淮海战役观后感
2015/06/11 职场文书
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS