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

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

[复制链接]
发表于 2011-5-23 17:04:22 | 显示全部楼层 |阅读模式
////////////////////////////////////////////////////////* E1 B8 K$ s5 R3 ]" r& B  t* J
//1,生成动态连接库时,要#define USE_SPEECH_DLL,
$ N* O0 p+ @6 v//      并且#define LANE_SPEECH_EXPORTS( G6 N; w( Q# x) {  u" k2 U
//2,使用动态连接库时,要#define USE_SPEECH_DLL
- Z% W7 B( H: l//3,声称和使用静态连接库时,什么都不需要! ?/ F* p* v0 d' G: W
//4,另外主程序中静态连接库要调用的方式里要调用CoInitialize( NULL )和CoUninitialize(),
  _2 `) {" }# a6 n8 ?; s//      动态连接库就不用调用了。4 C1 a7 N8 C+ ^% c7 J# ~6 n8 N
////////////////////////////////////////////////////////9 O, _' {) d+ a# e8 r
#ifndef LANE_SPEECH_H
0 {+ k4 T, ?1 ]; q) V#define LANE_SPEECH_H
& S( E4 B/ N- m2 e  V! ]6 b* o* y7 I4 y4 S. ~" p4 l* n0 W6 l
#include <windows.h>
1 v$ p/ `# b+ U* }' B6 H9 B#define _ATL_APARTMENT_THREADED5 h# _* q0 j3 K
#include <atlbase.h>
; l! Y; x4 h  J6 sextern 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
& }7 @  i) S8 X#include <atlcom.h># n, R" z6 y! \/ I' [
#include <sphelper.h>   //sapi需要的头文件) A( ]+ a0 I' F4 b1 J( z

* l: v" ?/ k7 K8 F6 S//-----生成动态连接库和静态库的处理----------------& Z2 J" B/ s5 g* P- _
#ifdef USE_SPEECH_DLL //定义了USE_SPEECH_DLL,就按生成DLL,声明导出导入类& m. l; B; K1 u) F) ]
  d9 q9 ?9 B- \1 |' O- I
#ifdef LANE_SPEECH_EXPORTS0 M) k7 b( X9 s1 X) D
   #define LANE_SPEECH_DLL __declspec(dllexport)5 |  P+ V# _7 V5 W+ @' f; B9 u2 T
#else
8 _. I$ v& J2 t4 Y4 T4 _1 o* i& M( c   #define LANE_SPEECH_DLL __declspec(dllimport); u1 R* m5 P9 B
#endif
7 F; s8 k/ C  A; ]5 z3 U
8 P! c8 Y, P+ c. Y; K/ L//这个警告我现在还没闹清楚是怎么回事了,估计是DLL和com或atl有关' L3 s$ l( k! O& p/ ?5 Q8 N
//暂时只能屏蔽掉它,在静态库里就不会出现这个警告。/ M! V$ o& a& g  @" Z: }
#pragma warning( disable : 4251 )9 k+ S2 K- f$ X7 U- f

