TTS开发步骤_基于图形界面.doc

上传人:sk****8 文档编号:3150331 上传时间:2019-05-23 格式:DOC 页数:16 大小:99KB
下载 相关 举报
TTS开发步骤_基于图形界面.doc_第1页
第1页 / 共16页
TTS开发步骤_基于图形界面.doc_第2页
第2页 / 共16页
TTS开发步骤_基于图形界面.doc_第3页
第3页 / 共16页
TTS开发步骤_基于图形界面.doc_第4页
第4页 / 共16页
TTS开发步骤_基于图形界面.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、事件驱动的文本语音转换(TTS)实例介绍一个基本的文字转语音的例子,应用程序使用图形界面(非控制台应用程序)建立项目首先,创建一个新的 windows 32 平台应用程序项目,在向导中,选择一个典型的“Hello world!”应用。由此产生的项目代码比命令行版本的长,且大多数新的复杂代码与sapi 关系不大,但是是实现图形界面所必须的代码。 设置 sapi 的路径与 SAPI 相关的文件路径必须在项目中声明。以下是设置“sapi.h”路径的步骤: 1,在菜单上,选择工具“Tools”,然后单击选项“Options”。2,单击“Directories”选项卡。 3,选择“Include Fil

2、es”下拉式选单4,单击最后一行闲置在路径清单,并输入“sapi.h” 的文件路径:“C:/Program Files/Microsoft Speech SDK 5.1/Include”5,选择“Library Files”下拉式选单,并输入“sapi.lib” 的文件路径: “C:/Program Files/Microsoft Speech SDK 5.1/Lib/i386”。最后单击确定。 创建“Speak”菜单命令为了使应用程序响应我们发出“Speak”命令,并且发出声音,需要对自动生成的菜单项做一些修改。读者可以通过 VC6.0 的资源管理器,在“File”菜单下面,增加一个“Spe

3、ak”命令项,并且将该命令项的资源 ID 设置为“IDM_SPEAK” 。后文再讲述如何处理这个命令事件的代码。现在先来编译和运行这个应用程序,确保以上的设置准确无误。程序除了在屏幕上面显示“Hello world”之外,其它什么事情也没做,但是它确实可以运行起来了。使用这个实例第 1 步:初始化 com 第 2 步:设置声音第 3 步:讲!第 4 步:设置感兴趣的事件第 5 步:确定事件类型第 6 步:响应事件第 1 步:初始化 com 用一个 winmain 中的程序段说明。唯一的限制是在使用任何 sapi 的特定代码前 com必须是初始化完成了,并且在运行 sapi 过程中,COM 一直

4、都是活动的。既然 sapi 是用initinstance 来实例化的,COM 的初始化就应该在 initinstance 之前被初始化 ,并在消息环之后被撤销。程序清单 1:粗体字代表着这个例子的新代码if( FAILED( CoInitialize(NULL) ) )return FALSE;/ Perform application initialization:if (!InitInstance (hInstance, nCmdShow) return FALSE;hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_GUIAPP)

5、;/ Main message loop:while (GetMessage(DispatchMessage(CoUninitialize();第 2 步:设置声音一旦 com 运行后,下一步就是要创建语音对象。这里需要用到cocreateinstance() 。正如上一篇中的命令例子中说, sapi 使用很多智能的默认配置。所以只要进行很少的初始化,你即时可以使用语音对象。这些默认配置放在在语音属性,控制面板,一个可选的声音模式(如果你的系统有一个以上的),和语言(英文,日文等)。有些则默认是显而易见的,其他的就没这么明显(如讲话速率,基音周期等)。不过,你可以以编程的方式或通过控制面板来改

6、变所有的默认配置。为求简洁和方便起见,这个例子使用了特别的处理方式。首先,它使用initinstance ( )来初始化的声音。这是最简单的初始化过程。在其他一些应用中,特别是使用语音识别(SR)实例中,程序可能有专门的初始化模块,这样可以使 SAPI 相关的代码与普通的程序代码独立开来。第二,这个语音对象是全局性的。根据你的应用程序的设计和要求,你可能不需要一个全局的语音对象。第三,对下面的代码来说,语音对象建立之后,对象本省和用到的内存立即被释放。显然,如果这个对象有其它用途的话,它是不能被释放的。这过渡性的代码,只是为了做一个简单的说明。最后,如果初始化失败,应用程序应该有更强有力的检查

7、错误机制,更广泛的报告和更详细的资料。 程序清单 2:ISpVoice *pVoice; /SAPI voiceBOOL InitInstance(HINSTANCE hInstance, int nCmdShow)HWND hWnd;hInst = hInstance; / Store instance handle in our global variablehWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst

8、ance, NULL);if (!hWnd)return FALSE;ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);/Initialize SAPIHRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void *)if( SUCCEEDED( hr ) )pVoice-Release();pVoice = NULL;elsereturn FALSE;return TRUE;第 3 步:讲! 要讲话的内容用一个参数传给语音对象。这些内容可以根据程序

