找回密码
 注册
搜索
查看: 5547|回复: 2

基于Microsoft Speech SDK 5.1的集成微软语音识别与语音合成代码的类代码(1)

[复制链接]
发表于 2011-5-23 17:04:22 | 显示全部楼层 |阅读模式
////////////////////////////////////////////////////////# [+ t8 A7 r" d; p4 g3 H
//1,生成动态连接库时,要#define USE_SPEECH_DLL,
6 B% ]! h5 c6 z/ e//      并且#define LANE_SPEECH_EXPORTS) Y4 d! `$ l2 B# h4 i
//2,使用动态连接库时,要#define USE_SPEECH_DLL* x7 i7 v. v/ t# C7 y7 g7 D+ c5 y
//3,声称和使用静态连接库时,什么都不需要& V, j' q, @% b; y# K7 H
//4,另外主程序中静态连接库要调用的方式里要调用CoInitialize( NULL )和CoUninitialize(),6 Y1 [3 J5 I1 c7 {5 `
//      动态连接库就不用调用了。8 d  e7 [9 d* |4 T% R& I
////////////////////////////////////////////////////////
8 Q( s! S1 h, D2 e! Y" Y3 C# Z#ifndef LANE_SPEECH_H
5 P7 ]% P+ a+ d% ]9 S! J; }#define LANE_SPEECH_H
7 s7 q- ?  F* f$ l5 I8 M& D! w" Q5 V1 \* |- x. l
#include <windows.h>
- }) R/ s  e  \#define _ATL_APARTMENT_THREADED4 Q9 P' c& I6 `" Q$ n  o
#include <atlbase.h>0 i* a2 {+ I& \# w+ M( D
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 _Module
. `# N6 `7 C6 x( _/ S' K#include <atlcom.h>
% \: I- b9 u9 S) N, @#include <sphelper.h>   //sapi需要的头文件
' s. c3 A1 I/ ^4 @  ]3 t/ i0 {) z* k, }2 p
//-----生成动态连接库和静态库的处理----------------
; F: L/ y. i/ Y  H6 s; n( f#ifdef USE_SPEECH_DLL //定义了USE_SPEECH_DLL,就按生成DLL,声明导出导入类& o, c( _0 B) r& k
- X. p3 A) p4 y% Q3 d
#ifdef LANE_SPEECH_EXPORTS1 J9 p' \1 p* q. E
   #define LANE_SPEECH_DLL __declspec(dllexport)4 X" P  M: z7 L# F
#else6 ]% P* s5 ~! g' o: s) R
   #define LANE_SPEECH_DLL __declspec(dllimport)