5 W* G  Y0 t; `- ?#else     //没定义USE_SPEECH_DLL,则不声明导出或导入类(LANE_SPEECH_DLL就为空)
5 R8 c7 A6 L' a/ x- A8 Q#define LANE_SPEECH_DLL
5 R# i  i6 C: {( X0 n
: i# \8 [3 `% D5 G. ]#endif //USE_SPEECH_DLL" k% F) ?9 b4 n0 j4 C
- I! _+ n0 L1 E
- ]2 i  Q+ h1 F1 x# c' R
//***************************常量***********************; @8 J/ Z, `7 g2 [% L* }
  Y! }; c5 x( [( i$ z. `
/////////公共常量-----------------
$ R6 x0 N- v% o$ t* x! I5 lconst DWORD   SP_CHINESE = 0x0000; //简体中文.$ m# `1 f, K: K1 j9 f: A* F- E: N$ c
const DWORD   SP_ENGLISH = 0x0001; //英语.( K3 V2 N2 H$ f0 n- X

' ]: C/ A' D5 c/////////CTTS常量-----------------5 k. Z/ |5 \, D+ n5 `
const UINT   WM_SPEAK = WM_USER + 4444; //触发事件产生的消息。
. x, l  g" X, U' b5 ~4 F; [2 }1 o5 d6 U5 x! A: _# y7 U6 c7 ]
/////////SR常量-------------------
6 r6 z# {* T; g; e' o6 a' kconst UINT   WM_RECOEVENT = WM_USER + 3333; //触发事件产生的消息。
+ }( j9 Z+ f' A1 Y9 b0 Dconst DWORD   SR_INPROC = 0x0000; //独享类型的SR.1 l) B% o; e# [- J' J, @! {
const DWORD   SR_SHARE = 0x0001; //共享类型的SR.
' c( C# @* i) c& ~4 ~* Y- b: s0 R" d0 g7 m5 |
//以下常量仅作例子用。
# k, X% R! s+ \! y" g4 T#define VID_TopLevelRule 9000   //顶级规则ID6 E2 E) i  n  ~& j
#define VID_SubLevelRule1 9001   //子规则ID
, h7 O8 c1 x7 o1 Q#define VID_SubLevelRule2 9002   //子规则ID
  C& |- m/ q' x- e2 [, Q7 p#define VID_SubLevelRule3 9003   //子规则ID: l' L' }/ f9 x
  @8 n. l9 ~/ |& Q
8 t' T. V+ ^! T: t3 f7 N- F' ^
//*************************类声明************************
& k/ U8 t$ h4 D. _* C+ d) x" b6 Z0 c0 r' q

* M. G4 [, h  x* kclass CSR;
5 m' g4 Z, s; C7 b5 O- w* b///////////////////////////////////////////////////////////////////////% O9 ~) o6 j& r
///////////////////////////////////////////////////////////////////////4 M& K9 A+ a% g1 d7 `4 F' t5 W1 K
//$ P2 c6 ~! ^1 _4 y
//         CTTS
9 N8 Y( x; |) u( Z' q# s; c//
9 l- ^# w4 B! w; E$ x! y& l///////////////////////////////////////////////////////////////////////
; I% A# O' h, Y& \! {' U7 w( c///////////////////////////////////////////////////////////////////////9 d2 d, P2 q# V5 X9 T
8 y+ u( h" L* s! T5 |) C
class LANE_SPEECH_DLL   CTTS
3 G* Q6 E9 Y+ ]4 D. A8 O2 [{+ \# E$ H  K2 F; O& R
protected:
3 A; C7 q% p: U' k, Y3 R2 bHWND       m_hWnd;     // 关联的窗口句柄。
; A& k( X. ~7 [# q6 }  e
' h9 g( L: u. ]6 [: jCComPtr<ISpVoice>    m_pVoice;    // 声音对象的指针。
/ a# |& ^4 p; u% xCComPtr<ISpObjectToken>   m_pToken;    // token对象的指针。- z7 b) J/ A1 X: o2 U
CComPtr<ISpAudio>    m_pAudio;    // 音频对象的指针。(用来保存原来默认的输入流)" L6 a1 a7 o  M' r
CComPtr<ISpStream>    m_pOutputStream; // 输出到文件的流对象。
3 ?/ \% @; c  v" z& s
; |7 d# q* v. v7 F- \public:: u  @- f% x1 {  _6 Z( q# U
//********************************初始化部分********************$ B9 j  `1 {! j% g& ?$ M& u: q

- |9 u. n0 _$ m! R' U6 v* s////////////////////////////////////////////////////////////////////& ?  Z5 S8 m. |- N6 M/ @
//功能: 保存与识别引擎关联的窗口句柄。" ]8 I" V2 X1 X" I4 y+ Y2 o* @
//参数: hWnd:要关联的窗口句柄。
4 k) T4 l2 V  b" Y% O. R% F//返回值: 无。
& z% y6 W& u1 }3 |6 e, C////////////////////////////////////////////////////////////////////
& z+ c  h1 l% Y  [( E" lCTTS ( const HWND hWnd );# K; f# N- Q6 b! a
1 h1 G, @$ I1 |
////////////////////////////////////////////////////////////////////9 @; `  d6 H( i$ a, i
//功能: 释放所有的对象。% r$ B' B/ a- d; U: H- ]. Z
//参数: 无。
7 E" Q; C9 X0 B; l9 q9 T//返回值: 无。
. o0 z2 j# E, g8 Q$ I+ d////////////////////////////////////////////////////////////////////$ L6 V7 l, p* S7 i) I* E
~CTTS ();6 R. F7 Q# J# U( B& s* O

5 j  _6 q7 M6 T7 ^& C% l////////////////////////////////////////////////////////////////////0 P/ v) `9 \* w
//功能: 建立一个voice对象。设置要是别的语言种类,消息,通知事件。
) Y5 _1 G# A" U3 I+ M. Z//参数: dwLanguage:要朗读的语言种类,SP_CHINESE为中文,! i% i* ~  [5 {
//    SP_ENGLISH为英文。
! W) Q+ s" w# D' q2 [9 J, T//返回值: HRESULT类型。4 x. E1 M+ ]! D( t% G; `0 d- \6 r
////////////////////////////////////////////////////////////////////
* J5 Y1 N- Y4 l! pHRESULT Create( const DWORD dwLanguage = SP_CHINESE );
( t; {. p2 z7 U! j, ?2 A
: H3 u  N: u% J% G////////////////////////////////////////////////////////////////////
6 K5 O& c+ Z2 O6 {8 P//功能: 从一个SR引擎建立一个voice对象。设置要是别的语言种类,消息,' w, O! D( S0 r
//    通知事件。( {  a9 M5 o( w" u2 S
//参数: pSRContext:SR引擎的指针。dwLanguage:要朗读的语言种类,
2 k& o) V" R  e. S//    SP_CHINESE为中文,SP_ENGLISH为英文。; r2 s5 r( Y* j. [6 Z
//返回值: HRESULT类型。
! G3 O. A' I  M) w////////////////////////////////////////////////////////////////////
' q/ }& g4 M9 L+ ~! ~$ O# u" KHRESULT Create ( const CSR * pSR,  p2 Y; W5 d3 R9 `2 F
       const DWORD dwLanguage = SP_CHINESE );! W$ v2 a3 H6 s$ E

  A( z! Z& u$ a, s: g" h  ^. s. c8 B' G3 N9 ^, z! m6 q9 p
//********************************设置部分***************************************. P! V; H) V7 ]' M* Q
& h+ |# J8 z3 o9 H# j- y4 x/ `; F
////////////////////////////////////////////////////////////////////
! G6 x& ~$ U4 z) r- d+ e/ b//功能: 设置朗读声音的语言种类。
/ X2 L7 r, Z$ a7 L! g" A! ?//参数: dwLanguage:语言种类。SP_CHINESE为中文,SP_ENGLISH为英文。
# ?7 h4 Z6 n( Y: Y//返回值: HRESULT类型。
4 Q! D1 A# V8 n////////////////////////////////////////////////////////////////////
; c- b, G4 u: ~/ }0 y: @. a7 `HRESULT SetLanguage ( const DWORD dwLanguage );
4 [8 |$ h# K4 a* j5 L5 t4 T9 `) ^" r& J9 {( S
////////////////////////////////////////////////////////////////////. k% k7 a7 {! Q  a1 i$ v3 P+ u
//功能: 设置要处理的的事件。
! v* r' [$ u& }0 y6 O) o0 t- G& g( j//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,# X6 o( a4 @+ ~+ t$ `; x- C
//    设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事
4 c3 s: h$ d- i; @% s//    件都会收到通知。
$ d3 |) U) x9 I% E2 w# J//返回值: HRESULT。
! ~1 {( x3 D. C5 H+ G////////////////////////////////////////////////////////////////////
3 v1 `3 `; q4 ]  _2 j% vHRESULT SetInterest ( const ULONGLONG   ullInterest );
( n  j  ]+ z+ j$ @8 w- g9 O5 u7 K, t
////////////////////////////////////////////////////////////////////
8 J) g3 R5 ^: D8 u. C( U1 R" q//功能: 设置朗读声音的音量。
! W! ~0 y3 X) i) Q. W//参数: usVolume:音量数值应该从0到1002 F; h9 }- Y& S$ [6 y* v
//返回值: 无。" {: @/ }/ }$ D
////////////////////////////////////////////////////////////////////
1 S, B( ^$ {+ E7 |void SetVolume ( USHORT usVolume );" {5 P% q9 r2 _+ O& S

; h& k2 C: t9 S* \; J0 `6 H////////////////////////////////////////////////////////////////////
5 a; G) G% C% D2 S- b# A. h//功能: 得到朗读声音的音量。
7 }9 w* D9 W8 `1 O2 Z1 E$ k//参数: 无。
) n( m8 a! \2 z& B) e# q  C$ j//返回值: 音量数值,应该从0到100。
& K0 m* H7 k5 z5 X8 L1 q////////////////////////////////////////////////////////////////////
+ E9 {8 i  N, A/ W3 oUSHORT GetVolume ( );
' y$ [1 s; {+ @; }7 ]( g1 \9 w; U' p
////////////////////////////////////////////////////////////////////# e* q: R0 j* D# Z; l5 M. ^7 \8 W
//功能: 设置朗读声音的音速。# h9 h- ?- U- s
//参数: RateAdjust:音速,参数范围从-10到10。' D, U$ f$ S8 F: ?4 S
//返回值: 无。
% N) \$ h! b* x8 C////////////////////////////////////////////////////////////////////
0 o8 I- `1 d- {& u. v" rvoid SetRate ( LONG RateAdjust );
; u7 s& X; s) S; K
+ |/ Q& u3 S: f" e- n  h, U5 x! A: a////////////////////////////////////////////////////////////////////; N8 K  Y; E* U6 p5 c; W
//功能: 得到朗读声音的音速。
# s, X2 |7 C0 `$ b//参数: 无。' w4 g( f1 l& G. Q7 I9 x4 j
//返回值: 音速,参数范围从-10到10。$ x0 J1 X: V$ `7 _, J, h% P
////////////////////////////////////////////////////////////////////" q8 C- M8 Q  N- C
LONG GetRate ( );
- @5 Z+ ^0 x+ K% @, E4 Y* Z  p
, v& v' C, g% A& u1 S0 J3 P////////////////////////////////////////////////////////////////////
1 o* n/ j5 Y* C/ ?  @//功能: 设置朗读的声音流到.wav文件,如果不调用此函数则默认从音箱输出。9 l* e3 B" ^' m- w4 B. N; `" B! Q
//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。4 h6 f% a0 n9 o6 w. z6 A
//返回值: HRESULT。
; n4 Z# ^2 ^% R5 @' n; d////////////////////////////////////////////////////////////////////
- j5 U- s1 t/ k$ C9 JHRESULT SetOutputWithWav ( const WCHAR *pszFileName = L"TtsOut.wav");
: e# U& i0 W" V% u0 n4 ~
; I$ W# X+ b- }7 y2 V////////////////////////////////////////////////////////////////////
3 w1 h" O6 Y; }/ I//功能: 设置朗读的声音从音箱输出。
) @0 Y2 }* z' W0 @6 ~$ f( e//参数: 无。
  m/ m! L7 q0 W6 L; ~% C9 n//返回值: HRESULT。
" Z( _# ^& [. _2 z  f9 ~////////////////////////////////////////////////////////////////////6 G% R( m: }2 b. L+ H
HRESULT UnSetOutputWithWav ();
6 T5 _3 k. h6 E' U$ i5 h* T8 G' ^% r2 Q# \1 q' e

0 V/ O  D4 E+ V& C5 M( w' k7 y//**********************播放语音,文本到语音转换部分*****************************
# E$ C( d9 ~( C. r$ d& i/ m* \8 _: w) g: u7 A/ ?
////////////////////////////////////////////////////////////////////: V/ I# e5 i8 K) b
//功能: 停止朗读。如果朗读为同步方式,则不能停止。! U7 d! d3 e6 l" J( R4 w
//参数: pwcs:要朗读的字符串,需用" L"" "转换,可以是包含xml标记, b& s7 @7 ~( ^0 s8 I3 N+ K5 m/ U! c
//    的字符串。dwFlags:朗读方式。SPF_ASYNC为异步,SVSFDefault为同步,; @# c! F( W: N+ X# Z
//    SVSFIsXML为朗读带xml标记的文本。
9 P$ o8 {/ {1 D//返回值: HRESULT。8 o* A  B, E1 v
////////////////////////////////////////////////////////////////////. F7 {7 {+ @: V6 t* ^4 S
HRESULT Speak ( const WCHAR *pwcs, const DWORD dwFlags = SPF_ASYNC );
6 g- i6 {0 |/ W; u1 ~6 P& l. S% P0 k; T3 K: J2 |5 c- o
////////////////////////////////////////////////////////////////////
& I/ f  s( W! h' N& a1 _//功能: 停止朗读。如果朗读为同步方式,则不能停止。
% n3 k5 u7 V3 ^" ~2 E//参数: 无。
3 E: S0 }2 N8 A) w, H% Z1 F, R: A* ?//返回值: 无。
) m7 Z$ _+ G5 O$ F# o////////////////////////////////////////////////////////////////////
, U% U# X8 q0 V! cvoid Stop ( );+ j+ M5 u4 m+ p; @; t! ^
  v* o( p# x0 I9 D% @  S" m
////////////////////////////////////////////////////////////////////# Y0 |/ r- X3 ?% J
//功能: 暂停朗读。如果朗读为同步方式,则不能暂停。: m/ \7 ?! W" k: }; g' X% }# I7 v
//参数: 无。  j$ \  t# e1 G% N4 d! B" R
//返回值: 无。
" u( b. i, x1 L////////////////////////////////////////////////////////////////////+ X$ H4 q3 `5 b3 w. \# l. g1 h
void Pause ();
# N  ]1 s! D+ ]# ~. P9 r
$ r! k; N% b0 R3 `/ ^: g////////////////////////////////////////////////////////////////////. w. M2 w2 m* |5 H6 b$ R: G: c1 R
//功能: 从暂停的地方继续朗读。8 n# f: B/ p% x
//参数: 无。0 r5 F9 i' f4 U  \& `
//返回值: 无。/ @1 M+ K5 w" s2 v5 f
////////////////////////////////////////////////////////////////////8 b8 i* U2 J( Q3 E' r* _
void Resume ();
, j3 |7 c1 q8 Q3 e! q( u$ i5 `; I7 Q: F$ O) b

1 @/ A7 P5 _$ `" F& W9 m. `6 S0 X//********************************处理事件部分***********************************$ m: B; G7 I9 i. Y# `" D$ l7 E7 Y7 \: U

" T2 y1 E4 t  Upublic:: `: ]3 O3 c4 T9 K3 Y
////////////////////////////////////////////////////////////////////8 Z. _! `" ?9 G
//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。9 z- U: y  q# S, u$ v
//参数: 无。
  E9 \! i! I* W//返回值: 无。
; `% j" i1 g2 f6 `( f////////////////////////////////////////////////////////////////////
% m4 O6 [5 q5 i7 p) cvoid ProcessTTSEvent ();' Q0 H& J7 p! I5 q1 [9 I( {3 K

9 Q- q, o1 ^/ j+ C  c7 U6 B4 G
9 Z4 b0 Y1 N# A* L////////////////////////////////////////////////////////////////////
$ S: G4 Y, @7 a( m//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。, D( B& `, ?5 y& e( w( P! F
//参数: 无。
! t) @1 y' _' l" ?//返回值: 无。
: [8 v8 ]0 d/ U1 l" X$ ^* J////////////////////////////////////////////////////////////////////4 e) f; h& b7 ~3 p) `
virtual void OnStreamStart ();4 S% H+ Z& Q0 l% y, a. q0 {/ j
! Z/ `- K4 b. E( g' K! X9 u; R
////////////////////////////////////////////////////////////////////
+ O8 G" G5 }* M7 d" s, f7 h+ _! C//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。
4 }/ K. h# y9 k& Q/ D5 L( n2 D! f//参数: 无。% ~, _5 s! C; Z( z
//返回值: 无。
/ b* n5 K! f- i  b, M/ L% i/ _% {+ z////////////////////////////////////////////////////////////////////
- z' Y8 h: C0 c9 R4 h6 R0 ?virtual void OnStreamEnd ();7 _3 ?7 _( J- X. k. f
};
, W1 p1 O6 L; g: {, f1 u1 ~6 N* P
6 P0 T; \% W% U, G/ m8 `! {! a3 o* n
///////////////////////////////////////////////////////////////////////. ]5 i" S( Y7 I7 i4 Y/ p
///////////////////////////////////////////////////////////////////////
9 _- l6 `3 ?3 b8 ^* J: C) d//         CSR# N" K0 ]5 ^2 ]# ?- Z
//' e$ L) ~* F* _9 X  p
///////////////////////////////////////////////////////////////////////
* P6 I" ~0 ?) M///////////////////////////////////////////////////////////////////////; m  v* O; `2 d- Y
5 f0 P; t, i3 s1 F* G
class LANE_SPEECH_DLL   CSR3 C  m4 ~0 h7 ?: ~! m9 U. d" s- ~
{
2 \, C3 `8 F1 T/ ]9 Z/ F! p5 B9 ?- O% T. |* [" B* Z
protected:  }- `1 K' S+ U  N8 g1 Z
HWND m_hWnd;1 P" M9 I  n' G* }1 L

  W$ O1 i8 g1 _8 T) t9 O; k  g+ w' ^public:' U+ k( p$ e/ M
CComPtr<ISpRecognizer>   m_pSREngine; // 语音识别引擎(recognition)的接口。
4 \( @3 E7 o( M5 a. G3 A7 f  r! |CComPtr<ISpRecoContext>   m_pSRContext; // 识别引擎上下文(context)的接口。
: L2 E; l. i) q5 fCComPtr<ISpRecoGrammar>   m_pSRGrammar; // 识别文法(grammar)的接口。  O8 m: O4 `( J  ~: [3 A
CComPtr<ISpStream>    m_pInputStream; // 流()的接口。
8 W' A* ?& o, E# q+ D6 gCComPtr<ISpObjectToken>   m_pToken;   // 语音特征的(token)接口。& A1 ^* E% [) S- j
CComPtr<ISpAudio>    m_pAudio;   // 音频(Audio)的接口。(用来保存原来默认的输入流)# C8 x$ R0 n9 J7 U" V
public:
2 @& ?0 K! d# ~& zstatic ULONGLONG    ullGrammerID; // Grammer的标识符, 64位无符号整型 每建立一个Grammar,加一。8 U) l0 m9 }0 \1 V, V

/ K- x" C; v% Z, H3 y1 _7 w- A% a* n& w! s9 o! S7 r
protected:
& f7 s' R4 h5 S6 m! K//***************************辅助功能部分****************************************- h5 L/ ]# _8 I: j

/ `6 H& H/ [6 d. d) f////////////////////////////////////////////////////////////////////% J# Z5 V: E+ x# o5 u; ~6 E
//GrammarID加一,每个GrammerID必须不同。
& G: e8 E! i8 E" l! K0 X# i////////////////////////////////////////////////////////////////////
4 T3 H6 @8 G) n* m$ g' y4 Astatic void UpdateGrammerID ( );7 J, w, G4 R% p1 Z, ?& M1 e
* J- {2 ~2 }# D/ ?0 y) K

3 r2 e# ?. C9 R8 Y2 vpublic:
" r8 p; [7 E3 m$ y& l$ `////////////////////////////////////////////////////////////////////0 \) c$ y% b/ Q2 ]+ G- s; W7 g& p
//功能: 友员。TTS中的从SR引擎中建立voice对象。8 f( R' Q9 V9 \: @3 u2 h0 _. d
//参数: pSRContext:SR上下文对象的指针。
' q4 R: E2 }+ G5 ]' A//返回值: HRESULT类型。
' s4 m0 C: @* R8 _3 p+ K, Z////////////////////////////////////////////////////////////////////1 g5 x, b! |. I# a3 s& F
friend HRESULT CTTS::Create ( const CSR * pSR,
5 M, |/ }2 r4 }# e0 C          const DWORD dwLanguage );
, Y* m/ |1 T: |/ i3 e9 B4 ]& f9 w* `7 k0 R
% f) b/ [4 f6 w& h5 Q1 e
//****************************初始化部分*****************************************
& C: Y/ A9 q5 I! j! G  I* L2 l! J0 F- ?# T2 K2 m$ x
////////////////////////////////////////////////////////////////////1 }% g4 F* K- ?9 E: H
//功能: 保存与识别引擎关联的窗口句柄,更新GrammarID。
- c# X+ n$ t9 c4 s8 o//参数: hWnd:要关联的窗口句柄。
0 ^( i9 o% K1 X//返回值: 无。
0 q8 G+ m5 t$ y, Q# s% M4 |////////////////////////////////////////////////////////////////////
+ i6 O& U0 S8 T5 D" G5 `CSR ( HWND hWnd );
/ t+ Q' [6 C& @1 k. [1 a% j
: A5 ]6 S8 }8 e. Z////////////////////////////////////////////////////////////////////3 L) @& Q. G" y0 {* U" p
//功能: 释放所有的对象。
0 N8 M" [- l2 N* I2 y. b//参数: 无。
9 k5 ?) B" ~& G//返回值: 无。$ {9 D0 W' n1 t& w, e1 `' l
////////////////////////////////////////////////////////////////////
; E, l: u, m  A! m; W~CSR ( );9 r: G2 y; R8 @9 W

8 o! g: f8 P, f  J; p; |5 U- U////////////////////////////////////////////////////////////////////
+ h, o) s! @4 i6 g. k//功能: 建立各个接口的对象。设置要是别的语言种类,消息,通知事件,
* }+ @0 u( R$ g/ `/ V+ W; y//    加载文法文件。4 F: H; _0 J" a2 `8 p7 m8 `
//参数: SRType:识别引擎的类型,SR_INPROC为独享类型,SR_SHARE共享类型。
; ?( C: V, j+ V" m, b2 h//    pwcGramFileName:文法文件的文件名,要用" L"" "转换为WCHAR型。8 H6 ]: W$ X- a& }& e# \+ h
//    dwLanguage:要是别的语言种类,SP_CHINESE为中文,SP_ENGLISH为英文。; E& v/ ?+ t6 L- B6 u
//返回值: HRESULT类型。
6 @( \2 O5 j! w# [$ Z////////////////////////////////////////////////////////////////////) r3 N9 K" L9 f+ _5 F
HRESULT Create (const DWORD   SRType,: n! O# B  Q' U& {( F; i5 _
      const WCHAR   *pwcGramFileName = L"grammar.xml",. f# m8 S9 r8 |2 L( q' V* o& G
      const DWORD   dwLanguage = SP_CHINESE );# b6 n. p* C6 I% s: E2 m: S1 {7 Q

8 [6 ^' D2 {$ P4 C/ T$ S) W) @1 A! r' d, p; q2 ]
//**********************************设置部分*************************************
+ H/ X7 U6 W/ A# m; l/ p% w  D
. V: E; K1 t) [5 y$ [% D////////////////////////////////////////////////////////////////////
! c1 S. o3 ~- }/ u$ X//功能: 设置要处理的上下文接受的事件。6 W2 D5 K6 b1 v. O) D& M
//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,  k+ N7 x  \, s0 z$ e
//    设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事3 O0 V7 y# P1 u
//    件都会收到通知。3 H1 f" y7 v. {. j
//返回值: HRESULT。: g2 x1 q4 G  D* I1 H8 i( z
////////////////////////////////////////////////////////////////////
1 C! u! n& j7 cHRESULT SetInterest ( const ULONGLONG   ullInterest );3 R! @  n( |$ o: b; M# h! w* w: W
7 F: f- Y1 c# W" ?# N9 E! n
////////////////////////////////////////////////////////////////////) Y$ k( Z+ M* E( r1 `
//功能: 设置某个规则的状态(激活或者取消激活)。
) l  g+ E& c% C# l, `//参数: pszName:规则名,要用" L"" "转换。bFlag:TRUE表示激活,% X: U, ]% X1 L
//    FALSE表示取消激活。3 A1 ~" l! I" H3 h  Y9 h
//返回值: HRESULT。
6 M8 \! d' s) K& I////////////////////////////////////////////////////////////////////
; ?, e* W$ w1 T1 @9 v2 oHRESULT SetRuleState ( const WCHAR   *pszName, const BOOL   bFlag );% P) `0 P6 Z! F( z+ E

  E& Y' y1 V# X; j8 Q# F/ q: I1 [' o
////////////////////////////////////////////////////////////////////
9 a7 B8 d- e# n; h//功能: 设置识别引擎从.wav文件识别语音,如果不调用此函数则默认从麦克& Y. w5 b' i2 ~, N" n* \( f
//    风输入。7 H/ d- x( n; V# ~! n$ ~- [
//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。* Q# A+ `* l" X; @& i
//返回值: HRESULT。( X; X$ e; }8 ~3 A: v
////////////////////////////////////////////////////////////////////, I# {! w/ ]% r; X- t: n' s, P
HRESULT SetInputWithWav ( const WCHAR *pszFileName = L"sr.wav" );% e& p: o7 f/ o; g# f# S

9 m5 @, {8 Z; z2 W////////////////////////////////////////////////////////////////////  M% I/ C3 d- d0 m6 [3 I4 Z
//功能: 取消从.wav文件识别。恢复从麦克风识别。9 d+ u3 T. J2 [1 ]$ K0 [, v
//参数: 无。
+ [9 y& t* x8 ^: X  u//返回值: HRESULT。7 A7 i. p0 t1 P# `' P9 l
////////////////////////////////////////////////////////////////////
2 W3 E. D' B8 D  fHRESULT UnSetInputWithWav ( );) ]# B. y( k3 |

  P$ m/ A: j5 C& \' D$ h" x7 W+ H//***********************识别开始,结束,识别结果的处理**************************  s! U0 A% S& L

& R; Y( D1 a5 z7 H////////////////////////////////////////////////////////////////////
- o8 z& l, f% Y5 i. H//功能: 识别开始(将所有规则激活)。: _7 ^; d0 }$ b5 E  G3 c# {$ k
//参数: 无
2 C, u0 _6 t( {: J0 b//返回值: 无。
# D  k4 B/ a- `& t////////////////////////////////////////////////////////////////////  P% M$ T- _* A5 M4 M$ h1 u& z! R
void StartRecognize ( );& [1 ]1 H& z: i  ~
2 @! B1 p; s: s! o4 X' S5 Y+ n
////////////////////////////////////////////////////////////////////
: Y- {# T; T1 Y1 j//功能: 识别结束(将所有规则取消激活)。
# ]5 h" Y: f8 U% D//参数: 无。
; S1 N& h+ T/ ]! |0 ?//返回值: 无。
% E  [5 U* `. Y////////////////////////////////////////////////////////////////////
: Z7 }4 |; N* g$ g4 xvoid EndRecognize ( );
1 u! X) k0 b) m  |+ s! t
$ B3 ^" F4 A3 B' F5 _0 Zpublic:
1 O( @* e+ w, K$ {////////////////////////////////////////////////////////////////////
% Y: R* _# U$ W$ ~//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。2 V5 {( W4 x4 Q/ p
//参数: 无。
* u" G$ F; t; ?" x& V//返回值: 无。( x3 F9 E" i0 A' v
////////////////////////////////////////////////////////////////////
! a/ ]6 o/ [9 N" v& ~* x. Qvoid ProcessRecoEvent ( );3 E; t: o5 ]$ Y7 H

, C% s7 H0 ?1 |* F8 d) jprotected:
8 ~. b4 m7 K( _- R$ d4 |0 K- `////////////////////////////////////////////////////////////////////& }6 n7 h5 l1 _0 c& a8 a
//功能: 识别成功时要调用的函数。系统自动调用,不需要用户自己处理。
! w' h2 O& `8 {" `//参数: pPhrase:ISpPhrase类型。1 o3 d, ]9 ^. Y) F" i
//返回值: 无。
* r/ U1 C! z; M& g; c2 D# ~2 J+ ^////////////////////////////////////////////////////////////////////4 ^  k% [+ ^0 V+ g% k6 k+ y8 Z% R% j9 F
void OnRecoSuccess ( ISpPhrase *pPhrase );
+ {9 H0 X# K( p* U& c
3 q# o: c; B( R9 w8 ppublic:
( A* L8 k1 C* M* Q////////////////////////////////////////////////////////////////////- f8 `2 }* _7 |" F* h' G+ k
//功能: 识别成功后,根据规则的ID决定动作。系统自动调用。虚函数,
( G6 `: j; [( e; w, H: R0 I//    需要在派生类重载。规则ID必须以常量形式预先定义。
8 |0 \0 N7 ]9 Z& x//参数: ulRuleID:顶级规则的ID。ulVal:子规则的ID。
: A) r& I/ R4 t% f//返回值: 无。
" ^' ~5 P! m  Q- c1 X' w////////////////////////////////////////////////////////////////////
$ F: s9 H) P* ?7 [* Mvirtual void ExecuteCommand ( const ULONG ulRuleID,
. }% ?- M( Z9 E% _( L; P* I          const ULONG ulVal );, r+ }0 C" ]5 _$ O
( F% ^8 e) x6 I6 Z% ~0 B" Y
////////////////////////////////////////////////////////////////////
0 N/ x, ~* E* n4 }7 d' r! V//功能: 识别失败时的动作,系统自动调用。虚函数,需要在派生类重载。$ H4 d" D1 E8 x( t. i# p+ E
//参数: 无。0 I* D& F9 _' d, W( f2 H$ S8 B
//返回值: 无。
* Y2 n2 O6 r: m  \; I( n, u' m////////////////////////////////////////////////////////////////////* {' n2 S2 C& z! g
virtual void OnRecoFail ();
) k$ t# W' y9 s3 ]6 s6 c4 {5 F' D
0 y, i: H( o$ e////////////////////////////////////////////////////////////////////
: G, `) Q1 @! f% Q$ v//功能: 为虚函数。当输入流开始时要触发的动作,需要在派生类重载。# d. a* P) i- b4 N
//参数: 无。, d  o8 K) A3 L) ~# \4 V. @
//返回值: 无。) I3 J" D+ e) C* a8 N' {
////////////////////////////////////////////////////////////////////3 B- C$ F' a& d; {
virtual void OnStreamStart ();
) v1 P0 q. X( e& z8 g5 l/ _+ l" @2 V" X2 |& `
////////////////////////////////////////////////////////////////////
7 t; U' T1 Q) ~3 \( f: i. a//功能: 为虚函数。当输入流结束时要触发的动作,需要在派生类重载。
$ l9 l6 ]7 v  q- b/ u/ t//参数: 无。
! p5 a, ]& b( r. N//返回值: 无。
6 s6 Y6 x$ K( P5 K% e////////////////////////////////////////////////////////////////////! Q1 ]% H' N; Z) _2 s7 @3 H7 K
virtual void OnStreamEnd ();5 S1 ~" w9 f8 w% `+ y! r* J

3 @: X/ w- [' t* u- w7 Y};
/ z% t) L$ K% w7 r0 j) v+ d) e* D5 Z1 v6 x! k* t

) m. X  a' M6 T" w/ o4 m
5 K0 d2 \) R3 F5 h#endif    //LANE_SPEECH_DLL_H
/ b" x- N0 w. R, h2 X+ e0 B# P( E, `& S  t5 t
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$ K8 G, v( V0 V2 U5 ]
0 Q, b) u1 X: D& r9 g////////////////////////////////////////////////////////; C4 x' `! \3 M
//
- C% e2 n7 W7 z  V- Z1 r4 o// 文件:LaneSpeech.cpp
1 |/ A2 K" _$ C) X0 p6 R. ]& K// 功能:封装的speech sdk5.1 的文本语音合成(TTS)和语音识别(SR)功能# ~- B: l! U# S
//    语音识别只支持命令模式,不支持连续模式
& R0 g. ^; U6 A* E% q// 作者:吕宝虹(Lane), msn: lkjx82@msn.com, qq: 36199089 q  d# N& c1 D3 J2 Z) E+ R0 a, y$ n
// 日期: 2004.10* c& R. E# y# K# l
// 版本:1.2
/ q+ n' o  |* L, a3 G% S// ; Y, s, L* j- T) x5 L
//
7 b8 e: j! X+ U2 X! p) G////////////////////////////////////////////////////////
0 U) Z1 O# ?* o4 z: b; o8 P0 N. @
( j$ v) I/ U0 I+ y  u8 r& Z
0 R% B! y1 w9 A2 Z# H5 P# C3 J
* x- v) l$ w5 j! z. q0 Q#include "LaneSpeech.h"/ P. i! h9 n" w: K9 e
6 X7 [8 i+ V/ A8 M" h4 B2 q  V3 m( }
//-----生成动态连接库和静态库的处理----------------
, u) Q+ P( l* j5 q5 M/ g! k#ifdef USE_SPEECH_DLL //定义了USE_SPEECH_DLL,就按生成DLL,声明导出导入类- k% T$ I/ i* k  I  {7 ^+ L, Z
( w4 o- I! o) d$ C2 ]. C
BOOL APIENTRY DllMain( HANDLE hModule, $ x- V4 `+ S7 L5 t: Q
                       DWORD ul_reason_for_call, # Q5 \2 d1 U9 o+ \. ^
                       LPVOID lpReserved
* {$ a/ p2 N1 [' N      ): |; T! M% u, y
{
% a: k" d6 c( v0 u! i. P3 O" j    switch (ul_reason_for_call)9 k0 {/ S2 E( ^7 i' J' P
{
% I0 M! w/ i8 f' B+ d- }! d   case DLL_PROCESS_ATTACH:
. Z* f3 T8 i7 P    CoInitialize(NULL);* @% `* \# ?- u& F, c5 d! S( _! |& D' }" Q
    break;
1 D2 V  D6 X3 R4 H, l* E  1 c- L: P; c7 W) s& U3 ~. ~3 V. Q$ E
   case DLL_THREAD_ATTACH:8 I8 d& g9 G# n1 s) l* |- c: ]! o% O
    break;
2 `: w5 g8 y+ Z) {- Y" G+ h& S, s4 t  4 b% u3 G3 b- X9 K+ @: }8 v
   case DLL_THREAD_DETACH:. f! y  \2 u8 D" D* w: u) Q
    break;4 K) w: G7 a' Q) B5 `. {8 h
  
. I* N! k/ D3 N# W3 B# o   case DLL_PROCESS_DETACH:; e& |# S9 X& W6 @0 J8 V3 R5 [
    CoUninitialize();) Y+ U; i9 r7 X8 o" R  C2 D
    break;! \0 y7 ~% o$ C3 R4 S. a# v% J
    }
" }; o1 _! F3 J) _9 ~    return TRUE;6 {* ^' |  S, R
}/ Q$ T( D0 w6 T- _0 K3 H
5 J  k" V+ M1 y  g, r- C1 l
#endif //USE_SPEECH_DLL
, Q* U* F2 q# A: r; w
* r( ]4 b  p8 v8 ~
" F; K7 w7 U/ J: d! ?8 w
, G* K, ]/ ^9 A1 [2 X3 y  v$ {///////////////////////////////////////////////////////////////% o$ a5 m# i8 g* V  K; m, W

' `5 s/ `& Q; w- m* R////////////////////////////////////////////////////////////////////
+ \' R) `+ p) v$ x" M. P//功能: 弹出一个信息框。! Q) ]8 g( _6 v: d4 y% R% y
//参数: lpText:是对话框信息。lpCaption:对话框标题。: }# p: i$ Q/ z8 Y1 I
//返回值: 无。* w" }% M0 L! R0 O3 Y+ Z
////////////////////////////////////////////////////////////////////- [" C- a5 o% ~9 C) B! Z" I- {. o( u
inline void ShowError ( const LPCTSTR lpText = "ERROR",
# t2 P6 v8 }' \( g; b& c# i! m# \        const LPCTSTR lpCaption = "ERROR" )
, E( {3 e  c) \( y; v; N{
' L2 L; f1 Y3 q   ::MessageBox( NULL, lpText, lpCaption, MB_OK | MB_ICONERROR );( I1 A5 R' a" \, S& q8 d; u
}3 _9 S& C# [( x" \7 Q

. j$ Z; x: x$ s. Y8 A! a- M////////////////////////////////////////////////////////////////////% t6 h9 B/ P/ m" F5 c2 l& n! ?
//功能: 检查一个HRESULT类型的值,如果是错误的值则,弹出信息框提示错误。* E* W2 }0 o& S% {& h- k# I7 ?
//参数: hr:要检查的HRESULT的引用。 lpText:是对话框信息。; G# T# _) x" ]% X* u
//    lpCaption:对话框标题。) C) l% S) }0 T$ Z7 i
//返回值: 有错则为FALSE,没错则返回TRUE。
0 V5 R5 H- s" n$ m% b$ ~////////////////////////////////////////////////////////////////////, }, c: J* d3 k; d* r  B6 V
inline BOOL CheckHr ( const HRESULT &hr,& N- J2 {9 @3 u" A- @" I
        const LPCTSTR lpText = "ERROR",* p' {( A+ H2 j# p+ C4 ?
        const LPCTSTR   lpCaption = "ERROR" )0 N! R6 t" X7 A
{
0 d6 Z7 b/ Q  i5 S' p% m$ [8 A   if ( FAILED( hr ) ) {
7 u* S. ^% Z/ i7 p. I$ }5 B3 d) C    ShowError ( lpText, lpCaption );
- M4 K9 _) y+ ~/ O1 T5 R& ?    return FALSE;
' l/ D7 R$ x' e4 a9 f" C   }
0 F4 p, S4 E* B! R   return TRUE;
- x: s8 A$ r& C1 l# k}" d/ M+ E; _5 J% W
, k) \) v( w7 {, a& g  A: g
0 X5 |* z7 ?6 X9 `2 l
///////////////////////////////////////////////////////////////////////9 }- a( g# O& [3 z/ ^0 O# ~
///////////////////////////////////////////////////////////////////////! Q. ^( e; A! j( [% x
//
; \' x0 ^' ]  w8 b5 z//         CTTS4 S% V( u9 n: \* b
//5 j$ Y8 [3 Z$ D' [: h5 n' s; U$ Y# N4 _
///////////////////////////////////////////////////////////////////////4 i6 l& d$ K1 v6 e7 [+ o
///////////////////////////////////////////////////////////////////////# h6 X, z3 O0 T. _! F$ |
* q2 T+ S" d6 y& h. Y4 u
////////////////////////////////////////////////////////////////////
( a" d- l( k) e6 e0 |6 j" s//保存关联窗口句柄。初始化COM。/ t* o: r, Q# c% U/ y1 u$ H" r1 h8 x
////////////////////////////////////////////////////////////////////
; a6 r) W0 d3 M* t7 SCTTS::CTTS ( const HWND hWnd )+ H9 w' d7 Y9 ~+ G( F& E4 t+ B
{* D$ t/ w1 ~4 A$ B
m_hWnd    = hWnd;
0 w9 X: y' d/ @5 e1 R2 G# um_pVoice   = NULL;
4 |' J/ Y9 O6 E; U7 C) C2 }m_pToken   = NULL;, R- [+ \( s% J( R+ W
m_pOutputStream = NULL;; M$ H' G5 ?* P$ E/ C
m_pAudio   = NULL;
' U$ C. n& l' p. L}
# u0 N  P2 v5 B3 t/ _
+ y0 t5 C: |$ P" s5 c////////////////////////////////////////////////////////////////////
& t  o4 M+ @8 _  l2 H) S0 ]4 c//释放所有对象。
7 O" a; k2 _9 W& ?% M////////////////////////////////////////////////////////////////////
  o: l1 M! y) j! b: A3 X: @2 L/ [, _CTTS::~CTTS ()0 r" ^1 M' ~- t, H3 l7 R  _5 x( q
{
4 K! }: v/ |, s8 J9 ?4 yif( m_pToken) {
' ^) C9 b! F* P/ W   m_pToken.Release();
" |9 z  l' K; ?9 u: T' J3 V   m_pToken = NULL;- }$ X' z0 y8 Q* w
}- b+ e7 D5 j3 Z4 w: l
if( m_pAudio ) {
3 V! @; l( b) l! b( R   m_pAudio.Release();& v) ?( S' U: @  X8 o# @
   m_pAudio = NULL;
; a& z: n/ ?) X. v% @" r( j}; C1 A5 c9 |  R' E7 `  Q% A7 Q7 ~2 M+ e
if ( m_pOutputStream ) {8 j+ g3 S1 y- N. `$ l9 I0 n( R
   m_pOutputStream.Release();
4 x/ [; }$ E$ F! O9 E9 F' Q1 u   m_pOutputStream = NULL;3 g5 P& |& f5 C$ s) Q3 Z
}
* S* k; e" F& X& P9 kif( m_pVoice ) {
3 E; S6 j+ P" p  g. f   m_pVoice.Release();! |4 n% Y" ~3 F- T. ^
   m_pVoice = NULL;4 C) m6 v+ X1 Z
}6 z: g# k. F9 o5 {
}
' z$ F% \/ x! t1 k0 u" Y2 t/ e. H1 h8 Z0 {1 J+ U% h
////////////////////////////////////////////////////////////////////
  A( Q4 o9 _: K( o1 l//从SR的上下文中得到voice对象。此函数在CSR中被声明一个友员。/ ?$ n0 j4 V" C' N/ _
////////////////////////////////////////////////////////////////////
% {! R8 ]/ j/ e( t& e, N# r% M. vHRESULT CTTS::Create( const CSR * pSR,
$ p4 ^. I3 B5 C# |& ?( u       const DWORD dwLanguage )
, ~6 y! o; g( j( O4 Q, l& v{8 V. |: M  ]" W
HRESULT hr;! E% |9 @2 g) {
hr = pSR->m_pSRContext->GetVoice ( &m_pVoice );( }9 E- I! g$ j7 D4 Q$ I
if ( !::CheckHr ( hr, "pSRContext->GetVoice()" ) ) {
7 O! D- Z# a- R2 h( s9 Z. ~   return hr;$ a) O& B: j, k- T
}
% i9 I0 o  @9 ~0 Z  R1 X, q% j% w! @' {1 ?# j" e( x# H4 R1 }
SetLanguage ( dwLanguage );' G8 }3 f! ]2 w  H# q/ k& A
0 x4 D" E* i$ N* N* u) b
hr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );//建立一个默认音频流( Y- h  {0 F* \, @5 P
if ( !::CheckHr ( hr, "CreateDefaultObjectFodd()" ) ) {# P) S' @+ t9 |8 o# B! J4 [/ ~. d
    return hr;
: g3 Q  U' N" @, I/ d/ \- w$ h}; V* M5 ]3 M" H2 K

1 |# Z8 I. \2 X! M% A: g' v//SPEI_START_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM
4 U; |; m; C9 d; k+ I, Y5 @//SPEI_END_INPUT_STREAM 表示完成流输出。6 w7 W: E  O# S/ n9 |7 Y  x6 w
hr = m_pVoice->SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) |/ C  n! j" X/ z9 m4 J! @) s
         SPFEI( SPEI_END_INPUT_STREAM ),
. S1 q: m; P, i            SPFEI( SPEI_START_INPUT_STREAM ) |
# w3 v, N9 i0 U4 w! A            SPFEI( SPEI_END_INPUT_STREAM ) );
$ e0 j9 n6 y( V+ Y: ?  Dif ( !::CheckHr ( hr, "m_pVoice->SetInterest()" ) ) {
# l) b4 J! y) G& y    return hr;$ U1 v$ }% R2 e8 Y! j
}0 K6 y6 X& Y) [) H) a: T

$ B9 t. }& a6 `2 ~: I" j1 z//设置通知消息: c& [" H: r2 L' G6 k
hr = m_pVoice->SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 );+ L' \  s- i# X3 ?, @
if ( !::CheckHr ( hr, "m_pVoice->SetNotifyWindowMessage()" ) ) {
. L$ e& d9 v. \    return hr;
3 g8 L( M1 A1 F+ G8 V% |- s; |3 t}1 a6 q+ d  S4 ?2 k6 L% ?( o1 F- u% t

2 O5 g2 i) P. B0 _* ~* G2 T4 \+ n! C1 mreturn hr;
: O4 J  r2 p2 N2 E' B9 k}: M1 X( f  o7 \' C2 F# V

) U9 w8 `# h" d) b; \1 f* l, e////////////////////////////////////////////////////////////////////( Z7 c5 y6 l/ W6 v! ^! _( S
//单独(相对于从SR的上下文中得到voice对象)建立一个voice对象。: X, {6 Y( a3 t- i5 b/ v2 O# h9 v, ]
//并设置兴趣,设置通知事件。' m) a' j' Y6 l5 `# p% h" J
////////////////////////////////////////////////////////////////////
3 \3 D8 ?8 U' D0 H9 {HRESULT CTTS::Create( const DWORD dwLanguage )
. R/ y( y/ A1 Z{! Z" W3 Y* T) O
HRESULT hr;
- ~1 f# B% @: o: @! d8 mhr = m_pVoice.CoCreateInstance ( CLSID_SpVoice );& A0 K1 w( I  B: y8 H9 t6 h
if ( !::CheckHr ( hr, "m_pVoice.CoCreateInstance()" ) ) {& N5 M* y3 l( Q3 B1 M+ P4 A; d
   return hr;- k% Z& n3 ^, V( t; g* ^; T
}
; g" R# t) i. s0 [' p: Z4 X) s$ _3 j! `) c" E% E
SetLanguage ( dwLanguage );6 R$ r- _  |# P0 H2 X
' R( O; l2 R! Y, n- p: d
hr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );//建立一个默认音频流8 i: ^# W! i' z8 H+ Q* `( k3 ^
if ( !::CheckHr ( hr, "CreateDefaultObjectFodd()" ) ) {
! u3 i# w0 E8 M( i5 g( U+ D: y    return hr;
, y) P8 x# L" D3 ~}$ T6 `! U* q* p5 U( E1 [
" e! C" l- m: U! F2 \
//SPEI_START_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM+ J) V* H7 J; X- l- |. p4 Y9 W
//SPEI_END_INPUT_STREAM 表示完成流输出。5 X+ F2 m$ c! C8 X0 m! t7 J
hr = m_pVoice->SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) |3 D) c) w0 L# [; D8 a& C
         SPFEI( SPEI_END_INPUT_STREAM ),
) ~: L: ^. u7 S/ A- m            SPFEI( SPEI_START_INPUT_STREAM ) |% t, j4 P1 C% Y/ y
            SPFEI( SPEI_END_INPUT_STREAM ) );/ ^- |. O9 P5 x- D4 n4 H
if ( !::CheckHr ( hr, "m_pVoice->SetInterest()" ) ) {% e- y6 P9 M7 ~5 w5 x
    return hr;' O7 S! Q7 {" h% A5 a+ E. N
}
. r, G! }0 o0 k& v( d( ~4 |
( c3 C$ ]+ `0 ^# Q//设置通知消息
+ \1 E/ _# N2 m4 a5 o5 p# khr = m_pVoice->SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 );
- Z8 p1 _, }  |; d, l5 Tif ( !::CheckHr ( hr, "m_pVoice->SetNotifyWindowMessage()" ) ) {2 [, A$ V% d6 B4 b, [4 K
    return hr;
, X4 G3 W8 W- w, s; {  [}
, B) r# Z2 |* Q. T% p3 S, t- F5 o  p# O) @4 ?/ g+ f" D
return hr;
! B" `2 S& ^/ [. G}
3 f; ]6 J7 y. ^3 w3 L4 q4 P/ h
 楼主| 发表于 2011-5-23 17:06:27 | 显示全部楼层

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

第一个小程序
装好SDK后,我们当然要运用了,要不然我们装它干什么呢。我觉得写程序的乐趣就在于自己写出了一个能运行的程序,那种成功的感觉很好。好了废话不多说了,接下去就来写第一个能运行的程序吧。
1、新建一个Win32 Console Application空工程,在工程里面新建一个C++ Source File。
2、首先当然是包含头文件
#include <sphelper.h>//语音头文件% |( V* q5 s/ J# Z
#include <iostream.h>//C++头文件,用来提示错误信息
3、然后是主函数
int main()8 Y) b' K" _8 P
{& x/ F+ T, h4 k4 o( y1 H( ?
    ::CoInitialize(NULL);//初始化语音环境1 n3 H1 |1 S( G) i1 Q* |
    ISpVoice * pSpVoice = NULL;//初始化语音变量5 g9 _) y) H: k) E0 s9 @
    if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL,CLSCTX_INPROC_SERVER, IID_ISpVoice, (void **)&pSpVoice)))  
    //给语音变量创建环境,相当于创建语音变量,FAILED是个宏定义,就是来判断CoCreateInstance这个函数又没有成功创建语音变量,下面是不成功的提示信息。
    {
1 B% x1 m9 G- ?8 }( F        cout << "Failed to create instance of ISpVoice!" << endl;
8 e+ }( `) I3 a0 n3 t9 i' S3 b, e! ?1 K        return -1;
8 J- D2 A) N. `/ r& y. ~" D    }
# K, b7 A7 H% l1 j4 j
    pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);//执行语音变量的Speek函数,这个函数用来读文字。
    pSpVoice->Release(); //释放语音变量
, t8 r6 Z4 ^# \1 a    ::CoUninitialize();//释放语音环境

% L4 u# _8 E3 R% D. ^% e' B    return 0;; [0 m7 m9 N' q
}
4、第一个程序就这样写完了,运行读出了Hello World,是不是觉得很神奇呢,呵呵~~~~~
回复

使用道具 举报

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

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

VC6.0下开发Speech SDK5.1程序- K$ F. j: _: L. R# d7 A4 F
  r7 _; L" j& ~, j5 x& g* P( I
1.首先开发得需要Microsoft Speech SDK的支持,以下是下载地" ^) @; K- }4 m) `" c1 n4 z. e
, ]# [: }% l! Q1 R3 k) E
http://download.microsoft.com/do ... -US/speechsdk51.exe   - u1 Z: B2 h; j; Z+ [
Speech SDK 5.1安装包 (68   MB)     ) T" ~8 N. q' g( r
http://download.microsoft.com/do ... chsdk51LangPack.exe      
1 c3 s' }5 @* E8 E( c; |. _中文和日文语言包(上面的安装包只支持英文,如果要你的程序支持中文则下载此包)(81.5   MB)  3 t6 {7 y& w6 {/ \' C