9、的具体应用来改变。如前所述,常是从一个对话框或一个文件获取字符串的。另外,字符串也可以从一个流中获取,但就要使用另外一个调用 ispvoice: speakstream 。这个例子使用一个简单的,代码化的句子。Speak 函数可以使用类似于下面的文本Speak(L”I am glad to speak.”,spf_async ,NULL); 这个调用代码是放在 windows 的消息处理函数 wndproc ( )相应的消息处理中的 。选择从文件菜单,选择 Speak 命令,计算机将开始讲: “我很高兴发言。 “ 程序代码 3:ISpVoice *pVoice; /SAPI voiceBOOL

10、 InitInstance(HINSTANCE hInstance, int nCmdShow)HWND hWnd;hInst = hInstance; / Store instance handle in our global variablehWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd)return FALSE;ShowWindow(hWnd, nCmdShow

11、);UpdateWindow(hWnd);/Initialize SAPIHRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void *)if( SUCCEEDED( hr ) )pVoice-Release();pVoice = NULL;elsereturn FALSE;return TRUE;第 4 步:设置事件在 COM 组件中有很多交互动作,这些交互信息将以信息形式出现。sapi 是也一样。信息是在 TTS 或 SR 引擎中产生的,某个特定的事件也是在那里开始和结束的.很多时候,

12、 sapi 或 sapi 的引擎产生的事件是对应用程序有用的。举例来说,当一个识别过程开始的时候,应用程序会得到相应的通知或消息,最终的用户也可以得到相应的通知。同样,应用或许会有兴趣知道什么时候完成了所有的处理,处理完成后,也许要通知用户,甚至关闭引擎或应用本身时。 应用程序处理这些消息时要进行两个步骤的操作。首先,它需要接收一个来自 sapi 的或 sapi 的引擎的消息。这个消息是程序自定义的.但是,所有的活动 sapi 都使用相同的消息通知应用程序。要确定确切的正在发生的活动,更多的资料是由 sapi 的提供的。一个完整的清单,请参见 speventenum。 第二个步骤。得到通知后,

13、应用程序要检查一个事件结构,这个事件结构是由SAPI 完成的.利用这个结构来确定具体是发生了什么事件(见第五步骤).设定感兴趣的事件:程序可以用 setinterest 来设置感兴趣的事件。默认情况下,TTS 不向程序发出任何事件通知,而语音识别只发出( spei_recognition )消息。也就是说,如果程序忽略了 setinterest 的调用,TTS 应用程序是得不到任何事件通知的,而 SR 程序只能得到识别完成的通知和消息。在任何时候都可以改变感兴趣的事件。设定消息不论以何种事件,应用程序都应该将一个消息与 sapi 联系起来 。程序通过调用 setnotifywindowmess

14、age 来完成这个任务 。有三类消息可以使用,但至少少用其中一种。第四类是为多线程应用的,在这里没有用到。这四种消息可以参见 ispnotifysource 节的介绍。实际使用的消息名字和值由程序决定,本例子使用了 WM_USER 消息。程序清单 4:/Initialize SAPIHRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void *)if( SUCCEEDED( hr ) )pVoice-SetInterest( SPFEI(SPEI_WORD_BOUNDARY),SPFEI(

15、SPEI_WORD_BOUNDARY) );pVoice-SetNotifyWindowMessage( hWnd, WM_USER, 0, 0 );elsereturn FALSE;第 5 步:确定事件如前所述,使用事件来工作需要 2 个步骤。首先是使用一个简单和标准的做法社设置和使用 Windows 消息。消息是被发送到程序的消息环中的。在这个例子里, wndproc( )接收 wm_user 讯息。一旦讯息是捕获,其余事情靠 sapi 函数 来完成。 第二个步骤是,以确定哪些消息发生了。 Sapi 使用 spevent 和 getevents 方法来确定具体的事件和消息。通过这两个函数,

