用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朗读功能的更多相关文章

  1. Android Studio快速集成讯飞SDK实现文字朗读功能

    今天,我们来学习一下怎么在Android Studio快速集成讯飞SDK实现文字朗读功能,先看一下效果图: 第一步 :了解TTS语音服务 TTS的全称为Text To Speech,即“从文本到语音” ...

  2. MAC OS 英语朗读功能

    哈哈哈,太神奇了 在命令行中敲say + word ,系统能够自己讲word读出来. 如果是敲的是 say +中文, 就不知道再读什么啦 哈哈哈哈---- 此外,在对应网站选中内容后还可以右击,用sp ...

  3. C#实现语音朗读功能

    第一步:新建项目  TTS(从文本到语音(TextToSpeech)) 第二步:添加引用 System.Speech 第三步:主界面以及后台代码 using System;using System.G ...

  4. TTS-零基础入门-10分钟教你做一个语音功能

    在本片博客正式開始之前,大家先跟我做一个简单的好玩的 小语音. 新建一个文本文档,然后再文档里输入这样 一句话  CreateObject("SAPI.SpVoice").Spea ...

  5. android学习笔记53——自动朗读TTS

    自动朗读TTS android提供了自动朗读功能--其指的是支持可以对指定文本内容进行朗读,从而发出声音: 同时android的自动朗读支持还允许把文本对应的音频录制成音频文件,方便后续播放. 这种自 ...

  6. System.Speech.Synthesis 添加暂停、继续功能

    为了方便调用暂停.继续的方法.要将speech的功能写成一个类.直接附上代码: using System; using System.Collections.Generic; using System ...

  7. 小梦windows phone 8.1开发:语音朗读

    使用SpeechSynthesizer类可以实现文本朗读功能,位于 Windows.Media.SpeechSynthesis命名空间.有了它我们就可以实现有声小说了,是不是很爽.下面给出一个将文本块 ...

  8. Lingoes 一款功能强大、简明易用的多语言词典和文本翻译软件

    Lingoes 软件自述 Lingoes 是一款功能强大.简明易用的多语言词典和文本翻译软件,支持多达80种语言互查互译,这些语言包括 英.法.德.意.俄.中.日.韩.西.葡.阿拉伯语 及更多... ...

  9. Android 轻松实现语音朗读

    语音朗读,这是一个很好的功能,可以实现一些客户的特殊要求.在Android 实现主意功能只需要几段简单的代码即可完成. 在Android 中使用语音朗读功能 只需要使用此类 TextToSpeech ...

随机推荐

  1. CodeForces 548D 单调栈

    Mike and Feet Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Subm ...

  2. JavaMail简单版实验测试

    前言: 最近由于实现web商城的自动发送邮件功能的需求,故涉猎的邮箱协议的内部原理.现将简单版的Java Mail实例做个代码展示,并附上其中可能出现的bug贴出,方便感兴趣的读者进行测试! 1.载入 ...

  3. IE8的parseInt

    踩到一个IE8的parseInt的坑: Chrome:

  4. C#把DataTable中数据一次插入数据库的方法

    现在实际的情况是这样的: 客户有一台打卡机,员工打卡的信息全部储存在打卡机的Access数据库里面,现在客户引入了一种新的管理系统,需要将Access数据库中的打卡数据同步到SQL Server数据库 ...

  5. <<< Oracle表创建、修改、删除基础操作

    表是数据库存储数据的基本单元,它对应于现实世界中的对象(如部门和雇员等).表按列进行定义,存储若干行数据.表中应该至少有一列.在 Oracle 中,表一般指的是一个关系型数据表.也可以生成临时表和对象 ...

  6. ionic ios 发布设置 header-bar高度无效

    在公司app发布过程中发现一旦改过header-bar的高度之后在ios内部或者通过ionic build browser生成的网页打开都不是正常的 通过chrome的查看工具发现自己写的样式被直接覆 ...

  7. 【类库】容器对象(List、DataTable、 DataView、Dictionary)

    首先申明一下,写此博文的目的是纪录一下,知识都是现成的,只是整理一下,为了让自己更容易看懂,比在其他地方更容易明白.因为它们太常用了,不忍心每次都去用那么长的时间查看MSDN,希望能在这里用理少的时间 ...

  8. Shader的学习方法总结

    最近网友candycat1992的新书<Unity Shader入门精要>出版了,估计万千的中国unity开发者又要掀起一波学Shader热潮了.我也想把自己这几年学习Shader的一些历 ...

  9. LinqPad工具:帮你快速学习Linq

    LinqPad工具:帮你快速学习Linq 参考: http://www.cnblogs.com/li-peng/p/3441729.html ★:linqPad下载地址:http://www.linq ...

  10. Js中文排序(拼音首字母)

    演示地址:http://lar5.sinaapp.com/ 1.index.html <html xmlns="http://www.w3.org/1999/xhtml"&g ...