. W. z2 J2 R, c1 c8 x) i  U2.下载后,执行安装8 Q: |. j5 Z: C
1 o! {, C/ t4 _  ~, R: g
下载完毕后首先运行SpeechSDK51.exe,它其实是个压缩包,不是可执行文件,解压时选择解压到的路径,然后,运行解压出来的可执行文件,默认安装路径为C:\Program Files\Microsoft Speech SDK 5.1。运行那个中文语言补丁包SpeechSDK51LangPack.exe,和上面的一样过程,这也是个自解压文件,不过这个第二步不需要选择安装路径,运行一下就行。
& w* r4 r) b* B8 Q0 e1 P0 U6 O$ J* j8 C0 m5 ]  @9 g) |) S! y
3.VC的环境配置
. d% J9 \. `' L" G
! o0 E) }( V2 t0 U4 L( u在应用SDK的开发前当然得需要对工程环境进行配置,我用的是VC6.0(其他情况类似),配置的过程如下:2 T( ~% l- {* o) L, q/ h
8 u0 h6 T" B' w* G* {# N
工具->选项->项目->VC++目录,在"显示以下内容的目录"下拉框中选择"包含目录"项,添加一项C:\Program   Files\Microsoft   Speech   SDK   5.1\Include到目录中去。再选择"库文件"项,添加一项C:\Program   Files\Microsoft   Speech   SDK   5.1\Lib\i386到目录中去.1 Y5 Y/ x6 }3 \7 z& [; |' {
3 i8 Q1 a  Z. w' W6 Y% A0 e9 d/ M2 n
好到这里为止Speech SDK5.1的配置算是完成了,接下去就可以写程序了。呵呵~~~~~~~
+ h% M* }( j  H! k* F! j9 S: G4 T
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-14 14:41 , Processed in 0.021126 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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