Pyqt SpVoice朗读功能
用Pyqt 做一个读取系统剪贴板内容,然后通过语音合成(TTS)朗读出剪贴板的内容
知识要点
SpVoice
SpVoice类是支持语音合成(TTS)的核心类。通过SpVoice对象调用TTS引擎,从而实现朗读功能。 SpVoice类有以下主要属性:
Voice:表示发音类型,相当于进行朗读的人,包括Microsoft Mary,Microsoft Mike,Microsoft Sam和Microsoft Simplified Chinese四种。其中前三种只能读英文,最后一种可以读中文,也可以读英文,但对于英文单词只能将其包括的各个字母逐一朗读出来。下面的程序中我们将会想办法解决这个问题。
Rate:语音朗读速度,取值范围为-10到+10。数值越大,速度越快。
Volume:音量,取值范围为0到100。数值越大,音量越大。
SpVoice有以下主要方法:
Speak:完成将文本信息转换为语音并按照指定的参数进行朗读,该方法有Text和Flags两个参数,分别指定要朗读的文本和朗读方式(同步或异步等)。
Pause:暂停使用该对象的所有朗读进程。该方法没有参数。
Resume:恢复该对象所对应的被暂停的朗读进程。该方法没有参数。
python 通过
speaker = win32com.client.Dispatch("SAPI.SpVoice") # Dispatch("APPs") 需要app 注册COM服务, 且APPs是注册的名字
连接到SAPI.SpVoice COM服务
Clipboard剪贴板
python操作剪贴板通过win32clipboard 类库
import win32clipboard as w
class ClipD(QtCore.QThread):
def __init__(self):
super(ClipD, self).__init__()
tempdir = tempfile.gettempdir()
self.fileposition = tempdir+"\\ClipSetting.ini"
#获取剪贴板内容
def getText(self):
w.OpenClipboard()
d = w.GetClipboardData(win32con.CF_TEXT)
w.CloseClipboard()
return d
# 设置剪贴板内容,
def setText(aString):
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_TEXT, aString)
w.CloseClipboard()
完整代码:
# -*- coding: UTF8 -*-
from PyQt4 import QtCore, QtGui
import os.path, time, tempfile,threading, sys
import win32clipboard as w
import win32con, pythoncom
import win32com.client
reload(sys)
sys.setdefaultencoding('gbk')
'''
SpVoice类是支持语音合成(TTS)的核心类。通过SpVoice对象调用TTS引擎,从而实现朗读功能。 SpVoice类有以下主要属性:
Voice:表示发音类型,相当于进行朗读的人,包括Microsoft Mary,Microsoft Mike,Microsoft Sam和Microsoft Simplified Chinese四种。其中前三种只能读英文,最后一种可以读中文,也可以读英文,但对于英文单词只能将其包括的各个字母逐一朗读出来。下面的程序中我们将会想办法解决这个问题。
Rate:语音朗读速度,取值范围为-10到+10。数值越大,速度越快。
Volume:音量,取值范围为0到100。数值越大,音量越大。
SpVoice有以下主要方法:
Speak:完成将文本信息转换为语音并按照指定的参数进行朗读,该方法有Text和Flags两个参数,分别指定要朗读的文本和朗读方式(同步或异步等)。
Pause:暂停使用该对象的所有朗读进程。该方法没有参数。
Resume:恢复该对象所对应的被暂停的朗读进程。该方法没有参数。
'''
speaker = win32com.client.Dispatch("SAPI.SpVoice") # Dispatch("APPs") 需要app 注册COM服务, 且APPs是注册的名字 class Mwindow(QtGui.QDialog):
def __init__(self):
super(Mwindow, self).__init__()
self.resize(100, 60)
self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
self.setWindowTitle('speaker')
self.startser = QtGui.QPushButton(u'start')
self.pause = QtGui.QPushButton(u"status")
self.textarea = QtGui.QTextEdit()
self.textarea.setReadOnly(True)
self.textarea.setStyleSheet("QWidget { background-color: black;color:yellow;}")#样式表改变背景颜色
#top Layout
self.toplayout= QtGui.QHBoxLayout()
self.toplayout.addSpacing(0) # 空间距离 addSpacing 不可为空
self.toplayout.addWidget(self.startser)
self.toplayout.addWidget(self.pause)
#mainLayout
self.MainLayout = QtGui.QVBoxLayout()
self.MainLayout.addLayout(self.toplayout, 1)
self.MainLayout.addWidget(self.textarea, 1)
self.setLayout(self.MainLayout)
self.MainLayout.setContentsMargins(0, 0, 0, 0) # 距离边缘的距离
self.MainLayout.setSpacing(0) # 空间距离 self.connect(self.startser, QtCore.SIGNAL('clicked()'), self.starting)
self.connect(self.pause, QtCore.SIGNAL('clicked()'), self.paused)
#开始线程读取
def starting(self):
self.thread = ClipD()
self.connect(self.thread, QtCore.SIGNAL('updateresult'), self.showtextarea)
self.thread.start()
self.startser.setText('starting') # 暂停
def paused(self):
btnname = self.pause.text()
if btnname == 'status' or btnname =='stop':
speaker.pause()
self.pause.setText('resume')
elif btnname == 'resume':
speaker.resume()
self.pause.setText('stop') # 同步剪贴板的内容到text中
def showtextarea(self, text):
self.say(text)
self.textarea.setText(u''+text)
#读线程
def sayThread(self, talk):
pythoncom.CoInitialize()
speaker.Speak(talk) def say(self, talk):
threading.Thread(target=self.sayThread, args=(talk, )).start() # args是元组 class ClipD(QtCore.QThread):
def __init__(self):
super(ClipD, self).__init__()
tempdir = tempfile.gettempdir()
self.fileposition = tempdir+"\\ClipSetting.ini"
#获取剪贴板内容
def getText(self):
w.OpenClipboard()
d = w.GetClipboardData(win32con.CF_TEXT)
w.CloseClipboard()
return d
# 设置剪贴板内容,
def setText(aString):
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_TEXT, aString)
w.CloseClipboard()
# 获取临时目录记录的old 剪贴板内容
def getTmpText(self):
if os.path.exists(self.fileposition):
settingsFile = open(self.fileposition)
clip = settingsFile.read()
return clip
else:
return False # 设置临时剪贴板目录
def setTmpText(self):
settingsFile = open(self.fileposition, "w+")
clip = self.getText()
settingsFile.write(clip)
settingsFile.close() def run(self):
# for i in range(0, 100):
while True:
old = self.getTmpText()
new = self.getText()
if old != new:
self.setTmpText()
self.emit(QtCore.SIGNAL("updateresult"), self.getText())
time.sleep(1) if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
mainWin = Mwindow()
mainWin.show()
sys.exit(app.exec_())
效果:




Pyqt SpVoice朗读功能的更多相关文章
- Android Studio快速集成讯飞SDK实现文字朗读功能
今天,我们来学习一下怎么在Android Studio快速集成讯飞SDK实现文字朗读功能,先看一下效果图: 第一步 :了解TTS语音服务 TTS的全称为Text To Speech,即“从文本到语音” ...
- MAC OS 英语朗读功能
哈哈哈,太神奇了 在命令行中敲say + word ,系统能够自己讲word读出来. 如果是敲的是 say +中文, 就不知道再读什么啦 哈哈哈哈---- 此外,在对应网站选中内容后还可以右击,用sp ...
- C#实现语音朗读功能
第一步:新建项目 TTS(从文本到语音(TextToSpeech)) 第二步:添加引用 System.Speech 第三步:主界面以及后台代码 using System;using System.G ...
- TTS-零基础入门-10分钟教你做一个语音功能
在本片博客正式開始之前,大家先跟我做一个简单的好玩的 小语音. 新建一个文本文档,然后再文档里输入这样 一句话 CreateObject("SAPI.SpVoice").Spea ...
- android学习笔记53——自动朗读TTS
自动朗读TTS android提供了自动朗读功能--其指的是支持可以对指定文本内容进行朗读,从而发出声音: 同时android的自动朗读支持还允许把文本对应的音频录制成音频文件,方便后续播放. 这种自 ...
- System.Speech.Synthesis 添加暂停、继续功能
为了方便调用暂停.继续的方法.要将speech的功能写成一个类.直接附上代码: using System; using System.Collections.Generic; using System ...
- 小梦windows phone 8.1开发:语音朗读
使用SpeechSynthesizer类可以实现文本朗读功能,位于 Windows.Media.SpeechSynthesis命名空间.有了它我们就可以实现有声小说了,是不是很爽.下面给出一个将文本块 ...
- Lingoes 一款功能强大、简明易用的多语言词典和文本翻译软件
Lingoes 软件自述 Lingoes 是一款功能强大.简明易用的多语言词典和文本翻译软件,支持多达80种语言互查互译,这些语言包括 英.法.德.意.俄.中.日.韩.西.葡.阿拉伯语 及更多... ...
- Android 轻松实现语音朗读
语音朗读,这是一个很好的功能,可以实现一些客户的特殊要求.在Android 实现主意功能只需要几段简单的代码即可完成. 在Android 中使用语音朗读功能 只需要使用此类 TextToSpeech ...
随机推荐
- iOS学习-KVO设计模式
KVO 即Key-Value Observing 键-值观察的缩写,简单的说就是通过键来观察一个对象属性值的变化.当这个被观察的属性发生变化时,观察者就会收到通知(观察者可以是这个对象本身,也可以是 ...
- Python学习之day2
1.执行Python脚本时打印的字符有颜色 print "\033[32;1mhello\033[0m" #打印绿色 print "\033[31;1mhello\033 ...
- 线段树 poj 1436
题目大意:给出n条垂直于x轴的线段的数据y1,y2,x,求出有几个三条线段一组的三元组并且他们兩兩能相见的.思路:对y轴建树,将x排序,然后按顺序边询问边擦入,用mark[i][j]表示j往左可以看到 ...
- WKWebView与JS交互,UIWebView+JavascriptCore和JS交互
最近一直在做有关Swift和JavaScript交互的程序,所以有关UIWebView和WKWebView在使用上的差别在此总结下: UIWebView: (1)创建 var webView: UIW ...
- iOS - 沙盒与目录
NSFileManager NSBundle Class Cluster 采用Tagged Pointer的字符串 NSPathStore iOS证书ipa包重签名探究 url 结构 1. iOS 沙 ...
- easyUi load方法重新加载表单的数据
1.表单回显数据的方法 <script> //方法一 function loadLocal(){ $('#ff').form('load',{ name:'myname', email:' ...
- 图解JVM字节码执行引擎之栈帧结构
一.执行引擎 “虚拟机”的概念是相对于“物理机”而言的,这两种“机器”都有执行代码的能力.物理机的执行引擎是直接建立在硬件处理器.物理寄存器.指令集和操作系统层面的:而“虚拟机”的执行引擎是 ...
- CSS 和 JS 动画哪个更快
基于Javascript的动画暗中同CSS过渡效果一样,甚至更加快,这怎么可能呢?而Adobe和Google持续发布的富媒体移动网站的性能可媲美本地应用,这又怎么可能呢? 本文逐一遍览了基于Javas ...
- [Machine Learning] 机器学习常见算法分类汇总
声明:本篇博文根据http://www.ctocio.com/hotnews/15919.html整理,原作者张萌,尊重原创. 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多 ...
- [Search Engine] 搜索引擎技术之倒排索引
倒排索引是搜索引擎中最为核心的一项技术之一,可以说是搜索引擎的基石.可以说正是有了倒排索引技术,搜索引擎才能有效率的进行数据库查找.删除等操作. 1. 倒排索引的思想 倒排索引源于实际应用中需要根据属 ...