用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. 【UOJ #14】【UER #1】DZY Loves Graph

    http://uoj.ac/problem/14 题解很好的~ 不带路径压缩的并查集能保留树的原本形态. 按秩合并并查集可以不用路径压缩,但是因为此题要删除,如果把深度当为秩的话不好更新秩的值,所以把 ...

  2. windows 下 新建 点开头的文件和文件夹

    新建 .aaa文件夹 cmd:$ mkdir .aaa 新建 .aaa文件夹 echo " >> .aaa

  3. Linux系统下的程序开发之:命名规范

    2016年12月13日16:19:53 ------------------------------- 不能使用类似驼峰法的命名文件:dingdanOrder.html 这样的命名,会让系统无法找到目 ...

  4. CRM(客户关系管理)

    CRM最初是由Gartner Group提出的. CRM定义:"客户关系管理(CRM),是代表增进赢利.收入和客户满意度而设计的,企业范围的商业战略." 我们可以看出,Gartne ...

  5. Win7---------专区

    待完善中-------------------------------------- 1.0Win7来历: 不算上最早的Windows版本从 95 98 2000  ME  XP  2003  Vis ...

  6. 使用mosh取代ssh提高n2n网络连接稳定性

    上文实现了远程n2n访问树莓派,但是ssh协议在网络状况不好的时候命令会卡住.这里发现了一个mosh协议,可以增强稳定性,使用后效果明显. 背景:使用n2n之后,在比较差的网络环境下,经常会被time ...

  7. MYSQL开启慢查询日志实施

    查看当前服务器是否开启慢查询:1.快速办法,运行sql语句show VARIABLES like "%slow%" 2.直接去my.conf中查看.my.conf中的配置(放在[m ...

  8. 浅谈Android中Activity的生命周期

    引言 我想对于Android开发人员来说,Activity是再熟悉不过了,今天我们就来探讨下Activity的生命周期.熟悉的掌握Activity对于开发健壮的Android应用程序来说至关重要.下面 ...

  9. 【09-03】java泛型学习笔记

    静态方法的泛型 /** * @description 静态方法的泛型无法使用类定义的泛型,因为类在实例化时才确定具体的泛型类,因此静态方法要使用泛型需要使用泛型方法的方式 */ public clas ...

  10. HTML5 离线缓存管理库

    一.HTML5离线缓存技术 支持离线缓存是HTML5中的一个重点,离线缓存就是让用户即使在断网的情况下依然可以正常的运行应用.传统的本地存储数据的方式有 localstorage,sessionsto ...