|
|
////////////////////////////////////////////////////////
+ r$ {% O* ]5 n @( T) W. c) G) Q//1,生成动态连接库时,要#define USE_SPEECH_DLL,5 |# ^1 W" e/ Y1 Y3 m+ ^- ~
// 并且#define LANE_SPEECH_EXPORTS% \( A3 e9 |6 C6 r: }7 k
//2,使用动态连接库时,要#define USE_SPEECH_DLL
6 Q5 q1 Z! Y( b, e; W8 @2 d//3,声称和使用静态连接库时,什么都不需要9 r- D/ Z- O. x9 ]( c5 l; f
//4,另外主程序中静态连接库要调用的方式里要调用CoInitialize( NULL )和CoUninitialize(),0 ]7 [9 f" \$ m4 T/ Y+ ]
// 动态连接库就不用调用了。
5 Z) V }( a* Y8 X: q////////////////////////////////////////////////////////% V; ~2 {; `. n5 v2 W7 {9 V
#ifndef LANE_SPEECH_H' ~8 g! h7 Z5 W' G/ h! `% m
#define LANE_SPEECH_H2 C0 F3 z2 C4 h( V! u7 Q6 f6 N
8 @' l* e2 q( A. W) t8 {& h1 m#include <windows.h>( N! Q+ |$ h3 y. i# ^. S9 B# ~9 D
#define _ATL_APARTMENT_THREADED
1 f$ M$ R& W- N0 O: f#include <atlbase.h># E: l! i9 k! ~9 O1 L6 i, }
extern CComModule _Module; //You may derive a class from CComModule and use it. if you want to override something,but do not change the name of _Module3 l7 I- x* W }. I" u4 c9 b: p9 X
#include <atlcom.h>
0 u0 r& [1 ]0 V; u$ `! h3 e#include <sphelper.h> //sapi需要的头文件3 A- c5 l0 P; {: d$ Y2 ^+ p
9 H1 O" G/ L- x* G* A( |
//-----生成动态连接库和静态库的处理----------------, m1 K( V( B: q/ m( R3 _
#ifdef USE_SPEECH_DLL //定义了USE_SPEECH_DLL,就按生成DLL,声明导出导入类
2 d' t8 K, ^7 n; a/ R% Z% B B! S; b9 I& \
#ifdef LANE_SPEECH_EXPORTS
, X, q/ L8 { K. N; `' I( S #define LANE_SPEECH_DLL __declspec(dllexport)/ |- r: [" I; _
#else+ [. e' S' P( D2 `/ q1 V/ |" @+ O
#define LANE_SPEECH_DLL __declspec(dllimport)
0 X2 K w$ o/ ~#endif
) k0 U8 a7 R/ y+ E8 Y
1 [# O: X: S9 @6 ?5 L//这个警告我现在还没闹清楚是怎么回事了,估计是DLL和com或atl有关
# G0 d. M/ ?6 C1 f" z- Y//暂时只能屏蔽掉它,在静态库里就不会出现这个警告。0 K( C- F. P: M: u1 U/ p
#pragma warning( disable : 4251 )
6 A! l: P$ A4 b; ~7 ^& s( S# }& S$ b9 ^- ~" r' C5 S
#else //没定义USE_SPEECH_DLL,则不声明导出或导入类(LANE_SPEECH_DLL就为空)
* q! u$ e% A3 q9 e( u#define LANE_SPEECH_DLL
7 C& g3 L. a7 h9 o/ B- H. b w5 W# V" @
#endif //USE_SPEECH_DLL5 |' L. G# D. Z7 s
" v( _3 a! b$ O' }* @2 Z
& J( }5 x* O: g4 s5 A# t
//***************************常量***********************
: A7 {2 E" i9 W3 K' X
: I" J* N8 ^ _% w. X, e) f/////////公共常量-----------------
" y$ o( J! R, X( u/ F1 Q* qconst DWORD SP_CHINESE = 0x0000; //简体中文.
- u$ h3 H- w0 B! l" I" z: l+ Aconst DWORD SP_ENGLISH = 0x0001; //英语.6 ]) `* H5 |8 q8 ~8 [* j9 W
2 R* `2 q# N6 o- Y/////////CTTS常量-----------------& Q6 \4 l0 c" T9 U" j% X
const UINT WM_SPEAK = WM_USER + 4444; //触发事件产生的消息。
; W9 o* ]9 V* ~* N9 `& o& k5 C, S5 C
/////////SR常量-------------------: P) o/ g7 G3 L
const UINT WM_RECOEVENT = WM_USER + 3333; //触发事件产生的消息。% w' Z7 `. }, M0 }% f Q5 v' W( J
const DWORD SR_INPROC = 0x0000; //独享类型的SR.! b$ s# ]# m# j/ l3 v9 x
const DWORD SR_SHARE = 0x0001; //共享类型的SR.& ~. C0 S/ f& e/ C6 E7 @8 f9 I/ S+ F
3 S' [+ r$ y$ x) S$ N* b" ]//以下常量仅作例子用。+ d! {, F7 k6 q
#define VID_TopLevelRule 9000 //顶级规则ID
+ Y# T. B; I! e& o- L#define VID_SubLevelRule1 9001 //子规则ID4 i" G, s2 ]! C& v5 n* ^7 e; i
#define VID_SubLevelRule2 9002 //子规则ID
: T/ M( J' A" y+ a5 d# \* p. b( B8 t#define VID_SubLevelRule3 9003 //子规则ID
- [. l. N f: s" f, _. |8 M8 w) u4 {+ |! J4 V" m$ Q
3 A1 c- @/ B5 I/ i9 H2 D) K* I2 g//*************************类声明************************6 Y1 ~: `" {2 l; g6 Z
/ X* G; s3 T- |* T
) @" ~" ^: M/ z6 Yclass CSR;/ a+ R7 g. }: ~ _; s" o4 ^
///////////////////////////////////////////////////////////////////////
# n5 q# J( B8 q9 r6 i3 ?3 M9 ?" R///////////////////////////////////////////////////////////////////////! V( T) a& `7 N; B# t& ?5 p* {. b. } V
//
2 l' `) A6 F0 o/ ]" Y" h7 r/ i9 H// CTTS8 v5 Z0 A6 w9 g( v& U' t
//
" L& I& A( }7 T' l& W///////////////////////////////////////////////////////////////////////
* o7 N4 Z. n. w) R///////////////////////////////////////////////////////////////////////
0 q1 p p" X& h& a+ @- p/ V( u5 J. v5 f7 S, a( ~: _3 c
class LANE_SPEECH_DLL CTTS& |% Q* }3 t- N# B) B- ]
{
0 Q7 K' E( H7 m+ T( M- j- kprotected:
+ n% q/ _' L" ^, PHWND m_hWnd; // 关联的窗口句柄。8 u2 J: o9 y2 ~5 i6 I
* ?5 l- t- H( {; v
CComPtr<ISpVoice> m_pVoice; // 声音对象的指针。) q- e) k: Y: u+ Q% d+ h0 ^( C
CComPtr<ISpObjectToken> m_pToken; // token对象的指针。
4 P, n4 {4 J$ D; LCComPtr<ISpAudio> m_pAudio; // 音频对象的指针。(用来保存原来默认的输入流)
! ?0 v* \; ~3 k: ZCComPtr<ISpStream> m_pOutputStream; // 输出到文件的流对象。
8 O% r2 c/ g" L
& h7 P, H0 i( Q( N" U9 Gpublic:0 M6 S1 {2 e: q5 \( Z
//********************************初始化部分********************
: F' i4 Z k9 ^& ` x4 l( \( w F% H% j S$ d
////////////////////////////////////////////////////////////////////5 A1 d7 b$ s; D. T" j. z
//功能: 保存与识别引擎关联的窗口句柄。0 n8 C* w/ Q' N% P; Y. ^7 \* Z( o5 S x
//参数: hWnd:要关联的窗口句柄。0 M3 D$ ?: F3 Y8 P
//返回值: 无。% f- Q# q' f/ d
////////////////////////////////////////////////////////////////////
" o% v h) {# M+ ?CTTS ( const HWND hWnd );
; O- R8 w# P6 Y9 c! ^: f) I
B5 j) J6 L1 i3 P# ^////////////////////////////////////////////////////////////////////
: r# R! Y) t! W2 p% z, J//功能: 释放所有的对象。
$ g1 w" p! B/ z; F//参数: 无。
" ^. V" o4 d8 K# A//返回值: 无。$ l/ i1 i3 s% i- o" b. i% U
////////////////////////////////////////////////////////////////////9 Z E4 O0 P0 M
~CTTS ();- _& @! s/ e) z& V! }! _; V
( J8 f' B1 \% g. ~/ @////////////////////////////////////////////////////////////////////0 s6 S" l$ @0 H+ m
//功能: 建立一个voice对象。设置要是别的语言种类,消息,通知事件。
& f/ q9 @8 F8 {# A4 }$ a//参数: dwLanguage:要朗读的语言种类,SP_CHINESE为中文,
. Y1 H7 T9 J J// SP_ENGLISH为英文。
% X/ c- K- S# e7 p1 B! i' u) R//返回值: HRESULT类型。
3 i3 W, u: E9 `////////////////////////////////////////////////////////////////////
: {6 T0 L) L& Z/ pHRESULT Create( const DWORD dwLanguage = SP_CHINESE );
! ~$ O' i6 L! Z% c7 K2 w/ @- h( C; h& M
////////////////////////////////////////////////////////////////////
; E8 k# @: {7 T8 M6 b+ L//功能: 从一个SR引擎建立一个voice对象。设置要是别的语言种类,消息,
6 Q9 V5 k. E# W9 m8 c/ V% c7 b4 O) l// 通知事件。
# x4 R5 c( O5 n6 D: _7 e//参数: pSRContext:SR引擎的指针。dwLanguage:要朗读的语言种类,
+ W x5 [7 P) Z5 t; f/ b) @// SP_CHINESE为中文,SP_ENGLISH为英文。8 X0 u- `" @ W* }; c
//返回值: HRESULT类型。9 \+ ?/ B) [+ i9 y0 ?) r
////////////////////////////////////////////////////////////////////8 g- f9 B& Y; @( B: u
HRESULT Create ( const CSR * pSR,
6 C- ?( e0 Z2 l2 U( j const DWORD dwLanguage = SP_CHINESE );2 d" a; _1 h+ g" Q( X
/ Q5 l- o3 t( z4 L5 d e5 ?3 Z
' F( m9 r3 z" `0 Z! U3 P3 b
//********************************设置部分***************************************% c3 Q2 b) E! N$ A
- C1 ~! O' X8 U- B: `
////////////////////////////////////////////////////////////////////
8 V+ M) L# p. k: H5 E1 M4 }//功能: 设置朗读声音的语言种类。
+ X. D/ g( A8 u' l4 f/ A# T//参数: dwLanguage:语言种类。SP_CHINESE为中文,SP_ENGLISH为英文。$ q! g) i2 L% N6 N% d' b# \
//返回值: HRESULT类型。( S: _4 ~+ B. z4 c5 Q/ S6 P C# Q
////////////////////////////////////////////////////////////////////
! f" |! z1 J6 [' eHRESULT SetLanguage ( const DWORD dwLanguage );7 A- _) N/ J& h M
2 y1 {4 H/ L- B$ `
////////////////////////////////////////////////////////////////////7 @4 Y- }( Y. f- z7 I
//功能: 设置要处理的的事件。
J9 C$ Q0 K% `; |! g0 x//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,
( C8 r! P# x# f5 j// 设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事, p" A7 @. M4 @
// 件都会收到通知。
O8 ?6 ~* ?: q4 I+ r1 J//返回值: HRESULT。* q7 S( d0 D2 G" ~/ g) C) i5 x# A
////////////////////////////////////////////////////////////////////$ `' ^8 Z# ~7 w( O- H6 B, d1 z4 S: z
HRESULT SetInterest ( const ULONGLONG ullInterest );" ]7 N# W( G2 x l9 s; H1 h
% G& K' P: l1 G9 d# q' U+ I
////////////////////////////////////////////////////////////////////! P4 ^8 ~' @; l A# x
//功能: 设置朗读声音的音量。5 o2 d5 q: F5 Q3 n
//参数: usVolume:音量数值应该从0到100
* Z8 Y. {+ o9 v2 z7 E//返回值: 无。4 y5 W8 q/ V( \( p; l
////////////////////////////////////////////////////////////////////: c1 r% c3 U& R* K% Y2 k
void SetVolume ( USHORT usVolume );- ^. o7 B% N( ?, w3 M
+ y' J$ V; P) p) ]5 g. [. h) T////////////////////////////////////////////////////////////////////* ?0 Z: C; N! I8 ~1 V. y
//功能: 得到朗读声音的音量。, ]" y( q4 t" n; h" q
//参数: 无。; K) X0 Y. Q+ S: g
//返回值: 音量数值,应该从0到100。
9 i( ^( V# \% Y: d# A) {////////////////////////////////////////////////////////////////////4 z3 k% E( t2 k) c# _ `, E
USHORT GetVolume ( );. Z; z4 D! ] p- O& v( w
' l; ^4 Z. G% M; L( V
////////////////////////////////////////////////////////////////////
2 l3 H9 _+ @# D6 I//功能: 设置朗读声音的音速。. r, x s0 N/ _8 F4 v9 d
//参数: RateAdjust:音速,参数范围从-10到10。
2 E4 @3 ?0 z2 k0 s5 o//返回值: 无。
2 u( m/ t" u: G* L////////////////////////////////////////////////////////////////////% j2 a; }+ }6 Y& ~/ k7 W( U
void SetRate ( LONG RateAdjust );
$ D5 w4 B6 F @) [$ b
% X: T8 }. ]6 K# G4 @% D////////////////////////////////////////////////////////////////////6 V" Y" \, t0 f6 ]
//功能: 得到朗读声音的音速。
$ i5 R9 N6 o6 }: K# N. R1 W//参数: 无。
6 C/ C% Q; ~; x//返回值: 音速,参数范围从-10到10。8 N5 C" r6 G( z% q/ Z B3 Q2 I
////////////////////////////////////////////////////////////////////
' E. n" V5 ]# G% _/ KLONG GetRate ( );
/ s6 N) U& D6 p: q& V" q- ~# d5 b0 U( ^3 G1 Z, I* u' l
////////////////////////////////////////////////////////////////////0 d1 J) U! M5 e! u' }. H! r
//功能: 设置朗读的声音流到.wav文件,如果不调用此函数则默认从音箱输出。- f- h: r" K' b0 v3 L, [. J: I: T! U
//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。
4 Y! ?- Y+ w' B. S" n3 P//返回值: HRESULT。
3 h, S, o& }2 o+ {9 a////////////////////////////////////////////////////////////////////
2 S% m* Y5 h. PHRESULT SetOutputWithWav ( const WCHAR *pszFileName = L"TtsOut.wav");& v6 N( b! J5 z" }& x
1 a- V' x0 r; j* G$ ?3 l) R////////////////////////////////////////////////////////////////////# ?4 R( R3 y% i, H: B+ Z: d
//功能: 设置朗读的声音从音箱输出。
8 K" z# ]% v/ ~. ?# e" a9 U- f//参数: 无。
8 P- m) w% I. _. o9 F1 U//返回值: HRESULT。- m% r7 y5 _0 s& |6 B( {
////////////////////////////////////////////////////////////////////
% M2 q5 c$ E& P! NHRESULT UnSetOutputWithWav ();% o0 @- [$ R& F
! D' b9 L9 i/ O' ?* w& j7 s6 w( W
1 | g5 P. X# j* f/ y# V//**********************播放语音,文本到语音转换部分*****************************+ c7 q8 x. x5 [
0 G; q2 [4 e+ d3 l# f6 y////////////////////////////////////////////////////////////////////+ x; d# A( s. ]1 l7 `# o6 [ K; H
//功能: 停止朗读。如果朗读为同步方式,则不能停止。
! ]. c9 Q* [2 {7 L$ {% k//参数: pwcs:要朗读的字符串,需用" L"" "转换,可以是包含xml标记7 L+ s0 Q1 ]0 G" G& j# g
// 的字符串。dwFlags:朗读方式。SPF_ASYNC为异步,SVSFDefault为同步,
. h/ b1 m/ K ^/ Z$ Q// SVSFIsXML为朗读带xml标记的文本。* @ {" O; S& [& @: O
//返回值: HRESULT。0 a" V. S3 h$ W3 E; [ \
////////////////////////////////////////////////////////////////////2 F- X( X5 z5 S& C' R9 n
HRESULT Speak ( const WCHAR *pwcs, const DWORD dwFlags = SPF_ASYNC );9 l; u6 K8 W0 B u3 t) g
; }9 n* t$ K/ ^, C! O+ p/ ]) E2 G
////////////////////////////////////////////////////////////////////+ n5 C; I: u: v, T" { r) L
//功能: 停止朗读。如果朗读为同步方式,则不能停止。" h4 X5 |' x( N' ~& y- D
//参数: 无。' W! x2 ^' i" ~3 N' p _/ I+ w1 L4 o
//返回值: 无。
/ D6 k6 e# @; [& t3 u: j////////////////////////////////////////////////////////////////////
, B# C. Q/ w% H+ P6 L' Evoid Stop ( );
0 b1 o! `* w! S$ Y4 D% o2 O' S( r* H9 M0 l5 S$ D# P& l
////////////////////////////////////////////////////////////////////
8 U, k7 W8 u0 @+ ?5 h//功能: 暂停朗读。如果朗读为同步方式,则不能暂停。
0 h Z, G) _% }. c! \9 A. [//参数: 无。
$ [/ f& m+ V7 W' c' @//返回值: 无。. s$ e+ h3 o a
///////////////////////////////////////////////////////////////////// ]2 E" C2 | M; {( y7 s2 ]9 {
void Pause ();
8 ~. d# f( j, a4 s/ N. b# [7 b8 T# u: B7 D
////////////////////////////////////////////////////////////////////
; f9 S* G4 r- M$ Q/ q//功能: 从暂停的地方继续朗读。3 Y( Q9 r5 v# h7 O# w
//参数: 无。
& x- i' V/ r4 v A; R6 \//返回值: 无。8 t; R$ ]0 ~( T/ ^8 q
////////////////////////////////////////////////////////////////////3 ~& D& o; [# ]
void Resume ();0 ]0 P ^6 |3 I5 ]7 s% E, m% c
( W. [2 T2 |$ O8 f) M% w: | J0 [; s) I1 w3 E
//********************************处理事件部分***********************************' Y* [0 m1 Y# f; O
: d: @) N; y6 ~/ x# ^
public:
; O. \# H; l/ B Y////////////////////////////////////////////////////////////////////: ?& A' K0 V( s- Y7 O1 L' ]
//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。
; ~8 E; W7 J& f. N//参数: 无。 M: Y5 r' m' F& M
//返回值: 无。+ U P1 v$ f" i/ t2 f
////////////////////////////////////////////////////////////////////
' Q$ N. ~5 w. l: D& G' E% _void ProcessTTSEvent ();
! O& H" y( Z- Y' O. L
% R/ p T9 G& K0 {* c. {
# A# O" n+ [0 `/ N9 l) E5 x////////////////////////////////////////////////////////////////////" g. X8 N Z$ E8 @$ z
//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。: t) b X3 ]; n
//参数: 无。
! t) x. ]9 m6 \1 g2 @//返回值: 无。
7 f' A! d# p* `6 r6 s6 P$ ]$ c) X////////////////////////////////////////////////////////////////////8 b1 p6 [) `5 ~3 L6 L; f
virtual void OnStreamStart ();* S/ o9 R2 g! ?( v6 i) s
0 H. d% d* i/ {////////////////////////////////////////////////////////////////////
$ [, y4 C6 j6 u3 h6 a//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。
' \7 X; y& z6 h; S9 p//参数: 无。
# ~0 v$ J+ v# A6 @! V3 q9 S3 u//返回值: 无。
2 G7 U' `! D9 ~2 ^: O////////////////////////////////////////////////////////////////////2 n( c0 l' Q' J7 ]3 _- o
virtual void OnStreamEnd ();& R& N+ B0 d- p% Q5 s2 w' C
};6 B+ p5 R' F7 [3 H( ~& ^
! Y% b0 h1 B8 p9 l
& b0 v. j! _/ a' e9 M! l
///////////////////////////////////////////////////////////////////////
7 ]& P4 W5 G+ e- N: j; R, P' u# e///////////////////////////////////////////////////////////////////////
' b0 w3 z+ f& n// CSR
7 d; ^- h9 i. c- f; @//
) u, `2 X7 C0 g2 _& G- f7 a///////////////////////////////////////////////////////////////////////0 T3 d& @( u8 s$ w+ C9 Y9 [5 z8 u
///////////////////////////////////////////////////////////////////////
3 |2 V, P6 V$ V- G. k1 s
0 ^2 w& w! h5 v y0 B# K$ k gclass LANE_SPEECH_DLL CSR
! L. W, r3 s1 I% x9 L{! q- k- e* W" k3 Z
8 c1 ?% O9 Q8 r3 ^$ Q5 @5 b, A
protected:
! Z: l2 N+ s" R$ Y5 y4 iHWND m_hWnd;
0 [ D6 m5 |/ ? V' S" w% j: \0 f. I; I/ Z" @* Z" c3 `6 a4 l% s, [; E
public:" y6 V# p! j4 X5 K! N5 P
CComPtr<ISpRecognizer> m_pSREngine; // 语音识别引擎(recognition)的接口。# d: a& E" C( ?+ E4 s
CComPtr<ISpRecoContext> m_pSRContext; // 识别引擎上下文(context)的接口。9 i+ }* I" R0 h. C9 f x0 @1 i$ I
CComPtr<ISpRecoGrammar> m_pSRGrammar; // 识别文法(grammar)的接口。
5 W$ a* N! u/ K* j. lCComPtr<ISpStream> m_pInputStream; // 流()的接口。
* I8 ^$ W+ M9 a! F" OCComPtr<ISpObjectToken> m_pToken; // 语音特征的(token)接口。
0 l# H7 w; D0 A0 @1 }% ~# P8 n! ]CComPtr<ISpAudio> m_pAudio; // 音频(Audio)的接口。(用来保存原来默认的输入流)
( }* {* i `5 A7 X1 K8 gpublic:' }0 j9 b( ^2 X% M& M( v
static ULONGLONG ullGrammerID; // Grammer的标识符, 64位无符号整型 每建立一个Grammar,加一。
8 y7 ^0 m" ^5 |+ w: D7 {
+ F( ]9 x2 d& p) p9 Q U3 G* I
1 c2 O+ A4 W- }1 g! sprotected:/ ?% G7 B& ]7 |( J( a$ e3 f# ?
//***************************辅助功能部分**************************************** r4 ]) _7 o3 o& S. E
0 d) J& q/ l5 @6 R
////////////////////////////////////////////////////////////////////! y, Y! V: H9 {, a8 h8 Q* H7 D2 S
//GrammarID加一,每个GrammerID必须不同。5 g ]! R5 c) j6 m( S" z
////////////////////////////////////////////////////////////////////- B3 N2 N/ w, L( x+ G
static void UpdateGrammerID ( );
4 O* N+ F) ~0 _7 j) E w5 i9 Y3 Y7 B9 g, ^' U& a: n* s
' Z4 O. ~/ n$ C7 M4 p" K
public:
" W" F% N& j) i////////////////////////////////////////////////////////////////////3 X1 b1 N% k# d! w" g
//功能: 友员。TTS中的从SR引擎中建立voice对象。% f3 Z9 A+ v! m' d. N) J1 M0 l9 p6 p
//参数: pSRContext:SR上下文对象的指针。; U. J7 e" _! v8 P0 M
//返回值: HRESULT类型。+ I. }$ D% A, j- `7 G. z1 F3 `
////////////////////////////////////////////////////////////////////
8 p/ K/ _" m! L/ ]9 Vfriend HRESULT CTTS::Create ( const CSR * pSR,5 Z' ]) ~$ p. v( J% V. f. U
const DWORD dwLanguage );
8 N( W$ W- B" U; x4 o) W
7 W4 j6 o; c" W
) \, K& O' a+ W9 N//****************************初始化部分*****************************************
% I' i; U$ n3 q& \/ r0 ?* B% d7 w) w1 Y
////////////////////////////////////////////////////////////////////
0 T4 y7 D" z, [$ ]//功能: 保存与识别引擎关联的窗口句柄,更新GrammarID。) ]5 x2 A; i1 ]7 P" b
//参数: hWnd:要关联的窗口句柄。5 z/ g! m! p8 ~1 o, E. l( N; n
//返回值: 无。1 g4 E+ P4 i- v& X
////////////////////////////////////////////////////////////////////
( H D- _" E B) z: z* [CSR ( HWND hWnd );
- I- M0 c! y+ m5 V/ t5 F) O6 a
/ b3 y/ ^4 ~1 X4 |$ J d////////////////////////////////////////////////////////////////////
/ @0 q) N; B6 A# W# Z a//功能: 释放所有的对象。" U( ]2 t' H8 k2 {* S
//参数: 无。
1 X/ Q4 p+ j2 K+ B9 O//返回值: 无。
" b) v( l0 O! t1 _: {////////////////////////////////////////////////////////////////////
1 l3 G) A7 e6 ^0 G~CSR ( );
. W8 j$ r3 {5 a) R. I' S) E' a1 w2 Y2 P! k) u$ `
////////////////////////////////////////////////////////////////////$ }2 r' v: V7 l' N. S2 q$ z
//功能: 建立各个接口的对象。设置要是别的语言种类,消息,通知事件,; I6 i9 a& ?. x
// 加载文法文件。
/ C; m9 M. U1 J' x+ u//参数: SRType:识别引擎的类型,SR_INPROC为独享类型,SR_SHARE共享类型。
2 b- v# Z# m( O4 }4 S// pwcGramFileName:文法文件的文件名,要用" L"" "转换为WCHAR型。
! j n9 m- K) B& l& k7 X// dwLanguage:要是别的语言种类,SP_CHINESE为中文,SP_ENGLISH为英文。
4 S2 S4 } Z( r0 i//返回值: HRESULT类型。
, W1 T) G! O# g8 O! b7 E: H* ` A////////////////////////////////////////////////////////////////////
% C2 h% z7 v$ S L# D* ^HRESULT Create (const DWORD SRType,# Z. X: g- H( I4 Z/ T
const WCHAR *pwcGramFileName = L"grammar.xml",6 u8 k& j) Y2 N! {; x" V- n1 e
const DWORD dwLanguage = SP_CHINESE );" _6 ] j4 ~! B; C1 J5 }7 z/ u: a: i
' ^8 d/ w7 _& N$ o
! d$ C" f0 S4 v M//**********************************设置部分*************************************
: f$ k5 b1 B1 z0 y$ E1 a
2 P _# c$ P2 _7 K% O5 F////////////////////////////////////////////////////////////////////2 m5 D6 x6 l0 `
//功能: 设置要处理的上下文接受的事件。% C! r: D5 r! l& t2 g
//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,: d H9 K' T& E6 b% b& e
// 设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事8 T$ t- l2 W& d9 O! e$ {0 c
// 件都会收到通知。
1 N8 G$ a2 i( K//返回值: HRESULT。. ?% B# Q* S! A' b# k% j* T4 ?, n
////////////////////////////////////////////////////////////////////
8 A9 e1 r# w8 D1 K. k3 v$ sHRESULT SetInterest ( const ULONGLONG ullInterest );
* O) G# W3 E' I0 k# q' v5 n2 L
; H7 Y: {8 B' M* d0 x- k* z c3 x( Y////////////////////////////////////////////////////////////////////
: ^' f" I0 Z* K/ H. p//功能: 设置某个规则的状态(激活或者取消激活)。1 M7 x x0 Y% `
//参数: pszName:规则名,要用" L"" "转换。bFlag:TRUE表示激活,: ~4 @& f; n9 k/ i9 H) ]$ c
// FALSE表示取消激活。
6 s" _2 J t# f! x" O//返回值: HRESULT。
5 ^$ O4 p3 {. z3 v////////////////////////////////////////////////////////////////////
7 S- o- O; a5 N" V" u5 {HRESULT SetRuleState ( const WCHAR *pszName, const BOOL bFlag );7 X v6 R$ b% q! x( G5 z
3 C& b3 v# A2 e0 `" ]: b8 P
( n5 ~% l8 ^0 f' V1 J////////////////////////////////////////////////////////////////////
3 s7 @0 T1 X8 M- @* I//功能: 设置识别引擎从.wav文件识别语音,如果不调用此函数则默认从麦克' U8 f- h; T) y% ?7 F3 F g/ O' E' H
// 风输入。
1 i. ?0 c4 {. n. ~. c1 D) e//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。
7 `9 W1 [$ d; X7 s//返回值: HRESULT。$ e& |' f/ t$ S3 X
////////////////////////////////////////////////////////////////////
( r* Z, w" {' [9 O K1 v! @4 Z g/ ?HRESULT SetInputWithWav ( const WCHAR *pszFileName = L"sr.wav" );6 n" e o2 B7 S- h$ x% W3 J* j8 k1 E& m
. R0 G" I) U, ~///////////////////////////////////////////////////////////////////// F: u# i) U2 x1 ?; M/ z# A
//功能: 取消从.wav文件识别。恢复从麦克风识别。- G* t& \# i1 {& \9 s
//参数: 无。' T: |1 t6 O( z4 ]
//返回值: HRESULT。
2 |7 o, E1 \' E& T9 Y' s% ?1 |////////////////////////////////////////////////////////////////////' X( |% l0 Z Y9 x: E
HRESULT UnSetInputWithWav ( );
. y! q1 l8 Z2 X+ Q1 D5 c' p# C4 _5 |5 U' J2 ~+ E: t: ?3 o6 l- {& B
//***********************识别开始,结束,识别结果的处理**************************
" S7 ^5 L7 s" S3 ?' p- V; q' Q8 @0 V# T1 T
' Z5 m7 y% m% t3 \, ]0 P////////////////////////////////////////////////////////////////////
5 e1 ~4 X7 X5 W ]) B! x) t//功能: 识别开始(将所有规则激活)。1 w. ?+ u. c, W9 O3 n# |
//参数: 无
0 O1 M# v6 h! f1 U//返回值: 无。
0 k. P' j+ s+ q. O, C/ D2 a, }+ I////////////////////////////////////////////////////////////////////, \& p/ p6 b# K& ?
void StartRecognize ( );
# ~3 J7 E' G. E+ X- g+ ?" e4 z8 @4 U/ [9 w4 O0 I
////////////////////////////////////////////////////////////////////) F9 I& p, Y& d' ]8 y5 T4 F
//功能: 识别结束(将所有规则取消激活)。% Z. G" O5 u$ s. u; l, p3 L% \
//参数: 无。3 n/ [9 e8 S, V4 d: F7 B
//返回值: 无。
1 n- \; \4 {' W/ M! m////////////////////////////////////////////////////////////////////4 {" h* A: m8 U; R4 i: |4 h
void EndRecognize ( );9 c- O# w% @9 g) }
3 {( n: J6 S4 ]2 Z, d. dpublic:; D k; z$ G, p# [7 U) ^9 Q
////////////////////////////////////////////////////////////////////
2 b' [; t& M; |" V( f( p//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。0 f2 x: j9 H% I: Z l
//参数: 无。
; J2 Q$ u$ ^8 E7 x//返回值: 无。
0 e, f' H: |$ c" P* S: Z////////////////////////////////////////////////////////////////////
6 i% W! J7 X, ]; ^' u6 `# A/ b& o1 L4 gvoid ProcessRecoEvent ( );
f2 E6 l) h# @( X/ N/ K/ `- j" o" ?" d S
protected:
# [! a! r& c/ h! A& t8 Q////////////////////////////////////////////////////////////////////. R* s0 p x9 X% C8 a# L8 e
//功能: 识别成功时要调用的函数。系统自动调用,不需要用户自己处理。# U6 G$ E* f/ D
//参数: pPhrase:ISpPhrase类型。
+ b5 @: q, @/ W; E# ^//返回值: 无。
) ^( J- s7 f/ t1 n. |+ Y$ c% R3 ~+ \////////////////////////////////////////////////////////////////////
O5 z( ~8 P7 o: c! N- l' svoid OnRecoSuccess ( ISpPhrase *pPhrase );! s5 T0 `1 |# ]. {8 G+ |/ r' ^
: w0 N2 v8 ~, H6 ipublic:
6 L0 V3 z/ s, c5 w( O2 n! z////////////////////////////////////////////////////////////////////
: o+ e( G* f0 p) W8 P. x, b/ t4 Q' \//功能: 识别成功后,根据规则的ID决定动作。系统自动调用。虚函数,
, y& W, H8 U( Q// 需要在派生类重载。规则ID必须以常量形式预先定义。1 S+ r3 k3 g& O6 X5 f2 _7 z
//参数: ulRuleID:顶级规则的ID。ulVal:子规则的ID。0 G. u. Z! Y4 x9 ]4 z Y7 _0 i( `
//返回值: 无。
9 Y) B# }5 c9 `////////////////////////////////////////////////////////////////////
+ u( T3 ?& {+ U' Gvirtual void ExecuteCommand ( const ULONG ulRuleID,
6 G: ^1 E/ U9 I/ A const ULONG ulVal );
- G) b; U( ^* z# k5 ]3 a
) F# y2 q; W9 B. w4 a3 D6 m- i/ ]////////////////////////////////////////////////////////////////////
' j, ?" ]1 I/ h0 q2 h; \//功能: 识别失败时的动作,系统自动调用。虚函数,需要在派生类重载。
C: n* C# i4 @# i//参数: 无。9 P* e8 S6 S0 f
//返回值: 无。
, _. @( H# l, M1 g2 c4 C////////////////////////////////////////////////////////////////////
' P% Y; h# F; d8 O: i2 \virtual void OnRecoFail ();
. C9 {# I1 r! k3 [2 Z
7 g- \+ M* T( b% y7 W////////////////////////////////////////////////////////////////////% G' i' `* F+ O: z2 v5 S- c) {# ^
//功能: 为虚函数。当输入流开始时要触发的动作,需要在派生类重载。0 k+ N8 T" E+ n* O# R
//参数: 无。+ y# k6 \3 Y8 @/ R* S+ m. T! g
//返回值: 无。 ~5 o& Z: r8 q+ ?
////////////////////////////////////////////////////////////////////: r6 b5 O: T5 M# A
virtual void OnStreamStart ();- R X* L; @' P' }7 P' O
8 T, I9 o; ]# K& n( ~1 o
////////////////////////////////////////////////////////////////////
6 w- i ^$ u B3 }4 `8 ?* P//功能: 为虚函数。当输入流结束时要触发的动作,需要在派生类重载。
7 X* C# i- ?6 O# o4 A+ f//参数: 无。
6 z* J# s- F# q7 u2 m* d0 c//返回值: 无。
# ?7 f) u$ [9 ^4 A/ c- @////////////////////////////////////////////////////////////////////
4 W* [1 I1 v/ `2 bvirtual void OnStreamEnd ();
& v' |# U/ G' [3 o' G2 [
' l6 C- l8 F( q+ |};
/ @* e; h- e# [4 {1 G
; A9 c1 ~* t S# p
( K! d0 @0 z! [: ? {3 D! h( G& t# q% ]! y, p
#endif //LANE_SPEECH_DLL_H8 w3 S% V. W, x$ G; ]. V' w
I' Z- [1 U* i( w. N; x7 x
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
% ^6 u8 g8 k. |; y; A( z
' ]9 T1 ?/ ?. ~4 g9 i1 d2 b9 i: i' ~////////////////////////////////////////////////////////- b8 ~+ p! z( J8 d3 `6 D6 s
//
' U4 V( D7 h5 X8 J3 T// 文件:LaneSpeech.cpp9 Q1 D+ {/ @2 [1 y8 T" K, p9 D6 ~
// 功能:封装的speech sdk5.1 的文本语音合成(TTS)和语音识别(SR)功能
& V8 n# B8 o4 u2 i: K// 语音识别只支持命令模式,不支持连续模式' E2 N+ S7 p: K \; d$ G, K
// 作者:吕宝虹(Lane), msn: lkjx82@msn.com, qq: 3619908
7 n% ~; W+ Z8 a2 @1 W# B/ u+ D// 日期: 2004.10/ S% T/ s! Y( v! A; J) g- ?' Y
// 版本:1.2
7 Q+ _. W# E/ X2 y// . J+ B2 v& r8 J% B+ Z2 k# X' W' s0 M
//- E3 F% b ^+ y$ y5 y# J
////////////////////////////////////////////////////////
4 j( d: Z8 _6 V# q- o% p
+ v, V' U0 Q. Q
# i- R* g X I" o: A0 p1 K
4 l; y! Q. D/ A7 V% E#include "LaneSpeech.h"
L8 W) O9 D9 y* o9 T5 [% y0 D7 t3 j
//-----生成动态连接库和静态库的处理----------------5 ^& p/ z; e5 ?4 x
#ifdef USE_SPEECH_DLL //定义了USE_SPEECH_DLL,就按生成DLL,声明导出导入类5 ?. ?7 }& o8 L: }2 p1 l1 b7 k
; R0 ^0 e+ _- a; ABOOL APIENTRY DllMain( HANDLE hModule, ) p5 z% `8 k& W+ Y
DWORD ul_reason_for_call, & w C) e1 x( \& @+ v" v( {
LPVOID lpReserved2 P- f, I% A* z" j! Z4 m3 S% i- F' v
)
$ O# g3 k. E" ]" D9 ?' c/ p{4 B% j$ ?# W3 c
switch (ul_reason_for_call), q% t' g' u% H2 c2 \* O
{
0 N: u1 O3 R9 `0 b, L3 r: I case DLL_PROCESS_ATTACH:
3 n* o; L- ?6 B/ e( v/ m) _9 R: f4 { CoInitialize(NULL);
' P/ f' [. P2 W% O% G; \ break;
1 e1 j' _ P* E9 k
+ d0 _5 }1 y# n! a7 N8 ?+ u case DLL_THREAD_ATTACH:
3 y1 z% K8 z" u% Z1 M% Q! Z8 J break;1 O8 y9 }/ G# H8 K! E. O
9 x6 `2 k4 j/ } case DLL_THREAD_DETACH:1 h" q$ L F8 e' k# t( C
break;
* h+ b4 w G& p; r 8 E) C/ G7 e6 V: B$ r
case DLL_PROCESS_DETACH:( p/ n' \3 j& F6 o0 b5 f: s8 F! j# y$ S
CoUninitialize();" t6 n, K; I4 Z" y q( ~
break;
' L; H7 L" _( ~6 }& F. Q: Z }
( i- z' {) [+ q) S! J/ ~/ j S+ [5 t return TRUE;
$ F/ O' ?+ J6 a4 i}
8 ^, K, F* R9 W7 ]# k6 _
1 d! n' q. s+ ?. c3 _; v7 K7 g+ I6 ]#endif //USE_SPEECH_DLL- Z/ X1 j) C, d6 V
# r/ N( {4 z1 g' [2 D5 ?
* b- ~5 \% q! f" z' a
6 g; x9 S3 W0 A' f2 x4 E# F s
///////////////////////////////////////////////////////////////
, I- z# Z1 q. e0 U- Q: c$ _0 N; [8 g5 v# ^) I, V
////////////////////////////////////////////////////////////////////* _4 S8 f2 X8 B0 E
//功能: 弹出一个信息框。! _8 I+ U' m4 z X
//参数: lpText:是对话框信息。lpCaption:对话框标题。2 G( f; b. D$ \
//返回值: 无。
0 r9 l' ^6 A' M4 r% y////////////////////////////////////////////////////////////////////
5 G0 O7 X! c$ q- Y/ e4 I8 Z Linline void ShowError ( const LPCTSTR lpText = "ERROR",: _3 l2 Q* ?1 D" }- R
const LPCTSTR lpCaption = "ERROR" )
/ T7 g& l9 ]5 S+ S; I& ?2 i h{8 h3 I4 i# v0 A2 X- T$ K
::MessageBox( NULL, lpText, lpCaption, MB_OK | MB_ICONERROR );
1 g( i8 p! R! }5 X( `}
6 W7 z6 H+ r9 m. v( Q* \5 s; g8 u4 R; B. V+ P: a5 A( \8 N3 \# J
////////////////////////////////////////////////////////////////////
7 |! r3 v* N }2 j//功能: 检查一个HRESULT类型的值,如果是错误的值则,弹出信息框提示错误。: \, c0 A: _! N' Y* m! T& v x4 i
//参数: hr:要检查的HRESULT的引用。 lpText:是对话框信息。' f: j) c8 k; }. l, j5 b
// lpCaption:对话框标题。
q6 U0 D: t% d//返回值: 有错则为FALSE,没错则返回TRUE。
3 e8 t9 b: X# R9 r////////////////////////////////////////////////////////////////////
; [: P& p) |; p. ]inline BOOL CheckHr ( const HRESULT &hr,$ |+ ?0 O# r0 L( `$ |7 ~0 w
const LPCTSTR lpText = "ERROR",# ]0 n$ D6 Z+ W/ E8 Y% j4 ? g' ?
const LPCTSTR lpCaption = "ERROR" )
. V/ y* S2 [/ J4 T( r H{
/ Z; m7 k8 p3 [8 _2 ~ if ( FAILED( hr ) ) {
/ d* x" W# w; w5 @# y, T6 O ShowError ( lpText, lpCaption );
4 g0 G( e% I) h' y return FALSE;* r" o7 k' }2 }1 w9 l+ \' E7 `7 M; @
}0 W: f1 i# v+ C2 _# ^ z X; T
return TRUE;6 a" J( X+ ?1 h t
}
! Z! W6 f% C4 B+ Q1 D; D3 ^$ P( E% S/ S
v* D c- R* P( p" D, t6 g6 C/ |$ q( A* H
///////////////////////////////////////////////////////////////////////& j! n: E6 n- W9 m
///////////////////////////////////////////////////////////////////////5 w0 M* j5 Q8 l" r% M. r
/// D, [, i9 b; g+ M$ b2 B
// CTTS
0 {' b3 a& _5 `4 z//
! I0 D# f* c* X///////////////////////////////////////////////////////////////////////
d; T4 p2 |" j9 l" U/ {5 U- l7 A///////////////////////////////////////////////////////////////////////
! r8 F! B& I6 b- T0 w6 i' S$ d2 \, c! u3 b9 k6 E
////////////////////////////////////////////////////////////////////" d) h9 ?2 }8 M) B7 O" v" c
//保存关联窗口句柄。初始化COM。
0 g1 k( q. {6 a. F////////////////////////////////////////////////////////////////////
, Q0 S" P8 N4 {( GCTTS::CTTS ( const HWND hWnd )
$ t0 j; P1 X" \7 z' j- f{; q+ O/ l0 |2 _
m_hWnd = hWnd; z5 v! _, u! }! B9 p+ h
m_pVoice = NULL;5 t: e* v, J# v' e( B% R7 s
m_pToken = NULL;6 T* `' _4 _' B3 H# Q" e
m_pOutputStream = NULL;7 j: k0 G0 S7 o& l; s
m_pAudio = NULL;' X' N4 E. G" F" X4 O( u2 v
}
- |4 C( h- W. _; u3 \/ D4 |1 t# Y
+ b+ w! [5 a$ |6 t' b1 h////////////////////////////////////////////////////////////////////
) e, }/ m! o: W. }//释放所有对象。) o9 r, ?8 K7 b" C
////////////////////////////////////////////////////////////////////
: o% B# s" y: y7 w- {0 DCTTS::~CTTS ()
! c1 C# i( d" N: b$ J' f7 S6 A" @) h{
" `6 b- y4 Q8 }- h& N' J3 T& C6 Fif( m_pToken) {8 O$ Y( a. U6 e: Q3 Q& j) p [2 t, V
m_pToken.Release();% S) `& Y1 O- C5 O
m_pToken = NULL;
# N+ |5 b1 q( p1 ~6 x# n4 A) C' ]}
( b* g5 U0 e0 T( @1 iif( m_pAudio ) {7 C. E* a: s! h. M
m_pAudio.Release();
& p; o* u% {+ |2 ]4 f m_pAudio = NULL;
; w/ P2 l" [9 y! v}
* `3 j4 c* i% t( S% s0 Rif ( m_pOutputStream ) {
9 w" M* O# y7 p& ^8 `2 l m_pOutputStream.Release();2 z3 l- o/ ^: V8 C' q2 ~% j0 i
m_pOutputStream = NULL;& ^2 U# Z3 g7 r7 D" ~
}
4 [% l0 d% A3 ^$ U1 a9 Jif( m_pVoice ) {* X! ~: I4 \# ~2 b
m_pVoice.Release();
7 i! G7 p3 X9 e7 {% y# f0 z m_pVoice = NULL;; P4 j* s5 }, m0 @& V0 U/ S
}, a8 ~) C# ^5 |- C9 \1 ~# A0 U% I
}
9 C# e& K9 h; J! |6 _% J* W/ w/ G- e* l; x9 I) C* v
////////////////////////////////////////////////////////////////////
; E+ j; g& u4 t9 N9 J% a//从SR的上下文中得到voice对象。此函数在CSR中被声明一个友员。
2 e; `# O& }7 g f$ G# |6 Q////////////////////////////////////////////////////////////////////
+ B: l" E: `) O0 @- J+ M1 hHRESULT CTTS::Create( const CSR * pSR,
. r* ]( v+ y+ L1 _ const DWORD dwLanguage )5 \, \3 z: i7 E% }8 O
{
! l) |% P B7 r4 O7 e6 OHRESULT hr;
& E6 u; \" b& R) s' Mhr = pSR->m_pSRContext->GetVoice ( &m_pVoice );/ h8 o* R/ A" _4 w" x: Q
if ( !::CheckHr ( hr, "pSRContext->GetVoice()" ) ) {) {* V1 K! F4 N$ o: H# r) [* w, m
return hr;+ f0 p( @# a# K" _4 W+ e* I D
}. M9 Q y8 @. a
( e- N& J. N k+ p* Q! QSetLanguage ( dwLanguage );
3 t7 v/ r4 O4 D) }8 W
- U5 s0 o2 s. h% _4 jhr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );//建立一个默认音频流
" O7 c" A9 \% }if ( !::CheckHr ( hr, "CreateDefaultObjectFodd()" ) ) {5 y2 n/ c( ~; X3 s! A, r7 ?( `" u K
return hr;- x9 z# \& V1 s. a8 ]; G
}2 `% ] M4 T7 P: h, i5 @
* o0 q* j8 w# _2 a8 M; J
//SPEI_START_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM5 N& h% r% ~; l7 u3 H. C
//SPEI_END_INPUT_STREAM 表示完成流输出。
5 [) P9 s) _& k6 ^4 bhr = m_pVoice->SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) |
`( _2 _+ T! P: j: e. g SPFEI( SPEI_END_INPUT_STREAM ),( y6 H5 X$ A1 i* N) ]
SPFEI( SPEI_START_INPUT_STREAM ) |
* U% v5 J; S B0 d/ r' \" T SPFEI( SPEI_END_INPUT_STREAM ) );' X! ^# H( U! }4 n% M
if ( !::CheckHr ( hr, "m_pVoice->SetInterest()" ) ) {
% ]/ t7 ?1 f3 P6 ] return hr;& K! `0 x$ H/ h5 H* ?
}9 }3 W7 s; [0 A7 f/ @
# ]' y5 f6 E2 Z! h Y! L
//设置通知消息
" o0 ]$ [" T. Z% c/ Ghr = m_pVoice->SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 );
- F4 T1 f5 A, u9 N p! l% C D2 Tif ( !::CheckHr ( hr, "m_pVoice->SetNotifyWindowMessage()" ) ) {
0 L! N7 G3 f- B9 \' b return hr;$ C5 Y, `! D+ H5 u4 w Q0 N$ t
}
0 n9 O7 m9 [! _9 P; z
/ t# F( y. t( w$ l$ zreturn hr;
' ]2 Q5 l/ V: \- ^}
8 [0 n& u0 p+ i4 I: P5 e4 j6 x& D9 W9 _% L G
////////////////////////////////////////////////////////////////////
3 ] p% i F9 O( s//单独(相对于从SR的上下文中得到voice对象)建立一个voice对象。
9 X: @5 b) x8 H5 Q! }//并设置兴趣,设置通知事件。
9 A+ V+ T7 C- p. v8 v! | r+ C% K, p////////////////////////////////////////////////////////////////////
2 Z! h! r7 V6 n7 pHRESULT CTTS::Create( const DWORD dwLanguage )
0 @' G; Q) _0 e+ {! Y* I" U& q5 j{& M% f2 D& X8 E: `
HRESULT hr;
" Q' D+ f! f( k" K+ `hr = m_pVoice.CoCreateInstance ( CLSID_SpVoice );
" G+ m! t. d2 e4 N, P3 M" oif ( !::CheckHr ( hr, "m_pVoice.CoCreateInstance()" ) ) {
# S5 x# c, f4 n6 } return hr;
7 h3 h; ^4 E4 B- J& N1 J; X9 e}
. N9 O% F( r& v( r1 E# u s
9 D; G8 d- D7 }7 M! RSetLanguage ( dwLanguage );7 [5 z; W7 J. R: D' V5 u1 U1 ?; l
4 F# |( q; o# B+ `( X/ r0 ^6 [hr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );//建立一个默认音频流- ^9 d) o' d+ n6 ?
if ( !::CheckHr ( hr, "CreateDefaultObjectFodd()" ) ) {
% j5 k7 e0 I9 K- _" w return hr; D* u, Y0 I0 k1 E; j
}" M5 E0 s& J# j; U9 U+ k4 I
3 B+ |- h" x O/ Y) d
//SPEI_START_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM
0 z$ y, U o, ]0 K; ]! S//SPEI_END_INPUT_STREAM 表示完成流输出。7 _6 y! Q* ^4 O/ a' ?- E; _
hr = m_pVoice->SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) |
* L& W1 I7 C. W, h SPFEI( SPEI_END_INPUT_STREAM ),
! H! x8 H8 p) I; R SPFEI( SPEI_START_INPUT_STREAM ) |
: S0 f- p! B1 a1 ?: _. I; y) D9 ~ SPFEI( SPEI_END_INPUT_STREAM ) );" d Z+ a K9 E
if ( !::CheckHr ( hr, "m_pVoice->SetInterest()" ) ) {$ T. ], ]1 t4 ~- b
return hr;5 X9 y8 }& F2 ]% T5 A! T1 j7 \
}
, L; }1 v- _; [3 G
( b4 u* K' {5 d$ Q7 E! ?//设置通知消息
* w9 q7 e) }( z$ yhr = m_pVoice->SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 );7 L' |8 P3 O: F$ O8 P
if ( !::CheckHr ( hr, "m_pVoice->SetNotifyWindowMessage()" ) ) {
2 D9 y- ?& M. q( b return hr;4 v9 Y0 q% Z; |# E5 T
}
/ c; D* r6 f( g/ S/ c
% z- ]. D: j* j' Preturn hr;! X) \0 o8 T% T: r) t. {
}5 s5 D7 J; j' E3 B; R
|
|