16、你可以获取指定的事件信息和事件类型。在 SPEVENT 的成员 eeventid 恰恰是 setinterest 所设定的值 。该spevent 结构必须在首次使用时被初始化。而且重新使用之前也要被清除。可以使用 spclearevent 来完成清除工作。 有可能事件和消息发生的速度比应用处理速度要快。这是一个常见的情况。 getevents 可以一次性取出一个以上事件。这程序对这些这些事件进行批处理,一般专业应用程序是需要这样做的。另一种方式来处理这种情况,是用一个while 循环。一个一个的检索出每一事件。请看下例。程序清单 5:case WM_USER:SPEVENT eventItem

17、;memset( while( pVoice-GetEvents(1, default:break;SpClearEvent( eventItem );第 6 步:响应事件一旦事件和消息是确定后,编程变得更加标准了。在这个例子中,应用程序使用 spei_word_boundary 消息来取定每一个单词。可以用 getstatus 函数和spvoicestatus 结构。来获取更详细的信息。一个独立的单词,可以用事件发生时的第一个字母和最后一个字母的位置来确定。在这个例子中,使用 MessageBoxW 来显示所讲的单词。在说话过程中,屏幕是实时更新的,并显示实际发言的文字。这个特点是由spf_

18、async 标志控制的。如果在 Speak 函数中使用 NULL 参数,而不是SPF_ASYNC 参数,那样就要等整句话说完之后,才显示消息框。pVoice-Speak( theString, SPF_ASYNC, NULL);程序代码 6:case SPEI_WORD_BOUNDARY :SPVOICESTATUS eventStatus;pVoice-GetStatus( ULONG start, end;start = eventStatus.ulInputWordPos;end = eventStatus.ulInputWordLen;wcsncpy( tempString, theS

19、tring + start , end );tempString end = /0;MessageBoxW( hWnd, tempString, L“GUIApp“, MB_OK|MB_ICONWARNING );break;总结:最后,总结一下这个例子的主要知识点:1,初始化 COM: CoInitialize 和 CoUninitialize2,建立语音对象实例:CoCreateInstance3,讲话:Speck4,设置感兴趣的事件:SetInterest 设定 SAPI 返回的消息 :setnotifywindowmessage5,消息来时,确定事件类型:GetEvents清除事件结构

20、:SpClearEvent6,相应事件时,用 GetStatus 确定当前 SAPI 的状态最后完整的实例代码:/ GUIApp.cpp : Defines the entry point for the application.#include “stdafx.h“#include sapi.h#include “string.h“#include “resource.h“#include “sphelper.h“#define MAX_LOADSTRING 100/ Global Variables:HINSTANCE hInst; / current instanceTCHAR szTi

21、tleMAX_LOADSTRING = _T (“Speak Hello world App“); / The title bar textTCHAR szWindowClassMAX_LOADSTRING = _T (“SpeakWinClass“); / The title bar text/For SAPIWCHAR theString30;ISpVoice *pVoice; /SAPI voice/ Forward declarations of functions included in this code module:ATOM MyRegisterClass(HINSTANCE

22、hInstance);BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)/ TODO: Place code here.MSG msg;/ HACCEL hAccelTable;/ In

23、itialize global strings/ LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);/LoadString(hInstance, IDC_GUIAPP, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);if( FAILED( CoInitialize(NULL) ) )return FALSE;/ Perform application initialization:if (!InitInstance (hInstance, nCmdSh

24、ow) return FALSE;/hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_GUIAPP);/ Main message loop:while (GetMessage(DispatchMessage(CoUninitialize();return msg.wParam;/ FUNCTION: MyRegisterClass()/ PURPOSE: Registers the window class./ COMMENTS:/ This function and its usage is only necessary if you want this code/ to be compatible with Win32 systems prior to the RegisterClassEx/ function that was added to Windows 95. It is important to call this function/ so that the application will get well formed small icons associated/ with it./ATOM MyRegisterClass(HINSTANCE hInstance)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 建筑建材

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。