Python如何实现文本转语音


Posted in Python onAugust 08, 2016

准备

我测试使用的Python版本为2.7.10,如果你的版本是Python3.5的话,这里就不太适合了。

使用Speech API

原理

我们的想法是借助微软的语音接口,所以我们肯定是要进行调用 相关的接口。所以我们需要安装pywin32来帮助我们完成这一个底层的交互。

示例代码

import win32com.client
speaker = win32com.client.Dispatch("SAPI.SpVoice")
speaker.Speak("Hello, it works!")

小总结

是的,调用接口来实现语音功能就是这么简单,但是我们不得不来聊一聊这种方式的缺点。

对中文支持的不够好,仅仅是这一点,估计在中国没几个用它的了。

还有就是语速不能很好的控制

pyttsx方式

原理

pyttsx 是Python的一个关于文字转语音方面的很不错的库。我们还可以借助pyttsx来实现在线朗读rfc文件或者本地文件等等,最为关键的是,它对中文支持的还是不错的。

示例代码

# coding:utf-8
import sys

reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/6'
# __Desc__ = 文字转语音输出

import pyttsx
engine = pyttsx.init()
engine.say('hello world')
engine.say('你好,郭璞')
engine.runAndWait()
# 朗读一次
engine.endLoop()

小总结

使用pyttsx,我们可以借助其强大的API来实现我们基本的业务需求。很酷吧。

pyttsx深入研究

做完上面的小实验,你肯定会觉得怎么这么不过瘾呢?
别担心,下面我们就一起走进pyttsx的世界,深入的研究一下其工作原理吧。

语音引擎工厂

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

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

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

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

            sapi5 - SAPI5 on Windows

            nsss - NSSpeechSynthesizer on Mac OS X

            espeak - eSpeak on every other platform

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

引擎接口

要想很好的运用一个库,不了解其API是不行的。下面来看看pyttsx。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  开启事件队列

元数据音调

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

age

发音人的年龄,默认为None

gender

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

id

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

languages

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

name

发音人名称,默认为None.

更多测试

朗读文本

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

事件监听

import pyttsx
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 = pyttsx.init()
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()

打断发音

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

更换发音人声音

engine = pyttsx.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 = pyttsx.init()
rate = engine.getProperty('rate')
engine.setProperty('rate', rate+50)
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()

音量控制

engine = pyttsx.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 = pyttsx.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 = pyttsx.init()
engine.say('The quick brown fox jumped over the lazy dog.', 'fox')
engine.startLoop()

使用一个外部的驱动循环

engine = pyttsx.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实现文本转语音还是蛮简单的?那么,大家快来尝试尝试吧。希望本文对大家学习Python有所帮助。

Python 相关文章推荐
Python中用函数作为返回值和实现闭包的教程
Apr 27 Python
13个最常用的Python深度学习库介绍
Oct 28 Python
Python模拟简单电梯调度算法示例
Aug 20 Python
Python中作用域的深入讲解
Dec 10 Python
pytorch 自定义卷积核进行卷积操作方式
Dec 30 Python
Python 识别12306图片验证码物品的实现示例
Jan 20 Python
Python3 Click模块的使用方法详解
Feb 12 Python
python设置代理和添加镜像源的方法
Feb 14 Python
Django数据库操作之save与update的使用
Apr 01 Python
Python安装并操作redis实现流程详解
Oct 13 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 Python
python模块与C和C++动态库相互调用实现过程示例
Nov 02 Python
Python脚本处理空格的方法
Aug 08 #Python
基于Python实现对PDF文件的OCR识别
Aug 05 #Python
利用Python实现命令行版的火车票查看器
Aug 05 #Python
Python处理JSON数据并生成条形图
Aug 05 #Python
用Python解决计数原理问题的方法
Aug 04 #Python
快速入手Python字符编码
Aug 03 #Python
Python采用Django制作简易的知乎日报API
Aug 03 #Python
You might like
用php获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
php中对2个数组相加的函数
2011/06/24 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
PHP自定义多进制的方法
2016/11/03 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
2011/07/13 Javascript
javascript面向对象编程代码
2011/12/19 Javascript
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
JS通过相同的name进行表格求和代码
2013/08/18 Javascript
node.js中的console用法总结
2014/12/15 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
使用python编写批量卸载手机中安装的android应用脚本
2014/07/21 Python
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
Python 处理数据的实例详解
2017/08/10 Python
python使用super()出现错误解决办法
2017/08/14 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
Python过滤序列元素的方法
2020/07/31 Python
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
Saks Fifth Avenue澳洲/亚太地区:萨克斯第五大道精品百货店
2019/06/09 全球购物
挂职自我鉴定
2014/02/26 职场文书
库房保管员岗位职责
2014/04/07 职场文书
项目安全员岗位职责
2015/02/15 职场文书
医学会议开幕词
2016/03/03 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js