2 j) P) o5 k, R# u; [& Z5 A#endif
* r/ T9 u6 d4 g( N! O4 {7 S! w: O# l5 w/ ?/ I2 \1 E5 x2 P! ]
//这个警告我现在还没闹清楚是怎么回事了,估计是DLL和com或atl有关
9 Z6 M, p1 o) |- b: f5 v3 R3 u9 T//暂时只能屏蔽掉它,在静态库里就不会出现这个警告。
" g  H$ |+ y; U+ a: m$ v#pragma warning( disable : 4251 )
6 M$ K' C* x% N" m0 W1 j
4 t9 P1 n! p+ E& ~) K# B; i! V#else     //没定义USE_SPEECH_DLL,则不声明导出或导入类(LANE_SPEECH_DLL就为空)
3 |+ h6 u$ E& h7 `0 u#define LANE_SPEECH_DLL% d6 r+ m  j9 V3 L; @% F1 C

% o: f; A- p. [5 k! [- [. L' T( o#endif //USE_SPEECH_DLL
5 A7 Z/ {0 W2 i/ @( N5 V& T
* t$ q/ F1 u8 N" o: X
( w- D5 u$ B, D5 Z( g//***************************常量***********************
) S" m+ p; E2 z" R/ s. ?$ {: Q% m- `! g0 V3 B
/////////公共常量-----------------+ o: p1 B& H( _4 B& x$ K
const DWORD   SP_CHINESE = 0x0000; //简体中文.1 Z8 c2 [9 ~2 _
const DWORD   SP_ENGLISH = 0x0001; //英语.
! f# o9 G  j+ _& T8 v/ r$ }# P; A5 b# X; X7 M! J5 q1 k4 u
/////////CTTS常量-----------------
. Q9 L& U+ x% ^0 Rconst UINT   WM_SPEAK = WM_USER + 4444; //触发事件产生的消息。, R( ]% J8 U6 Q( Z; W8 U
) {. {5 b# @' i9 ]3 C: D' l5 t
/////////SR常量-------------------
% N; E* x" q) K. j5 Fconst UINT   WM_RECOEVENT = WM_USER + 3333; //触发事件产生的消息。
# D# I  ^' ^( G* Z6 Y, u8 Xconst DWORD   SR_INPROC = 0x0000; //独享类型的SR.
% ]7 |: Z* e7 F- B' g# lconst DWORD   SR_SHARE = 0x0001; //共享类型的SR.' k' H* w! w+ J

% J8 G8 `8 v; J( L5 z4 G//以下常量仅作例子用。
- _. d  i1 g) B( O/ [#define VID_TopLevelRule 9000   //顶级规则ID
. M5 Q) u! O; y- \4 r#define VID_SubLevelRule1 9001   //子规则ID
: Q1 N8 }2 O: ^2 ~1 }6 ~#define VID_SubLevelRule2 9002   //子规则ID) @1 G' k! u# k- N, y0 S
#define VID_SubLevelRule3 9003   //子规则ID, _9 K/ f  s$ t" y
( `% G" l! F0 a" g6 q
) e3 C: z& e9 A8 D( R
//*************************类声明************************
' E- H, m' _' Q; S3 U( D' h/ z/ D* {5 i- T, b
% R, r9 S, w: E! l
class CSR;3 C* p9 |. I- g; u3 b
///////////////////////////////////////////////////////////////////////
4 r( W( L$ @5 ?///////////////////////////////////////////////////////////////////////) X7 b+ `) v" z- X5 l9 O) Y
//
; G, d& }7 Q) @4 z$ s+ M3 n//         CTTS
4 U" A( O0 S. t4 j; N6 s//
3 U; i; n) e+ V3 C' o///////////////////////////////////////////////////////////////////////7 U# o# r4 }7 o4 h
///////////////////////////////////////////////////////////////////////
8 _% }8 |5 b" t# ^; q
5 z+ ]7 l& k; C" k! bclass LANE_SPEECH_DLL   CTTS
# Q' v- s2 A7 w  v0 x8 ]( o2 H# J{
& q* l0 v6 M9 j1 Cprotected:. ?& O2 c1 j; ]. s. L3 }! a. ]8 L
HWND       m_hWnd;     // 关联的窗口句柄。* R3 i& e/ r  l# l# A

) X% {0 O2 ~; |+ X  [CComPtr<ISpVoice>    m_pVoice;    // 声音对象的指针。
4 i6 ?& `+ f6 T% K+ j0 l. gCComPtr<ISpObjectToken>   m_pToken;    // token对象的指针。
0 ]$ O) Q' k/ m$ e- fCComPtr<ISpAudio>    m_pAudio;    // 音频对象的指针。(用来保存原来默认的输入流)) z! _- e+ D6 x/ Z; d' u4 K6 f. p
CComPtr<ISpStream>    m_pOutputStream; // 输出到文件的流对象。
( `( K; p/ s8 g% ?; \; j8 x' p  J! O4 y9 ~4 Z+ j$ H% G
public:
2 X. ^% O5 G! t% p. Z. E3 \//********************************初始化部分********************
; O9 Y. B$ \/ t& ?& e1 @% Z  {7 S8 [; _& h! U' M9 x, F
////////////////////////////////////////////////////////////////////. h6 d0 D$ U0 o: V
//功能: 保存与识别引擎关联的窗口句柄。
9 N- n! s5 x" X, F& x5 _7 E/ m//参数: hWnd:要关联的窗口句柄。
/ R$ v% ]1 `( y& B//返回值: 无。! _% v' R+ r& e0 B$ v3 M! K
////////////////////////////////////////////////////////////////////% W) A+ X% m7 Z
CTTS ( const HWND hWnd );
8 M! ^, e9 z* K
: S/ P( A) z! ^- g! u9 d////////////////////////////////////////////////////////////////////
2 `' ]4 L" s8 `$ f+ g  |: i" H//功能: 释放所有的对象。4 U# a" {$ f8 i+ O
//参数: 无。
1 z3 A7 K: V7 O2 k//返回值: 无。
. A) p: k9 U# U9 _/ j6 x. _////////////////////////////////////////////////////////////////////( N& l3 U9 z+ f
~CTTS ();' D0 L& E( O, M
# e) w* w1 G1 Z" [! z8 c0 p( d3 b
////////////////////////////////////////////////////////////////////
( n# |# |5 U8 x  X* l% o! P//功能: 建立一个voice对象。设置要是别的语言种类,消息,通知事件。
3 H8 Z( @2 z- G+ U: N//参数: dwLanguage:要朗读的语言种类,SP_CHINESE为中文,; N* W7 ?% \7 x
//    SP_ENGLISH为英文。
" @: O; }. ]) d3 l8 H3 `  ~7 j) a9 y; T//返回值: HRESULT类型。8 e' E* s" Q( t" |7 Z
////////////////////////////////////////////////////////////////////* H( Z) s: W7 K5 i4 L) {
HRESULT Create( const DWORD dwLanguage = SP_CHINESE );
, t1 G, M& ^  d% a0 Z) l2 U
! v2 |$ a' P# K# q! q/ b8 l, C6 h///////////////////////////////////////////////////////////////////// }: P# r6 x! x) Q
//功能: 从一个SR引擎建立一个voice对象。设置要是别的语言种类,消息,( o# G5 p+ @! x! f! d2 ]  G
//    通知事件。
+ T7 }4 }( y; q//参数: pSRContext:SR引擎的指针。dwLanguage:要朗读的语言种类,2 |8 ~$ X2 k7 W# u& F1 X
//    SP_CHINESE为中文,SP_ENGLISH为英文。- |8 @. \6 q0 A5 n3 R. N
//返回值: HRESULT类型。
5 O, J- N4 ^3 S7 V% e# r. w% n3 R////////////////////////////////////////////////////////////////////) E) `6 C$ g( Y' ^! X
HRESULT Create ( const CSR * pSR,
/ u- e4 \" \$ ]9 B4 T       const DWORD dwLanguage = SP_CHINESE );. @3 D/ s; R/ |2 E: b

; z) q, p5 }: s$ z/ u% b" f% B( n4 t) z7 d, u1 |: C
//********************************设置部分***************************************5 ?' ~4 o; w- i* r

$ A* `, V4 v- m8 B2 t////////////////////////////////////////////////////////////////////
! S; `' G4 e1 L5 J8 w7 j//功能: 设置朗读声音的语言种类。
, [/ \; e! f7 ~* A3 q& q! Y//参数: dwLanguage:语言种类。SP_CHINESE为中文,SP_ENGLISH为英文。
! q' ]- h% z1 s0 l( L8 j1 p- q8 M//返回值: HRESULT类型。5 |& k( m( ~2 i0 u$ u. Y2 a+ ~; P
////////////////////////////////////////////////////////////////////
. F! Y& C! E- J: vHRESULT SetLanguage ( const DWORD dwLanguage );6 w# J6 q5 W9 h+ u) a3 R6 J0 d, h% E

1 K7 s  a/ |4 U3 Q% U! S  W6 K. u////////////////////////////////////////////////////////////////////
+ X% e, E4 c2 f1 s//功能: 设置要处理的的事件。
( k  M' ?7 R0 b! \, x3 W1 L" M//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,0 x; Z: g8 x& m  W1 N
//    设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事4 w: N, R; @% j9 s4 A
//    件都会收到通知。
: E# g" `0 Q/ y5 l//返回值: HRESULT。' p% X! C" X' E+ K7 X
////////////////////////////////////////////////////////////////////9 t2 ?3 T1 w0 K  T2 w& k! _/ A
HRESULT SetInterest ( const ULONGLONG   ullInterest );
4 t2 S' c* A2 P% |
8 d6 T5 F+ }- J6 a' s! N7 O" F////////////////////////////////////////////////////////////////////
  B. @' W7 a0 c3 _//功能: 设置朗读声音的音量。
, L- d/ s! n- U) v. u- t//参数: usVolume:音量数值应该从0到100
8 e# y. h+ \& G. y* d, c8 T& X//返回值: 无。
% w( j) z8 }$ \0 F" P1 I* A4 p' L////////////////////////////////////////////////////////////////////5 N% @" j9 C1 j" c: D! K% C- V
void SetVolume ( USHORT usVolume );. [4 }) C& _0 |% v: H

3 g1 A3 t3 I  @$ {4 ]/ ]' q////////////////////////////////////////////////////////////////////
3 C8 }+ D% U/ {7 L! L  j" {//功能: 得到朗读声音的音量。
: w3 \7 d9 n  M//参数: 无。
$ S( x3 {  Z7 o3 a2 @//返回值: 音量数值,应该从0到100。
1 P+ I" _& b: s4 |////////////////////////////////////////////////////////////////////$ D% r) m2 p& j( e& {3 X
USHORT GetVolume ( );
8 q6 o8 {/ g+ ^7 p% u1 |7 S0 ?* D$ W$ @$ |% i
////////////////////////////////////////////////////////////////////
) D: ]$ V4 I( f$ n2 P, D//功能: 设置朗读声音的音速。
( f$ C+ B9 y* E- T' V- x' |7 U//参数: RateAdjust:音速,参数范围从-10到10。- q3 B0 }) w" A/ C; u) s8 Q! g
//返回值: 无。
) T6 P7 g# w3 T% ]! V! F////////////////////////////////////////////////////////////////////" z1 L2 V8 D8 @- x, X3 X
void SetRate ( LONG RateAdjust );
) D" a" E* {. i$ P7 u% l4 L* X- w' [" g5 f# p, o5 @3 _4 t
////////////////////////////////////////////////////////////////////
7 _# M9 U( l+ v# X//功能: 得到朗读声音的音速。+ ^( r/ \4 \* w7 @5 J" C+ H8 ]. G
//参数: 无。( w4 ~/ ?  B4 X: g2 E7 ]; V# |
//返回值: 音速,参数范围从-10到10。& w8 M. {. s5 S7 D  J
////////////////////////////////////////////////////////////////////
( E5 s  U3 v' Y5 i# w! tLONG GetRate ( );
" @( R& d. j+ A4 n9 v& W
/ U2 Q9 ~8 {! w: R2 `////////////////////////////////////////////////////////////////////3 L4 I/ t4 J* H& a3 W" E0 K. x  z: ?4 J
//功能: 设置朗读的声音流到.wav文件,如果不调用此函数则默认从音箱输出。
' ~' Z8 k% v9 o/ m0 c% `//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。8 \" v' q# A1 ^! `9 J7 C$ w) k# L
//返回值: HRESULT。. U9 P/ W8 ]/ V: U
////////////////////////////////////////////////////////////////////9 T9 a3 U, b6 S4 V- t" C
HRESULT SetOutputWithWav ( const WCHAR *pszFileName = L"TtsOut.wav");
2 \$ r6 K$ z4 D* s* C( h+ s% L* N
////////////////////////////////////////////////////////////////////* _' N; i! v5 Z6 W
//功能: 设置朗读的声音从音箱输出。2 i4 X" \2 U9 }- {* l
//参数: 无。
) b; O, {+ `4 X  l0 s//返回值: HRESULT。
' ]9 L6 ]7 U" s5 n) S/ f////////////////////////////////////////////////////////////////////, U5 \; x/ k) ]
HRESULT UnSetOutputWithWav ();: m+ a8 |/ |* n) {6 Z! e2 i
2 z( Z0 P1 [( @# ~/ |

1 y8 V7 }7 Z: }; [) e. C, ?//**********************播放语音,文本到语音转换部分*****************************: F+ F; P' p% p, c7 t8 X
+ J( G" K0 p& S7 I; d, Q$ b
////////////////////////////////////////////////////////////////////3 C4 z: [8 d. A4 c
//功能: 停止朗读。如果朗读为同步方式,则不能停止。
" p9 z5 P2 _8 k( L: a6 C2 X//参数: pwcs:要朗读的字符串,需用" L"" "转换,可以是包含xml标记& _3 u  R, {  Q
//    的字符串。dwFlags:朗读方式。SPF_ASYNC为异步,SVSFDefault为同步,
& ], L# {6 G' Z: w( B2 ]! x, C//    SVSFIsXML为朗读带xml标记的文本。
5 ]& l. U0 z8 O! l//返回值: HRESULT。' A1 J# K" l. }* |. C9 a" a
////////////////////////////////////////////////////////////////////0 y7 F4 R% j/ E
HRESULT Speak ( const WCHAR *pwcs, const DWORD dwFlags = SPF_ASYNC );- s7 v3 K7 v! b% z
, }$ F: X. s4 E) `
////////////////////////////////////////////////////////////////////
9 Y) w, n. V# c- F" P+ O//功能: 停止朗读。如果朗读为同步方式,则不能停止。- N: B" f2 k% T( E1 a! _# M' q
//参数: 无。& q) S; }+ @, c5 f9 d  \2 b# T4 M
//返回值: 无。
- l9 ^* {6 |2 P: \( w1 D////////////////////////////////////////////////////////////////////4 B0 G2 }. E. J" W
void Stop ( );
& I$ w1 J2 h4 l9 P% e; `! m3 _4 y/ L4 {6 r6 ^
////////////////////////////////////////////////////////////////////' A% l" \+ ]$ d
//功能: 暂停朗读。如果朗读为同步方式,则不能暂停。* G- r) F2 l3 o, J/ E' g
//参数: 无。
' P1 }- L  Y' i//返回值: 无。" b- I9 w- S) p: |; D
////////////////////////////////////////////////////////////////////
# X; @; a0 Q. `% kvoid Pause ();9 o3 ~5 R! M" d$ u+ L% R+ N
2 L6 Y" p1 O* \  O* L8 _9 J
////////////////////////////////////////////////////////////////////
! c$ D2 f- y( w$ a/ x, p2 D, V//功能: 从暂停的地方继续朗读。- n; E  |- j0 c, q! n6 V$ Y7 {
//参数: 无。& n6 s- H# y* r  n+ y& j4 s/ f: O
//返回值: 无。" x9 p, Z* j7 H0 n
////////////////////////////////////////////////////////////////////
: {7 O. I; @1 U! A; @5 {2 ?' rvoid Resume ();5 Q) l& w. ]. E. d

: `* D) f$ ]. m5 J% t
0 w0 g  h) f7 Y8 f0 g$ l//********************************处理事件部分***********************************
, I, {/ z+ p1 @! O: p( C( n8 R2 A! C* D1 j% X0 G8 l4 n
public:, Z4 A  E# U8 l; p' D0 u0 z1 @
////////////////////////////////////////////////////////////////////# k% L- [  M, p
//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。
2 W3 L8 q0 g9 V* h: D- [# Z) j1 X# M//参数: 无。. J' K# Y5 F: E& S! }$ U* G/ e1 K
//返回值: 无。
/ P* {- D' v# x4 ?////////////////////////////////////////////////////////////////////
7 F6 ?+ i7 P" g$ c. s5 t$ ^void ProcessTTSEvent ();* F7 {0 O( p7 R7 \

$ ^+ i7 k) {7 D; P$ h& Q7 W9 r( [7 E) R+ l1 g" c( I
////////////////////////////////////////////////////////////////////
8 N8 T9 M) t6 W6 t0 T//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。
6 z) N  O0 y4 k0 R" M7 e5 l//参数: 无。2 K/ S+ `# K! ~
//返回值: 无。% Q# E1 [) l6 U
////////////////////////////////////////////////////////////////////
" ~7 V7 \1 W9 a4 xvirtual void OnStreamStart ();
; }# f# J* s3 Y8 C. f, S
$ K3 L5 d5 I9 P////////////////////////////////////////////////////////////////////
) x4 l- C3 \0 Z* t" f//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。/ u" C) u) U+ _4 s  O
//参数: 无。2 n$ Y; s! X, h- r
//返回值: 无。( u9 i( f$ Z  w* n4 }# U1 Q" g
////////////////////////////////////////////////////////////////////- K! I: ~- A9 R+ ^" l8 w/ n% ?
virtual void OnStreamEnd ();
: e# S2 q5 u* T};6 J3 s+ i/ y: h" K
8 g5 G  g# @* f6 v) r4 I" e

/ g! f8 E+ m0 w9 g3 L///////////////////////////////////////////////////////////////////////5 ]3 ~& b( W3 `% j; t
///////////////////////////////////////////////////////////////////////% h+ d6 T1 T  N: E) J
//         CSR- k& g; c* v4 N
//1 c, `5 l; R) C& f. Y. T
///////////////////////////////////////////////////////////////////////. T& n9 V6 F# W* R& J7 d7 D. v
///////////////////////////////////////////////////////////////////////, d+ k& t. ]- i) U" O7 X; x
# A3 D. D! C8 \! Q) l- G# _
class LANE_SPEECH_DLL   CSR
! r8 Q" j+ }4 [7 n2 q) w{
( q: {, W# |4 d' d& c- J$ S
9 s/ R& a) g& V' R2 o/ [1 V7 t, Jprotected:
" H/ C2 B5 g0 d. `HWND m_hWnd;$ D, R1 m/ a0 @7 f

6 A) d, H3 o& \- B' lpublic:2 X' x/ E5 D5 W% E! i$ D; S. Q2 j
CComPtr<ISpRecognizer>   m_pSREngine; // 语音识别引擎(recognition)的接口。
8 s5 P. h' ~" F0 V) _CComPtr<ISpRecoContext>   m_pSRContext; // 识别引擎上下文(context)的接口。
1 g$ O/ A5 @4 E( V; @0 H  @CComPtr<ISpRecoGrammar>   m_pSRGrammar; // 识别文法(grammar)的接口。: x! [0 e" |# W4 t/ D
CComPtr<ISpStream>    m_pInputStream; // 流()的接口。: y; h4 X% _& ?7 [, a7 ^
CComPtr<ISpObjectToken>   m_pToken;   // 语音特征的(token)接口。
' E( P3 J% R! }4 YCComPtr<ISpAudio>    m_pAudio;   // 音频(Audio)的接口。(用来保存原来默认的输入流)3 z1 g+ W# H1 B& d$ C/ I
public:
; L8 w0 y0 k- h5 J$ K0 {; qstatic ULONGLONG    ullGrammerID; // Grammer的标识符, 64位无符号整型 每建立一个Grammar,加一。
0 b! u) r* o& k5 G: H( l+ q* ~6 _' G8 o. m9 z7 n6 Q
, K  P) G2 e3 i. N
protected:
1 t/ |& Q# u& |9 p3 V//***************************辅助功能部分****************************************
3 {8 U( ^" d2 N+ x
  }% s/ w+ j! Y* z////////////////////////////////////////////////////////////////////
  I0 @( _4 L+ Q3 S3 w//GrammarID加一,每个GrammerID必须不同。
2 [5 m& {. u/ |, E7 {! p' c////////////////////////////////////////////////////////////////////
: [2 g$ g# M$ z& O% k5 b- F+ p! Vstatic void UpdateGrammerID ( );4 Z' K5 A* k8 C* e1 Z+ ~: t* K

5 r: C  J# k9 G- \& g8 [. ~% e( C% ?8 p' ?& V0 [5 O
public:3 C7 ]2 S9 W/ j
////////////////////////////////////////////////////////////////////. [" |; U8 s7 y
//功能: 友员。TTS中的从SR引擎中建立voice对象。% ^( o+ _( ^7 X; v7 Q( j, N
//参数: pSRContext:SR上下文对象的指针。* A6 o. s1 L! k% P) T! f3 g
//返回值: HRESULT类型。
- V4 n  R* c2 M////////////////////////////////////////////////////////////////////- g0 x& T- J; P2 u- M) I+ n8 J
friend HRESULT CTTS::Create ( const CSR * pSR,
. q/ i# \3 ^1 _# C1 b+ H5 t# z          const DWORD dwLanguage );
4 g+ o. w# V3 _- J# L( l+ R( U: l
' C, Q# x/ Y  T* n) o
//****************************初始化部分*****************************************
9 w+ A8 s. m+ ]5 B, r7 `3 f( Q! w/ B: H& h: `* w+ y
////////////////////////////////////////////////////////////////////3 V/ K* p  j' D" t
//功能: 保存与识别引擎关联的窗口句柄,更新GrammarID。# |3 m( w5 u, Q& I, [8 |: y
//参数: hWnd:要关联的窗口句柄。  a& P& ^+ e3 z7 f0 K% n
//返回值: 无。
! D8 m" V# e- U1 Z////////////////////////////////////////////////////////////////////9 d! \& f6 t0 T9 M) u9 H
CSR ( HWND hWnd );
' y9 ^3 i* k, S8 F
9 b  Q, j9 w. G6 s; B* |# R////////////////////////////////////////////////////////////////////) i1 D1 s1 m$ r% o% O& N
//功能: 释放所有的对象。+ `! _' z, n, p3 G+ E  T: _
//参数: 无。
' s' a4 q5 O# D1 i: Y; X//返回值: 无。
; q! F  O, z, ~' X% |% e4 W% E3 I0 _////////////////////////////////////////////////////////////////////
- _! ~: H  b- n5 T$ F6 t~CSR ( );
# J+ B- {, u$ n& w4 S2 g3 [( k4 ?% c0 f' n3 G. r! n# m
////////////////////////////////////////////////////////////////////2 ]$ L) r! g3 @
//功能: 建立各个接口的对象。设置要是别的语言种类,消息,通知事件,
% w$ M  S& V$ H  A3 u//    加载文法文件。
! \0 a" a) F6 N( @//参数: SRType:识别引擎的类型,SR_INPROC为独享类型,SR_SHARE共享类型。) K+ c- X7 f. `8 R4 b1 F# N
//    pwcGramFileName:文法文件的文件名,要用" L"" "转换为WCHAR型。! e$ r( x: @1 E. g- j
//    dwLanguage:要是别的语言种类,SP_CHINESE为中文,SP_ENGLISH为英文。9 m$ }# F. t5 b( k0 M& R  S
//返回值: HRESULT类型。3 o/ h( {( L8 }: k9 {; U7 m
////////////////////////////////////////////////////////////////////7 y2 N! N, `1 E
HRESULT Create (const DWORD   SRType,
& o& z9 J/ M9 {      const WCHAR   *pwcGramFileName = L"grammar.xml",* q* u0 ~: }8 P" N
      const DWORD   dwLanguage = SP_CHINESE );
% L5 B  q# T9 {4 a7 `! W! m. Y- b( [; l/ ~
& ]! ?9 ^4 k: \/ k5 i7 R
//**********************************设置部分*************************************' l  Q. M" w6 @" K2 U/ c
1 g, W5 X+ a- Y7 e  S3 V% d
////////////////////////////////////////////////////////////////////
9 V, `$ P( j" u# e! {- N+ p6 f( ~//功能: 设置要处理的上下文接受的事件。
6 K% e8 C7 l, M" G" b" i//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,
. N5 ?1 R! H: R( d8 F; a//    设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事! j* f3 D7 \- Y5 j0 Q* E8 q4 \
//    件都会收到通知。, m" j/ N, `( g% K
//返回值: HRESULT。
3 o0 h/ I, h' J0 k$ H////////////////////////////////////////////////////////////////////
" [; i) ?1 {2 W( I# I4 fHRESULT SetInterest ( const ULONGLONG   ullInterest );
. x/ ~- V% g" {* G
! _% g2 f- R8 n" g" C  P////////////////////////////////////////////////////////////////////
6 `; c$ }0 A$ j//功能: 设置某个规则的状态(激活或者取消激活)。
7 p, {5 ~0 [& S* C$ X5 c//参数: pszName:规则名,要用" L"" "转换。bFlag:TRUE表示激活,  R: \8 l7 U7 ^# i4 F& m
//    FALSE表示取消激活。! t" N: Q# i6 \# F6 E. q' @' l# ]  v
//返回值: HRESULT。
1 B- z8 A9 g2 R* n4 K( G////////////////////////////////////////////////////////////////////1 X# u! N1 g- J  O6 z
HRESULT SetRuleState ( const WCHAR   *pszName, const BOOL   bFlag );
) D) `; M5 r9 @  A7 [8 q/ D4 a1 Z8 c# L! H
, M% T1 Q" d' i0 I% z" Y
////////////////////////////////////////////////////////////////////
- |) ^, C) c' b9 `  A/ @4 ~//功能: 设置识别引擎从.wav文件识别语音,如果不调用此函数则默认从麦克
! L/ u+ L) ~3 @9 I' S//    风输入。; ^; C4 G" e& P
//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。
+ |7 Q8 S3 g, Z9 f8 |& L% ~7 k! s//返回值: HRESULT。5 ?  D' p( w& d0 T( O) [- d, |
////////////////////////////////////////////////////////////////////0 r9 W: O8 e  ?* \9 i3 ^! P" t$ f. s
HRESULT SetInputWithWav ( const WCHAR *pszFileName = L"sr.wav" );
/ U* y0 t% F  O4 J$ A) H
! b4 M- ]1 G6 W5 q! q////////////////////////////////////////////////////////////////////
5 A5 m1 B( _7 d8 ]7 b% m//功能: 取消从.wav文件识别。恢复从麦克风识别。
. K0 ]. T& p. V% l( d0 J; \//参数: 无。
/ f7 n+ f0 I) Q! I//返回值: HRESULT。) ^7 a" g7 q; p6 t- D2 s
////////////////////////////////////////////////////////////////////& h. P# ]+ |  m, o! h8 n
HRESULT UnSetInputWithWav ( );
. g& Z: B9 @# f& X1 r, W
6 o7 D( H% y* p1 `. i; l; K0 @//***********************识别开始,结束,识别结果的处理**************************
$ J% g- b+ d( H* v# r" t
4 G) m0 A4 G6 K0 H! S7 a////////////////////////////////////////////////////////////////////
6 c( m# |/ Z' h; T* ^//功能: 识别开始(将所有规则激活)。" I. K% h4 ^- a0 O; S) N4 C
//参数: 无; O. Y- @/ S0 D* q  A
//返回值: 无。
" m) U1 r# O2 Q6 a6 U///////////////////////////////////////////////////////////////////// R, J; B! @( E, b$ K9 G2 e; `
void StartRecognize ( );, H* c7 }- A5 T3 \2 Y5 _# Q
* ?5 l5 y1 f$ U  J, w  R
////////////////////////////////////////////////////////////////////' w7 ?' ?; R2 m4 l3 c8 o4 Z. @
//功能: 识别结束(将所有规则取消激活)。
  y5 b0 \& |/ C. w" @; v, b//参数: 无。
6 {) k# O/ N) M4 G2 M0 ~//返回值: 无。
2 W7 r  O0 w: C7 ~4 b+ X* ]////////////////////////////////////////////////////////////////////' \% J+ T$ ]( B, O9 L
void EndRecognize ( );
1 ?- R$ f* M3 L7 [+ D+ V' |$ F9 U/ |* v4 w3 }: u  o7 f. P
public:
* @! Y7 _1 i/ V0 y& c5 G1 c. E////////////////////////////////////////////////////////////////////: @# Q- p+ T, N/ G
//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。
1 p- n; J! p# L, }# E//参数: 无。
" Q, P6 i5 A% v' t" u//返回值: 无。
% a1 `! `+ J8 p( e; P' h////////////////////////////////////////////////////////////////////' J9 C* m4 ]2 T4 j8 Y
void ProcessRecoEvent ( );% H% ^: k- T  a1 H8 r

" l4 X, w1 I: d, u, W" }# d) Qprotected:
6 v9 v4 s% E/ s" e# w: Q1 W////////////////////////////////////////////////////////////////////& N6 A% l5 _( _! G' V. \& g' u  ^0 `
//功能: 识别成功时要调用的函数。系统自动调用,不需要用户自己处理。( b/ J! s; _1 e8 U
//参数: pPhrase:ISpPhrase类型。
9 y0 a* e+ [1 d* b6 z8 n! H* q//返回值: 无。0 u+ @- e4 Y5 J
////////////////////////////////////////////////////////////////////
* Q4 h3 t) _4 X" r& xvoid OnRecoSuccess ( ISpPhrase *pPhrase );
  n9 Z' H/ p  C  S  U4 g0 Q  @7 R3 ^
/ s5 o' ^- C, u* ^1 s! Tpublic:
" {2 y- Q) V) c" {////////////////////////////////////////////////////////////////////
1 K: m( V# _' p' o6 K//功能: 识别成功后,根据规则的ID决定动作。系统自动调用。虚函数,, O6 Z' Q: _2 l5 e+ k0 o0 d
//    需要在派生类重载。规则ID必须以常量形式预先定义。
6 j. |7 g( A6 H! ]  p//参数: ulRuleID:顶级规则的ID。ulVal:子规则的ID。
. Q2 H/ s( ~  ?. @//返回值: 无。
, a# _& s5 d. E////////////////////////////////////////////////////////////////////
1 b5 C- H( @( ?  R+ H1 ]virtual void ExecuteCommand ( const ULONG ulRuleID,
0 z7 q# ^+ @" r- @. @% P+ V          const ULONG ulVal );, V. T( `8 g$ p3 I4 ^0 o# N6 @) o$ @7 A
! T; B# b. r9 A; [2 G
////////////////////////////////////////////////////////////////////
: u# U6 _  t( D" d3 W//功能: 识别失败时的动作,系统自动调用。虚函数,需要在派生类重载。
0 m. r& f4 ~" q0 V//参数: 无。
9 @9 t8 b* [# t2 T2 _! f0 c$ j//返回值: 无。- ^) I, j+ ?) g$ s4 s. h
////////////////////////////////////////////////////////////////////
3 s1 U4 X& T0 A" Yvirtual void OnRecoFail ();. k$ x6 w3 q8 P+ d: X

/ }3 h$ _; \* J8 D' D1 P2 U5 K5 W////////////////////////////////////////////////////////////////////: d/ \5 T) O7 N4 o
//功能: 为虚函数。当输入流开始时要触发的动作,需要在派生类重载。- Q: N' x; ~2 q- F" u* g
//参数: 无。
$ u6 n0 b6 C* D' n0 v! @//返回值: 无。3 [6 G. c+ I+ U( p9 J
////////////////////////////////////////////////////////////////////
/ G/ n/ R' Q; a; s( Fvirtual void OnStreamStart ();( P$ Y7 u3 O/ C1 O$ I9 m# a

1 M4 S+ |# c9 }1 f9 T////////////////////////////////////////////////////////////////////6 p  |: \5 X$ D
//功能: 为虚函数。当输入流结束时要触发的动作,需要在派生类重载。
- m. f4 k' [+ C1 t, H3 p. G/ O//参数: 无。
4 m4 t2 G0 W) c7 X8 n' P1 b//返回值: 无。
" M0 K, Q4 d" D  b4 R' c. \////////////////////////////////////////////////////////////////////
) N' ]& X: e- `virtual void OnStreamEnd ();; V  L9 l( X7 _6 z6 Z9 z
6 [& j9 H% }* ]% ]
};
. d/ J. [, t" m/ W& T7 z
; o' I9 t0 z) m2 V( M8 v) Z5 ~, P/ G6 Z. j
* Z9 d  v3 m  I! @/ m
#endif    //LANE_SPEECH_DLL_H
4 f/ I/ U0 Y! {- h0 i' w, d9 r6 I% f+ b5 Z. M
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
& `8 p5 {( S- T" d) I* S# R, b8 s0 S$ h2 ^
////////////////////////////////////////////////////////
( B3 W& l8 |# C" m( e//' E3 c/ I% J0 W. U4 l
// 文件:LaneSpeech.cpp- M) \/ P& l( l, _. K
// 功能:封装的speech sdk5.1 的文本语音合成(TTS)和语音识别(SR)功能
! l7 M2 U7 m' R  i- i//    语音识别只支持命令模式,不支持连续模式& D+ w: a6 R7 z( H9 K: ^
// 作者:吕宝虹(Lane), msn: lkjx82@msn.com, qq: 36199085 b9 H6 Y  g+ b7 ?+ X
// 日期: 2004.10) l* {( x+ R" N. Y
// 版本:1.2" F' j8 D1 E5 f* |, }& S( m6 n' A& Y
//
  j3 C" k4 q, @1 A$ _. _0 l//
# ?6 l) U9 C! J, Y, r8 _0 L- y////////////////////////////////////////////////////////* E+ v8 a: r( ~# z9 m1 ?# b. l* L
/ l) ^" F7 g  Q

6 O* J/ I& |$ I) G. Q1 A% j
3 T# j# w  m) ^; S9 K#include "LaneSpeech.h"$ Q3 _5 j! E# M. `1 C( ~

5 s. E4 l; m  ~//-----生成动态连接库和静态库的处理----------------  X% W0 Q* E; @% s3 T' I$ G
#ifdef USE_SPEECH_DLL //定义了USE_SPEECH_DLL,就按生成DLL,声明导出导入类/ S7 v5 w( C- @& o5 V
. K" c6 ~1 v0 c# F; t2 U4 g3 r+ X
BOOL APIENTRY DllMain( HANDLE hModule,
$ n- D. c9 E2 O7 `                       DWORD ul_reason_for_call,
$ @# k# m; G  v% `7 A                       LPVOID lpReserved1 G0 G6 {7 g5 O& K; B, o
      ), S. [7 ]+ ]8 d" y( }' f2 N
{0 z0 {: q) B3 C
    switch (ul_reason_for_call)
! ^: m& E" U' `{) ?3 o# C$ C2 B% I8 W6 N* Y
   case DLL_PROCESS_ATTACH:' @4 [  U4 ]* D# e! z; b
    CoInitialize(NULL);9 y( z* V/ S- V( p
    break;
* \" ~' {9 D( b, Z1 C  & u6 q/ [7 u; U6 w  `* P
   case DLL_THREAD_ATTACH:
- k/ u& \2 \( ^2 Y8 w' C    break;
- `1 ~# `2 X, X; x5 I# Y; V  & N/ p2 O# {5 _3 d, M7 {3 d0 E
   case DLL_THREAD_DETACH:
- ~* W( M5 U9 N8 |: V1 G    break;
0 I" S2 k$ i' s( y; g  
8 h4 M& l) l6 `3 p   case DLL_PROCESS_DETACH:' h, c& f2 q; Y3 I
    CoUninitialize();
( A/ s% ~0 e2 N8 L: K    break;0 X) [$ x% J7 W( c/ @" b
    }8 w9 u3 ^" ]- T9 V( b* ]/ i3 h# j
    return TRUE;
# ^" J+ t6 q$ Y& b+ s; D" f  y  r}" v5 ^' s( n! j: Y2 g
3 `7 ~' g9 o' r0 d* _4 Y# j
#endif //USE_SPEECH_DLL+ D9 P& y/ q& d2 \, U1 P$ l
) E) I4 `& H5 N2 p

: h" K$ ?/ o) T+ T" u
' Z6 i9 `0 I, N! u: w2 F0 a///////////////////////////////////////////////////////////////
* F/ u% x2 `! f' N5 }) ]0 X. U" |+ E' P
////////////////////////////////////////////////////////////////////
1 u; H4 y- e) j  c( w* x  V//功能: 弹出一个信息框。" E7 A) y+ P4 C( q
//参数: lpText:是对话框信息。lpCaption:对话框标题。" h" X# |* e8 j' }3 T* x/ E9 V
//返回值: 无。. h; f8 j/ C8 j
////////////////////////////////////////////////////////////////////+ \; v' D5 q. n+ g5 @7 G+ X
inline void ShowError ( const LPCTSTR lpText = "ERROR",' R& w) T  E" y3 |
        const LPCTSTR lpCaption = "ERROR" )0 @( o0 M; I6 m+ x6 ?+ D/ K
{* M% ^" ^" e; J  p
   ::MessageBox( NULL, lpText, lpCaption, MB_OK | MB_ICONERROR );+ D6 K2 k8 S2 ^1 J+ H$ W
}6 s6 I' O9 `+ j7 N+ X+ u* [" R
6 ~# ^; Y& @8 n3 w% B
////////////////////////////////////////////////////////////////////, j) |7 y& M4 k& X+ l- _
//功能: 检查一个HRESULT类型的值,如果是错误的值则,弹出信息框提示错误。$ M: |: s0 `; ?+ ~1 n
//参数: hr:要检查的HRESULT的引用。 lpText:是对话框信息。
& P" T4 K. Z  Z3 A//    lpCaption:对话框标题。
2 w8 ^- V3 |5 [" ?# U1 p//返回值: 有错则为FALSE,没错则返回TRUE。
3 g! o2 D+ K, B////////////////////////////////////////////////////////////////////9 Q4 d  k2 x1 {( [5 r
inline BOOL CheckHr ( const HRESULT &hr,
1 q+ i; y' q  o3 U8 E        const LPCTSTR lpText = "ERROR",* U" {" K% L$ W8 T
        const LPCTSTR   lpCaption = "ERROR" )3 `0 m; E6 S4 n3 f" z: X7 t0 i: ~
{* J+ @5 C  C7 o& o- h  p! u2 }( A
   if ( FAILED( hr ) ) {
% ~2 F/ t4 @2 K0 @3 k* W    ShowError ( lpText, lpCaption );& L& [8 Q: |8 x' v8 w
    return FALSE;2 _) ~5 e# a1 z3 v  O- s& Q
   }
, H: l6 a* j: G# f) I   return TRUE;8 o* e1 B1 T2 h* j. r
}* A0 V$ i  Y) l9 H" p( t; {

4 }: L+ @, \! v- Y) Q$ |9 R! R- E) M3 @" n5 e; j. I: ~7 e" i1 W
///////////////////////////////////////////////////////////////////////2 `5 r, o: p: M* @
///////////////////////////////////////////////////////////////////////
/ u' ~$ E. p3 Y6 {$ K//. G% `& D9 E$ p! H4 C
//         CTTS
/ V8 v$ g! W, D//
0 L# d" X1 n- z% a8 r! o///////////////////////////////////////////////////////////////////////
0 e* |% g7 |4 W% x+ n///////////////////////////////////////////////////////////////////////
7 y, V' k1 q! I4 ?
3 i7 _  T" ?3 B* c4 y3 J* C( x. i////////////////////////////////////////////////////////////////////2 @1 R5 e% P! b9 G& ]: O1 e
//保存关联窗口句柄。初始化COM。
  U( @# G( P8 L; S- o: g. k) s////////////////////////////////////////////////////////////////////
6 b& |$ m  f! h# f$ xCTTS::CTTS ( const HWND hWnd )
" T( @) u: o, b2 V5 _) x9 }{
. k, C- u& `; H1 N7 P9 K( }! f) [m_hWnd    = hWnd;
. P  B) T8 q& m+ M. ~m_pVoice   = NULL;
  S& x" }9 U6 z4 {# P' L3 nm_pToken   = NULL;3 i; H* T; d( T8 c- ]' Z
m_pOutputStream = NULL;
2 D$ U# d. M: o( j0 k0 {m_pAudio   = NULL;& Z* {5 M. k! y' B
}
' i3 s& O9 [+ c% u( y# x. e* `; P) n. E& j0 V% [
////////////////////////////////////////////////////////////////////
+ R9 Y3 A$ ]* M+ R4 M* Z//释放所有对象。
8 q+ P' \0 h; b; X////////////////////////////////////////////////////////////////////
: B, w- o8 m6 F$ uCTTS::~CTTS ()/ _. Q/ N7 x& G4 \$ H5 _
{. c- _# R) e1 \7 W# c
if( m_pToken) {
. |- [5 k+ f5 R( l( H/ a4 H! @. x   m_pToken.Release();
" ?) A1 X& _" R" ^* G1 I' ]6 u   m_pToken = NULL;3 x% a: P, R" l, M- s# a% u3 f* b
}
  U8 [% _3 G+ ~" [9 vif( m_pAudio ) {- q+ M" `! }, n+ ^
   m_pAudio.Release();
2 a* A/ W8 x" i3 l, U   m_pAudio = NULL;
* v- z9 B8 w3 |# W, J- U1 }}
$ u3 u0 A- _( o  T& ^if ( m_pOutputStream ) {1 B- t6 i3 B. O5 S# n. @% a
   m_pOutputStream.Release();
& @! x* Q! I( p/ u/ G8 E   m_pOutputStream = NULL;
6 p* m! b, r9 M  L5 |6 F}
, Y# R1 {$ ?& ^% S7 P6 [. o: aif( m_pVoice ) {, \! W9 b! A5 M4 F. v
   m_pVoice.Release();2 O! K& @0 t3 C( g9 c8 m& [
   m_pVoice = NULL;
% m9 z# _- E# v/ _/ H5 K}
7 `7 F% _! I7 I; v0 w7 Q}( q5 x8 l( W- n: ~) {/ n, M

8 ^& O$ f2 N/ s" Y3 R////////////////////////////////////////////////////////////////////0 I4 d/ {0 B- v# _0 X
//从SR的上下文中得到voice对象。此函数在CSR中被声明一个友员。
2 \% k* M+ \6 w! a, q: c# X1 ]. f////////////////////////////////////////////////////////////////////
3 Z- v. m4 x3 i: |+ G& i6 G9 \8 tHRESULT CTTS::Create( const CSR * pSR,9 {, E0 M7 A" c# _4 m; Q* R
       const DWORD dwLanguage )
  g% z/ ]* F3 v" V' y7 s+ J' M; ]. n) \{
. f3 |  z: b4 Q5 s" t" KHRESULT hr;
7 ?$ ~2 L( H9 Ihr = pSR->m_pSRContext->GetVoice ( &m_pVoice );5 c. y( D8 r% u( O
if ( !::CheckHr ( hr, "pSRContext->GetVoice()" ) ) {) j, X. S' U& z# r; O; Q9 f( _- t
   return hr;
8 v3 w' D% w8 ~2 K6 q8 D}8 S: Y$ ]. g0 ]+ t: ~
' u3 G! A4 L9 V0 f& q
SetLanguage ( dwLanguage );
: q1 v, I) F' J. F9 f0 m8 |4 \4 w
) t5 A2 G1 W) Ohr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );//建立一个默认音频流& a; V( P' j8 {& G! T2 c& b. `
if ( !::CheckHr ( hr, "CreateDefaultObjectFodd()" ) ) {* I- p. I" p- b
    return hr;
6 Z# l+ ], L& M! P! X}8 ?1 Q* K" v" w7 k

) i# k# I! P: M' |2 E//SPEI_START_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM
8 |! y( r% U- a- d//SPEI_END_INPUT_STREAM 表示完成流输出。
1 w4 j) i* H; l* f$ H  Hhr = m_pVoice->SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) |
1 b  ^# {$ A) Z+ a. P# p( R         SPFEI( SPEI_END_INPUT_STREAM ),
+ _4 E, O- m! r  B9 ?. ?' P            SPFEI( SPEI_START_INPUT_STREAM ) |; P7 `' l; N3 \- c* @9 i, a
            SPFEI( SPEI_END_INPUT_STREAM ) );1 M0 L2 v. s" \5 U
if ( !::CheckHr ( hr, "m_pVoice->SetInterest()" ) ) {! A3 b" L9 T( D* @9 V
    return hr;5 W: s; s, r7 e' j
}
0 ]; M- i1 |: x4 @+ \  H2 W7 z0 {
6 M$ a. i9 S7 h- O2 g//设置通知消息8 _9 t% K2 t% K
hr = m_pVoice->SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 );( s/ \; E' I9 H3 H* P8 v
if ( !::CheckHr ( hr, "m_pVoice->SetNotifyWindowMessage()" ) ) {, N- u* H6 }4 E0 F3 f2 m
    return hr;3 M% H* |- J3 f" g9 g. ]. @
}
/ Z3 q) p5 {+ T# Y3 ^$ p, @, Q7 T$ Y5 `8 @. k
return hr;) B9 s% A* ]# l" i- W
}
8 J% I5 h- P: z8 A, x+ a+ s1 l. H" j2 l
////////////////////////////////////////////////////////////////////
; v: l( U3 h. F+ ?7 R6 \" N" Z//单独(相对于从SR的上下文中得到voice对象)建立一个voice对象。' ^, W# J8 _! v7 W5 X
//并设置兴趣,设置通知事件。
6 F8 M8 ]1 |7 f////////////////////////////////////////////////////////////////////
. y1 l' S( y" g- jHRESULT CTTS::Create( const DWORD dwLanguage )
4 A3 `0 F1 U& L; |/ }{6 l( V. E7 |9 ^0 U
HRESULT hr;
( Z3 V  F# W# j- u9 T2 t2 ahr = m_pVoice.CoCreateInstance ( CLSID_SpVoice );$ ^0 Q: X( U" O. y$ D% z6 g7 T
if ( !::CheckHr ( hr, "m_pVoice.CoCreateInstance()" ) ) {
0 S! w' K5 l$ }* S+ g6 o   return hr;# s' l- t* @7 Q, B
}( x3 p5 i' W% u0 G1 d

! f7 s( T1 w4 Q$ BSetLanguage ( dwLanguage );
- r2 |5 R& L; _/ N3 w- Q, V6 O' d$ J+ D  {) Z8 `
hr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );//建立一个默认音频流
, K+ P9 S$ q. K6 xif ( !::CheckHr ( hr, "CreateDefaultObjectFodd()" ) ) {; V+ Z$ Q! r9 C* v/ G
    return hr;4 k: I- e# x8 V, o, E
}
# m; D+ ^9 c6 O5 ~' m- F: C
& w# K. i# \/ V  X* k- R//SPEI_START_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM0 q( D& u# s4 k$ A
//SPEI_END_INPUT_STREAM 表示完成流输出。/ H0 w4 m  y. T$ ^$ K/ x
hr = m_pVoice->SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) |
; Z8 e- f2 d8 L         SPFEI( SPEI_END_INPUT_STREAM ),
1 }0 W2 x. ?- k- G$ V% }            SPFEI( SPEI_START_INPUT_STREAM ) |4 g! O  J# L  ~" O; o1 p: b  b
            SPFEI( SPEI_END_INPUT_STREAM ) );; A) K+ Y# m! u3 z9 V
if ( !::CheckHr ( hr, "m_pVoice->SetInterest()" ) ) {
' C9 D, t. F' H' ?4 c$ H( ~    return hr;: }" y# ]: s4 {5 F3 R6 j3 ]& o" x
}
6 T* k. C* [, F7 C6 X1 J
1 F& ~& l- C5 m$ {* Y) y8 d" H//设置通知消息3 T6 i" G$ V4 `1 G# o5 v
hr = m_pVoice->SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 );
: j) q( |8 o' w( Aif ( !::CheckHr ( hr, "m_pVoice->SetNotifyWindowMessage()" ) ) {
0 U: c- }' s2 n% X    return hr;
. ]  @% v3 y% o2 ~}) a1 T9 M& ?; D9 h8 S
0 i3 b- r- S* |8 M7 {7 a8 M! T
return hr;
1 e/ a1 }) |( x. z/ a; M' W}* Z9 R0 f: Y7 w# _1 `
 楼主| 发表于 2011-5-23 17:06:27 | 显示全部楼层

Microsoft Speech SDK5.1 语音识别(二)

第一个小程序
装好SDK后,我们当然要运用了,要不然我们装它干什么呢。我觉得写程序的乐趣就在于自己写出了一个能运行的程序,那种成功的感觉很好。好了废话不多说了,接下去就来写第一个能运行的程序吧。
1、新建一个Win32 Console Application空工程,在工程里面新建一个C++ Source File。
2、首先当然是包含头文件
#include <sphelper.h>//语音头文件
: n2 l0 ^$ x* Q. n#include <iostream.h>//C++头文件,用来提示错误信息
3、然后是主函数
int main()* L1 |; S' t" t9 f8 h
{+ z: ?/ V3 |! m$ X
    ::CoInitialize(NULL);//初始化语音环境
* s- e1 z- a" U! w    ISpVoice * pSpVoice = NULL;//初始化语音变量
& P% R8 N9 |  _$ c3 p    if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL,CLSCTX_INPROC_SERVER, IID_ISpVoice, (void **)&pSpVoice)))  
    //给语音变量创建环境,相当于创建语音变量,FAILED是个宏定义,就是来判断CoCreateInstance这个函数又没有成功创建语音变量,下面是不成功的提示信息。
    {
* u4 n1 m% I+ h4 U# i5 E8 a        cout << "Failed to create instance of ISpVoice!" << endl;
9 C6 @* n" K5 C! o* P        return -1;
0 t  |3 }+ F; c, D* z    }
( ?, K0 p  s1 i3 X$ }3 a
    pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);//执行语音变量的Speek函数,这个函数用来读文字。
    pSpVoice->Release(); //释放语音变量4 U% g: U8 b/ f2 B: }+ w6 g" ?
    ::CoUninitialize();//释放语音环境
5 [6 a5 y' j2 G- x
    return 0;
# E  X  z2 }8 ?! s  V( C* x) A}
4、第一个程序就这样写完了,运行读出了Hello World,是不是觉得很神奇呢,呵呵~~~~~
回复

使用道具 举报

 楼主| 发表于 2011-5-23 17:07:47 | 显示全部楼层

Microsoft Speech SDK5.1 语音识别(一)

VC6.0下开发Speech SDK5.1程序  w# U  B' Q0 \1 K  p8 I5 d
  K: P3 N6 c7 Q2 u/ x' E* T+ [
1.首先开发得需要Microsoft Speech SDK的支持,以下是下载地# T  |2 D8 r# `* _

2 j6 w# ]/ P- D# o; \9 Ehttp://download.microsoft.com/do ... -US/speechsdk51.exe   # R+ Q+ Y/ K% Z- L! K* Q: @8 e) r6 }: F
Speech SDK 5.1安装包 (68   MB)     
; \* c# }9 y7 b* P: }http://download.microsoft.com/do ... chsdk51LangPack.exe      
1 Z1 \; ?: m* j" R) g& E- C! H4 ]( i中文和日文语言包(上面的安装包只支持英文,如果要你的程序支持中文则下载此包)(81.5   MB)  
2 X( W! \3 ]; B3 E) d* m+ F/ h
3 V  v% @4 S8 t7 K2.下载后,执行安装$ N& z0 v# K* w; u: o# |' w( g

" f5 O$ k+ A+ S8 j  I2 J, B下载完毕后首先运行SpeechSDK51.exe,它其实是个压缩包,不是可执行文件,解压时选择解压到的路径,然后,运行解压出来的可执行文件,默认安装路径为C:\Program Files\Microsoft Speech SDK 5.1。运行那个中文语言补丁包SpeechSDK51LangPack.exe,和上面的一样过程,这也是个自解压文件,不过这个第二步不需要选择安装路径,运行一下就行。
7 s* D% u4 f+ }9 u0 o, x. I/ N) A4 E6 M( S: o, J9 `/ V
3.VC的环境配置5 m& P1 v& C% u6 q; d5 r9 x0 z

  E( n8 T+ n* Z0 ?# ?' g- M在应用SDK的开发前当然得需要对工程环境进行配置,我用的是VC6.0(其他情况类似),配置的过程如下:
, \- p6 C, w: G! J( E/ @( n2 Y, D+ t9 d4 J
工具->选项->项目->VC++目录,在"显示以下内容的目录"下拉框中选择"包含目录"项,添加一项C:\Program   Files\Microsoft   Speech   SDK   5.1\Include到目录中去。再选择"库文件"项,添加一项C:\Program   Files\Microsoft   Speech   SDK   5.1\Lib\i386到目录中去.
; `1 h' m8 T# h' F' b8 K$ Q5 B0 q) @. a; y
好到这里为止Speech SDK5.1的配置算是完成了,接下去就可以写程序了。呵呵~~~~~~~3 _! U$ T1 w. L0 Q8 J: p3 u9 M" A1 i
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-6-18 11:59 , Processed in 0.019115 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表