【Qt编程】基于Qt的词典开发系列<十二>调用讲述人
我们知道,win7系统自带有讲述人,即可以机器读出当前内容,具体可以将电脑锁定,然后点击左下角的按钮即可。之前在用Matlab写扫雷游戏的时候,也曾经调用过讲述人来进行游戏的语音提示。具体的Matlab脚本文件如下:
sp=actxserver('SAPI.SpVoice');sp.Speak('你好,欢迎来到西安电子科技大学!Hello,Welcome to XD University!')
1、dialog.h
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include"speech.h" namespace Ui { class Dialog; } class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent = 0); ~Dialog(); private slots: void on_pushButton_clicked(); private: Ui::Dialog *ui; }; #endif // DIALOG_H
2、speech.h
#ifndef SPEECH_H #define SPEECH_H #include <QObject> class QtSpeech : public QObject { Q_OBJECT public: // 处理异常情况 struct Error { QString msg; Error(QString s):msg(s) {} }; struct InitError : Error { InitError(QString s):Error(s) {} }; struct LogicError : Error { LogicError(QString s):Error(s) {} }; struct CloseError : Error { CloseError(QString s):Error(s) {} }; //定义数据类型 struct VoiceName { QString id; QString name; }; typedef QList<VoiceName> VoiceNames; //定义构造函数 QtSpeech(QObject * parent); QtSpeech(VoiceName n = VoiceName(), QObject * parent =0L); virtual ~QtSpeech(); const VoiceName & name() const; //要读的内容 static VoiceNames voices(); //要读的内容 void say(QString) const; //同步发音 void tell(QString) const; //异步发音 void tell(QString, QObject * obj, const char * slot) const; //发音结束时,有停顿 /*******************/ void pause(void) const;//暂停 void resume(void) const;//从暂停中恢复 void stop(void) const;//停止发音 /******************/ signals: void finished(); protected: virtual void timerEvent(QTimerEvent *); private: class Private; Private * d; }; //} #endif // SPEECH_H
3、main.cpp
#include <QApplication> #include"dialog.h" int main(int argc, char *argv[]){ QApplication app(argc, argv); Dialog dlg; dlg.show(); return app.exec(); }
4、dialog.cpp
#include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); } Dialog::~Dialog() { delete ui; } void Dialog::on_pushButton_clicked() { QtSpeech *speaker = new QtSpeech(this); speaker->tell(ui->textEdit->toPlainText(),speaker,SLOT(onSpeechFinished())); // speaker.stop(); }
5、speech.cpp
#include "speech.h" #include <QString> #include <QPointer> #include <QList> #include <QTimerEvent> #undef UNICODE #include <sapi.h> #include <sphelper.h> #include <comdef.h> #define UNICODE #include <windows.h> #include <windowsx.h> #include <commctrl.h> // some defines for throwing exceptions #define Where QString("%1:%2:").arg(__FILE__).arg(__LINE__) #define SysCall(x,e) {\ HRESULT hr = x;\ if (FAILED(hr)) {\ QString msg = #e;\ msg += ":"+QString(__FILE__);\ msg += ":"+QString::number(__LINE__)+":"+#x+":";\ msg += _com_error(hr).ErrorMessage();\ throw e(msg);\ }\ } // internal data class QtSpeech::Private { public: Private() :onFinishSlot(0L),waitingFinish(false) {} VoiceName name; static const QString VoiceId; typedef QPointer<QtSpeech> Ptr; static QList<Ptr> ptrs; CComPtr<ISpVoice> voice; const char * onFinishSlot; QPointer<QObject> onFinishObj; bool waitingFinish; class WCHAR_Holder { public: WCHAR * w; WCHAR_Holder(QString s) :w(0) { w = new WCHAR[s.length()+1]; s.toWCharArray(w); w[s.length()] =0; } ~WCHAR_Holder() { delete[] w; } }; }; const QString QtSpeech::Private::VoiceId = QString("win:%1"); QList<QtSpeech::Private::Ptr> QtSpeech::Private::ptrs = QList<QtSpeech::Private::Ptr>(); //类的定义 QtSpeech::QtSpeech(QObject * parent) :QObject(parent), d(new Private) { CoInitialize(NULL); SysCall( d->voice.CoCreateInstance( CLSID_SpVoice ), InitError); VoiceName n; WCHAR * w_id = 0L; WCHAR * w_name = 0L; CComPtr<ISpObjectToken> voice; SysCall( d->voice->GetVoice(&voice), InitError); SysCall( SpGetDescription(voice, &w_name), InitError); SysCall( voice->GetId(&w_id), InitError); n.name = QString::fromWCharArray(w_name); n.id = QString::fromWCharArray(w_id); voice.Release(); if (n.id.isEmpty()) throw InitError(Where+"No default voice in system"); d->name = n; d->ptrs << this; } QtSpeech::QtSpeech(VoiceName n, QObject * parent) :QObject(parent), d(new Private) { ULONG count = 0; CComPtr<IEnumSpObjectTokens> voices; CoInitialize(NULL); SysCall( d->voice.CoCreateInstance( CLSID_SpVoice ), InitError); if (n.id.isEmpty()) { WCHAR * w_id = 0L; WCHAR * w_name = 0L; CComPtr<ISpObjectToken> voice; SysCall( d->voice->GetVoice(&voice), InitError); SysCall( SpGetDescription(voice, &w_name), InitError); SysCall( voice->GetId(&w_id), InitError); n.name = QString::fromWCharArray(w_name); n.id = QString::fromWCharArray(w_id); voice.Release(); } else { SysCall( SpEnumTokens(SPCAT_VOICES, NULL, NULL, &voices), InitError); SysCall( voices->GetCount(&count), InitError); for (int i =0; i< count; ++i) { WCHAR * w_id = 0L; CComPtr<ISpObjectToken> voice; SysCall( voices->Next( 1, &voice, NULL ), InitError); SysCall( voice->GetId(&w_id), InitError); QString id = QString::fromWCharArray(w_id); if (id == n.id) d->voice->SetVoice(voice); voice.Release(); } } if (n.id.isEmpty()) throw InitError(Where+"No default voice in system"); d->name = n; d->ptrs << this; } QtSpeech::~QtSpeech() { d->ptrs.removeAll(this); delete d; } const QtSpeech::VoiceName & QtSpeech::name() const { return d->name; } QtSpeech::VoiceNames QtSpeech::voices() { VoiceNames vs; ULONG count = 0; CComPtr<IEnumSpObjectTokens> voices; CoInitialize(NULL); SysCall( SpEnumTokens(SPCAT_VOICES, NULL, NULL, &voices), LogicError); SysCall( voices->GetCount(&count), LogicError); for(int i=0; i< count; ++i) { WCHAR * w_id = 0L; WCHAR * w_name = 0L; CComPtr<ISpObjectToken> voice; SysCall( voices->Next( 1, &voice, NULL ), LogicError); SysCall( SpGetDescription(voice, &w_name), LogicError); SysCall( voice->GetId(&w_id), LogicError); QString id = QString::fromWCharArray(w_id); QString name = QString::fromWCharArray(w_name); VoiceName n = { id, name }; vs << n; voice.Release(); } return vs; } void QtSpeech::tell(QString text) const { tell(text, 0L,0L); } void QtSpeech::tell(QString text, QObject * obj, const char * slot) const { if (d->waitingFinish) throw LogicError(Where+"Already waiting to finish speech"); d->onFinishObj = obj; d->onFinishSlot = slot; if (obj && slot) connect(const_cast<QtSpeech *>(this), SIGNAL(finished()), obj, slot); d->waitingFinish = true; const_cast<QtSpeech *>(this)->startTimer(100); Private::WCHAR_Holder w_text(text); SysCall( d->voice->Speak( w_text.w, SPF_ASYNC | SPF_IS_NOT_XML, 0), LogicError); } void QtSpeech::say(QString text) const { Private::WCHAR_Holder w_text(text); SysCall( d->voice->Speak( w_text.w, SPF_IS_NOT_XML, 0), LogicError); } void QtSpeech::timerEvent(QTimerEvent * te) { QObject::timerEvent(te); if (d->waitingFinish) { SPVOICESTATUS es; d->voice->GetStatus( &es, NULL ); if (es.dwRunningState == SPRS_DONE) { d->waitingFinish = false; killTimer(te->timerId()); finished(); } } } /************************/ void QtSpeech::pause(void) const{//暂停 SysCall( d->voice->Pause(), LogicError); } void QtSpeech::resume() const{//恢复 SysCall(d->voice->Resume(), LogicError); } void QtSpeech::stop() const{//停止 SysCall(d->voice->Speak(NULL, SPF_PURGEBEFORESPEAK, 0), LogicError) } /***************************/ //}
基于Qt的词典开发系列
- 词典框架设计及成品展示
- 本地词典的设计
- 开始菜单的设计
- 无边框窗口的缩放与拖动
- 无边框窗口的拖动
- 界面美化设计
- 调用网络API
- 用户登录及API调用的实现
- JSON数据解析
- 国际音标的显示
- 系统托盘的显示
- 调用讲述人
- 音频播放
- 自动补全功能
- HTML特殊字符及正则表达式
- 后序
原文:http://blog.csdn.net/tengweitw/article/details/38306803
作者:nineheadedbird
【Qt编程】基于Qt的词典开发系列<十二>调用讲述人的更多相关文章
- 【Qt编程】基于Qt的词典开发系列<十>--国际音标的显示
在年前的一篇文章中,我提到要学习Qt.于是在这学期看了一个月的qt.现在大致对qt有了一些了解.但是现在导师又把我调到了android应用开发平台,所以说qt的学习要搁置了.本打算这学期做一个单词查询 ...
- 【Qt编程】基于Qt的词典开发系列<十五>html特殊字符及正则表达式
1.html特殊字符的显示 我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示: 上图给了最常用的特殊字符的显示,下面我们 ...
- 【Qt编程】基于Qt的词典开发系列<十四>自动补全功能
最近写了一个查单词的类似有道词典的软件,里面就有一个自动补全功能(即当你输入一个字母时,就会出现几个候选项).这个自动补全功能十分常见,百度搜索关键词时就会出现.不过它们这些补全功能都是与你输入的进行 ...
- BizTalk开发系列(十二) Schema设计之Group与Order
开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档.因此消息的格式为XML Schema(XML Schema 用于描述 XML 文档的结构).虽 ...
- UWP开发砸手机系列(二)—— “讲述人”识别自定义控件Command
上一篇我们提到如何让“讲述人”读出自定义的CanReadGrid,但“讲述人”仍然无法识别CanReadGrid上绑定的Command.XAML代码如下: <StackPanel> < ...
- 【Qt编程】基于Qt的词典开发系列<二>--本地词典的设计
我设计的词典不仅可以实现在线查单词,而且一个重大特色就是具有丰富的本地词典库:我默认加入了八个类型的词典,如下所示: 由于是本人是通信专业,因此加入了华为通信词典.电子工程词典,又由于我喜爱编程,也加 ...
- 【Qt编程】基于Qt的词典开发系列--后序
从去年八月份到现在,总算完成了词典的编写以及相关技术文档的编辑工作.从整个过程来说,文档的编写比程序的实现耗费的时间更多.基于Qt的词典开发系列文章,大致包含了在编写词典软件过程中遇到的技术重点与难点 ...
- 【Qt编程】基于Qt的词典开发系列<六>--界面美化设计
本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...
- 【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计
这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1.window 7的开始菜单 2.有道词典的主菜单 3. ...
随机推荐
- React Native组件只Image
不管在Android还是在ios原生的开发中,图片都是作为控件给出来的,在RN中也有这么一个控件(Image).根据官网的资料,图片分为本地静态图片,网络图片和混合app资源.一下分类介绍来源官网. ...
- python 如何优雅地退出子进程
python 如何优雅地退出子进程 主进程产生子进程,子进程进入永久循环模式.当主进程要求子进程退出时,如何能安全地退出子进程呢? 参考一些代码,我写了这个例子.运行之后,用kill pid试试.pi ...
- ERP各个模块的缩写
财务系统模块: Oracle 总帐管理(GL) Oracle 应付帐管理(AP) Oracle 固定资产管理(FA) Oracle 应收帐管理(AR) Oracle 现金管理(CE) Oracle 项 ...
- 【java多线程系列】java中的volatile的内存语义
在java的多线程编程中,synchronized和volatile都扮演着重要的 角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性,可见性指的是当一 ...
- 最简单的基于Flash的流媒体示例:RTMP推送和接收(ActionScript)
===================================================== Flash流媒体文章列表: 最简单的基于Flash的流媒体示例:RTMP推送和接收(Acti ...
- UNIX网络编程——TCP带外数据小结
带外数据概念实际上时向接收端传送三个不同的信息:(1)发送端进入紧急模式这个事实.接收进程得以通知这个事实的手段不外乎SIGURG信号或select调用.本通知在发送进程发送带外字节后由发送端TCP立 ...
- Win7 Eclipse Hadoop2.4插件配置
准备工作: 1.下载hadoop2x-eclipse-plugin-master.zip Github地址:https://github.com/winghc/hadoop2x-eclipse-plu ...
- 【项目管理】 PMBOK 基础概念 (引论 PMBOK 笔记)
好紧张, 3月28考试, 全力学 PMP ~~ 一. 项目 1. 项目的定义 项目 : 项目是为创造 独特 的 产品, 服务 或 成果 而进行的 临时性 工作; -- 独特 : 独特性是项目的特征, ...
- iOS编程中的音频知识(一):文件格式和数据格式,哦!天哪
要明白实际上每个音频文件都有2各部分组成:它的文件格式(或称之为音频容器),和它的数据格式(或称之为音频编码). 文件格式(audio containers)描述文件自身的格式.实际内部的音频数据可以 ...
- windbg分析运行在64位环境下的32位程序的dump
windbg命令如下 1. .load wow64exts 2. !sw 3. ~* kvnf