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

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

[复制链接]
发表于 2011-5-23 17:04:22 | 显示全部楼层 |阅读模式
////////////////////////////////////////////////////////' P" L! \! o2 J5 n; O* j
//1,生成动态连接库时,要#define USE_SPEECH_DLL,! t! D. s& X0 [$ J  R/ F. Z  R
//      并且#define LANE_SPEECH_EXPORTS
2 Q* |/ x; h1 l2 k- \//2,使用动态连接库时,要#define USE_SPEECH_DLL
! q, s& V( p* e//3,声称和使用静态连接库时,什么都不需要
6 ?' o) x0 R5 j( H//4,另外主程序中静态连接库要调用的方式里要调用CoInitialize( NULL )和CoUninitialize(),( g7 ?) X% E* i% X8 k) o3 Z) R
//      动态连接库就不用调用了。0 O" Q4 w0 m/ N9 m" k8 U& Z) Y
////////////////////////////////////////////////////////3 F- ^/ O5 G. F8 F0 M. b; p
#ifndef LANE_SPEECH_H
6 |" c5 A" X4 ?7 N4 B#define LANE_SPEECH_H
" f5 s$ A4 Y# }$ y% M4 ~: R! t, Q  B7 [& S: R/ Z* r4 @) P
#include <windows.h>5 {- j$ u: S0 ~7 _1 ~9 _
#define _ATL_APARTMENT_THREADED" Q0 E. B1 ?3 H, _' d5 x+ ?2 R
#include <atlbase.h>3 ]/ ~, T% Z  j. o3 L/ I5 I# E* O
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 _Module5 E- F- P8 N1 I, {
#include <atlcom.h>0 \' l: Y$ p0 a  F; d0 _/ j$ A& D
#include <sphelper.h>   //sapi需要的头文件
0 Y3 _8 t8 U8 Z& N
; Q5 O! \; T  x; @4 _. {: V//-----生成动态连接库和静态库的处理----------------
) b5 |$ o- Y. F- n0 }#ifdef USE_SPEECH_DLL //定义了USE_SPEECH_DLL,就按生成DLL,声明导出导入类
1 j! V7 P+ o5 \, U) j1 k2 P7 @0 E, D: b
#ifdef LANE_SPEECH_EXPORTS& s; `% z# ?" o+ ]+ o: i
   #define LANE_SPEECH_DLL __declspec(dllexport)5 C! O% D6 x8 P! ]+ r
#else" M2 ^" p& R5 k+ Y6 O8 T# E" }
   #define LANE_SPEECH_DLL __declspec(dllimport)
2 |. O3 [; P: K& K" S#endif+ R# Q9 x/ t1 }+ p
% p5 c8 Q. q  s5 f3 Y/ L- }, R) p
//这个警告我现在还没闹清楚是怎么回事了,估计是DLL和com或atl有关+ h2 ~' t% b$ L2 w& N, c' D
//暂时只能屏蔽掉它,在静态库里就不会出现这个警告。
3 e; u5 n8 Z" Q5 j# ], _#pragma warning( disable : 4251 )& \6 @& `0 c% e; x  h6 a

4 `1 M0 A' O  O6 P' u#else     //没定义USE_SPEECH_DLL,则不声明导出或导入类(LANE_SPEECH_DLL就为空)% {9 b& q1 B7 \. }
#define LANE_SPEECH_DLL% x2 S7 ^$ O- J' E! s
2 ]) i0 _1 M$ d# O& O* I
#endif //USE_SPEECH_DLL
" [! ]; Y  M) l4 d  D0 w% q: |& R. F9 h6 |- u

: W/ o  t3 H  G6 x7 c//***************************常量***********************
) p( Q) P4 g! B( N) G; u
+ Y6 \# D1 D6 I1 X3 B1 M/////////公共常量-----------------
% e1 j+ ~( d- B+ gconst DWORD   SP_CHINESE = 0x0000; //简体中文.
( K2 b' G* r& q3 Y' f: lconst DWORD   SP_ENGLISH = 0x0001; //英语.' C. q9 P# c9 N- w- x- a* M7 c

; f$ r- s* r4 x$ [8 |- `) i0 z3 T/////////CTTS常量-----------------) u0 p) v. C3 D  }
const UINT   WM_SPEAK = WM_USER + 4444; //触发事件产生的消息。8 B$ e6 `9 M, K5 N# A* Q1 {

) ^6 D% y( t8 [8 H5 R0 m/////////SR常量-------------------
, f( A/ S  F' b# Q$ A3 Aconst UINT   WM_RECOEVENT = WM_USER + 3333; //触发事件产生的消息。/ m" Z' z& e0 k! p3 R9 Y2 H$ v
const DWORD   SR_INPROC = 0x0000; //独享类型的SR.# F8 k) {# j6 U# P
const DWORD   SR_SHARE = 0x0001; //共享类型的SR.- r) A; R' V( K; ?/ \2 [% Q$ g
* o$ ]) A$ ~: u' |" u
//以下常量仅作例子用。* o+ d8 @( z4 A" _$ u
#define VID_TopLevelRule 9000   //顶级规则ID
% O/ ^; X: _1 `: {+ {- S! `#define VID_SubLevelRule1 9001   //子规则ID
6 s, @/ }( N. h4 l3 w$ D& F7 n#define VID_SubLevelRule2 9002   //子规则ID
/ X5 m# {8 q# _% _#define VID_SubLevelRule3 9003   //子规则ID, J; g! a+ w9 @4 D  S

1 I! V3 c2 f: ~  G8 y& F) v
. a' M; v. U; `//*************************类声明************************
. v4 l  _3 t, ?. @6 M$ G+ p  F: {( T8 h' s( ^6 e- \" x7 x

& i3 U8 V- [4 @: u( l* gclass CSR;) A+ Y! e9 S7 j0 m, a% [; y
///////////////////////////////////////////////////////////////////////+ Y' L$ A1 a" z5 b# v
///////////////////////////////////////////////////////////////////////+ j$ G) o2 t- D6 |# E' G
//
: A8 l3 N$ c( h% l  O* E% q//         CTTS2 c3 ?& b5 M! P7 l6 \9 h7 a
//
4 Q- T0 B( y7 j  t) G///////////////////////////////////////////////////////////////////////
' Z* I9 C" B5 f" }7 r0 r///////////////////////////////////////////////////////////////////////# F/ X: G, u8 o4 A( i- B, d
$ O# U, g% U8 R
class LANE_SPEECH_DLL   CTTS
' I( c9 a& o+ L7 g5 f7 }, _6 |{
) r$ W) m& ^9 t" U  t+ t  }) qprotected:+ S: G8 W  w+ N& Y
HWND       m_hWnd;     // 关联的窗口句柄。0 v  `3 C! u; O0 D
: Y4 i0 N! n1 f7 q5 X/ L
CComPtr<ISpVoice>    m_pVoice;    // 声音对象的指针。
' m2 j9 @$ |$ c1 s! ]6 kCComPtr<ISpObjectToken>   m_pToken;    // token对象的指针。. D; \" \% {2 Z2 `% B& H
CComPtr<ISpAudio>    m_pAudio;    // 音频对象的指针。(用来保存原来默认的输入流)& s" W6 e" u4 ~
CComPtr<ISpStream>    m_pOutputStream; // 输出到文件的流对象。! Z. S6 G0 k  ]

; X* S( Y. L2 q4 x* }% H3 hpublic:
; N& B! v. I# A2 H! W3 P. K//********************************初始化部分********************7 x" A$ ~3 t* j+ A4 O
: @8 l- \) [1 j; W' t8 [9 W) ~0 |' D
////////////////////////////////////////////////////////////////////0 R2 K/ P# Y% X' m. b+ X; k
//功能: 保存与识别引擎关联的窗口句柄。
- S: h4 Y, u1 z* P3 V//参数: hWnd:要关联的窗口句柄。' ?; U( \5 A0 W" o
//返回值: 无。1 R/ t# ^* l, l$ w' J2 h  b. t
////////////////////////////////////////////////////////////////////! Z' ~7 S0 \/ F4 c# P1 F* _$ p# o8 q
CTTS ( const HWND hWnd );
) a7 s  J3 C# l6 U# R& a  l) `
////////////////////////////////////////////////////////////////////
/ @; N( S9 M% [: j8 f% L//功能: 释放所有的对象。% `/ c- Q% _. c- z5 X
//参数: 无。$ m1 e. Y) q$ [6 _- t' _  i" h
//返回值: 无。
- T9 j- B, r4 z////////////////////////////////////////////////////////////////////* [  J' V2 V3 J4 n
~CTTS ();- r; \- p4 K- P7 h8 u

' X! g* n- p# B9 L7 Y' ?////////////////////////////////////////////////////////////////////( @& I! t- i4 r' A1 m2 ]% I. N
//功能: 建立一个voice对象。设置要是别的语言种类,消息,通知事件。
- A! l" O( G7 u2 _/ B( ]//参数: dwLanguage:要朗读的语言种类,SP_CHINESE为中文,1 S2 ~* e, M: x! r
//    SP_ENGLISH为英文。
4 n" Q* Y- I$ B9 b//返回值: HRESULT类型。9 r+ T- n6 T) O# @& X2 Z- J
////////////////////////////////////////////////////////////////////$ n+ M# s$ u$ N; ^/ e
HRESULT Create( const DWORD dwLanguage = SP_CHINESE );
; I# \! `9 @- ?% T3 }# H% r0 X: n
) C, `4 Y, G  I# I( D" {  ]////////////////////////////////////////////////////////////////////0 K' z2 e  a* i2 f: C* P- j
//功能: 从一个SR引擎建立一个voice对象。设置要是别的语言种类,消息,* _. ?) M% L- b9 U
//    通知事件。
- I5 o& ?; o( E" H$ h//参数: pSRContext:SR引擎的指针。dwLanguage:要朗读的语言种类,' {4 x2 ?$ z; ?  f7 V9 v& w+ o7 j/ Q
//    SP_CHINESE为中文,SP_ENGLISH为英文。1 S/ P, s8 M1 o" s7 w
//返回值: HRESULT类型。
! Z  U; c! X9 G8 P9 P# N$ P////////////////////////////////////////////////////////////////////
; }8 x8 c1 |7 B8 DHRESULT Create ( const CSR * pSR,
. Y  W+ p2 G4 J' \" J       const DWORD dwLanguage = SP_CHINESE );
3 l6 o- n/ L! i* |
, v9 q4 |# J8 i! E. J. ]  t% m- @0 A' w) j! a9 M8 \9 R# F
//********************************设置部分***************************************1 k8 N2 w# c7 a5 s
2 [( S1 u' O6 l* v. a3 V) r
////////////////////////////////////////////////////////////////////- x& N' O& D, u; M; S8 I8 ?
//功能: 设置朗读声音的语言种类。, w: u1 R- S3 O7 ]$ w3 ?
//参数: dwLanguage:语言种类。SP_CHINESE为中文,SP_ENGLISH为英文。3 J; d0 k) `+ t' A4 \
//返回值: HRESULT类型。8 G% f8 H) t# ?4 I. C
////////////////////////////////////////////////////////////////////- }6 ]6 l. K' k
HRESULT SetLanguage ( const DWORD dwLanguage );4 k' f# R) D- T' @" b4 B6 Q- p
, H# z2 `- Q! [) K
////////////////////////////////////////////////////////////////////8 C0 c* [8 G3 o' d: w
//功能: 设置要处理的的事件。
& S! ^* ?. D) t6 M+ _- M; V//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,# p" X9 e' C  V
//    设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事
( _9 i0 I, o% ~# H8 b! t//    件都会收到通知。
8 K# u. ]/ b0 d//返回值: HRESULT。0 Y" p" \& p7 c# z/ u, E$ n
////////////////////////////////////////////////////////////////////
  F7 [  L# D$ U+ s+ S: @HRESULT SetInterest ( const ULONGLONG   ullInterest );
4 ~" K% V: _; `8 I) R2 K* Q" i. a: J6 r* Q7 B3 p8 [2 M2 F
////////////////////////////////////////////////////////////////////; t5 @1 X# |/ D8 [
//功能: 设置朗读声音的音量。
# m8 _2 Y  e# b; o5 I//参数: usVolume:音量数值应该从0到1008 a) h  d% R4 T
//返回值: 无。! P. q: s" d! [# k8 N0 @( }1 y
////////////////////////////////////////////////////////////////////9 e) }2 ]% @9 z; |& W' H
void SetVolume ( USHORT usVolume );
% }$ w/ Z  l) b. r- f- s& ]$ T7 l' s# d5 |6 ]2 ~' Z6 }
////////////////////////////////////////////////////////////////////& d4 Q" Z+ B0 h1 o, K
//功能: 得到朗读声音的音量。
  W. ~3 i# h8 V% `: _) q: z% Q4 q//参数: 无。
/ y. j/ @* |. z//返回值: 音量数值,应该从0到100。' K9 ^4 B& L- M+ l  t" R( s: D% B
////////////////////////////////////////////////////////////////////
3 B' S/ y3 Q- [1 ?: }: G/ kUSHORT GetVolume ( );' l# B. p0 s: k$ J- m
; Y  e. @- h1 S6 m; E" s+ x
////////////////////////////////////////////////////////////////////
* V; k4 s' q. H) G. e//功能: 设置朗读声音的音速。
+ Y* w- P% _$ q" W//参数: RateAdjust:音速,参数范围从-10到10。$ D4 k$ @1 v: |2 M+ ^& }
//返回值: 无。' d( J! D& g4 Z. E9 G
////////////////////////////////////////////////////////////////////
; k0 I# K+ o- k8 k) \2 T* n5 jvoid SetRate ( LONG RateAdjust );
# y: w& [/ `! \2 I+ V, P+ N; m/ U) h0 P9 b
////////////////////////////////////////////////////////////////////
8 U( f0 J) P6 k. A) F+ n) I# J//功能: 得到朗读声音的音速。
( L- a3 X. J3 S//参数: 无。0 H5 b5 O2 @  b: @8 Q# s
//返回值: 音速,参数范围从-10到10。0 l4 q7 z: l) z  Z: E, |
////////////////////////////////////////////////////////////////////
+ I* i! q# E' ~2 y& r3 D6 Z; n% qLONG GetRate ( );
; u# x8 J. X* h; B0 j9 g; c- q
$ C0 L/ C8 L: o6 N2 {( L////////////////////////////////////////////////////////////////////
, l. g5 }4 \& U6 ~4 H+ K//功能: 设置朗读的声音流到.wav文件,如果不调用此函数则默认从音箱输出。" L8 s& _/ O! D1 i4 Q
//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。
* A. S+ o2 x# g4 h7 v& A$ h+ @//返回值: HRESULT。
7 E5 ]# \% r% q5 a) w////////////////////////////////////////////////////////////////////4 T- D- {  Y0 S
HRESULT SetOutputWithWav ( const WCHAR *pszFileName = L"TtsOut.wav");
5 N, Q/ z8 j& C1 F3 J" _1 l) D! U- w1 S2 R6 [& E
////////////////////////////////////////////////////////////////////
% y4 Q! V& h  y# J  `$ Q: s//功能: 设置朗读的声音从音箱输出。9 C- j2 w( Q4 {8 v
//参数: 无。
$ \! X/ A* n4 q' n2 {. S//返回值: HRESULT。3 L: B# I0 k% J% a* W
////////////////////////////////////////////////////////////////////
% f+ T( w1 M& g$ \HRESULT UnSetOutputWithWav ();
$ b4 S7 E1 k; ^) ^! P/ ~- u8 ^3 c; i0 i; N$ Z$ t

% O8 J2 p9 N, J. K//**********************播放语音,文本到语音转换部分*****************************3 s) s5 B: v0 I  {  E0 a

3 H$ c+ X6 L- k7 J8 W////////////////////////////////////////////////////////////////////& f% ?5 \9 C, \5 K- K) ]6 _
//功能: 停止朗读。如果朗读为同步方式,则不能停止。  c2 \% M& X) T, U1 f3 s
//参数: pwcs:要朗读的字符串,需用" L"" "转换,可以是包含xml标记, m$ H  q$ ~# N# H8 S) c+ v0 a
//    的字符串。dwFlags:朗读方式。SPF_ASYNC为异步,SVSFDefault为同步,
$ ?4 E8 n) X3 v5 w2 l# F/ D//    SVSFIsXML为朗读带xml标记的文本。% I6 v" r% J; m: @& m( p  J9 u2 U
//返回值: HRESULT。
1 y( [3 h2 m) f! c+ f4 a////////////////////////////////////////////////////////////////////
( N5 d6 R: Q$ D  T* P5 g3 z1 zHRESULT Speak ( const WCHAR *pwcs, const DWORD dwFlags = SPF_ASYNC );4 @; B6 B3 O! g' q! b% _, L/ ?+ r
$ h7 ~5 o& y" a0 ?% }5 H& y  W- }
////////////////////////////////////////////////////////////////////
& X) G) U* q' ]: B$ ^$ ], ?//功能: 停止朗读。如果朗读为同步方式,则不能停止。- E( @  ~* o6 n5 s+ G4 d
//参数: 无。
* K8 c0 Y' d% B9 m//返回值: 无。2 i, [" j# x/ a
////////////////////////////////////////////////////////////////////
( m  h5 h" y# s" z, [; x, Pvoid Stop ( );
7 T+ Z3 r1 M0 w' L* S/ M) @* ?! \! F0 R; C- q
////////////////////////////////////////////////////////////////////7 p6 h8 b* G4 E: ]: R' x1 l
//功能: 暂停朗读。如果朗读为同步方式,则不能暂停。. n2 v8 P& b( q. g: {) }
//参数: 无。- G8 j2 X* O6 p! P# f) {% e5 `
//返回值: 无。
; x1 ~7 n1 V3 @5 v0 Y////////////////////////////////////////////////////////////////////
9 R- W; b2 t4 V( H3 Vvoid Pause ();( T0 t8 o5 ~0 N$ v9 C8 J

6 O3 r# y. a. G8 w- y& Y4 ~////////////////////////////////////////////////////////////////////$ y. M! K: ^+ {8 w: G2 T
//功能: 从暂停的地方继续朗读。
6 A5 D  S/ ^) X( }& j//参数: 无。
/ h  ~4 c2 _2 q1 ?, k//返回值: 无。
. P- g. R* Q( m: i////////////////////////////////////////////////////////////////////
5 C. n$ ^) R8 C( uvoid Resume ();0 g: _0 L  v! Y. x) {0 E+ F" S3 i

2 ]" L2 r: I$ Q$ m: f1 N4 H/ e& J& k4 I! O% Q$ K
//********************************处理事件部分***********************************: M# Z8 l* K- u, l/ A0 m4 U

) _, m3 F1 V+ ^! |) m& A' dpublic:
* I7 G8 q: V7 y3 t! T, c////////////////////////////////////////////////////////////////////7 h$ N; M# I5 g7 N$ J, s0 P
//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。
" S1 V# T' V2 L2 h1 \7 A% Y2 h//参数: 无。# v# h" N/ l  g  b* G- R% B% w
//返回值: 无。# H$ T% q. A: d6 J# H4 M
////////////////////////////////////////////////////////////////////
/ j- `/ E+ i2 f8 l# ~# h8 C1 \( wvoid ProcessTTSEvent ();* Y. h2 N* w4 @& b
9 y, ^7 H( @. {% H& @+ y! z
+ t, _* u' e5 c# o/ d5 _. V0 V
////////////////////////////////////////////////////////////////////
9 _* Z! s( S, ~  o% w3 ]; E//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。2 b1 I2 B9 {7 W
//参数: 无。9 Q; V+ Q7 C1 w1 p3 Y7 k
//返回值: 无。) ^! e7 o7 y  j0 ^+ @  F5 _0 a
////////////////////////////////////////////////////////////////////% ]/ i+ g' B" Y& L! [! v8 ^
virtual void OnStreamStart ();
7 [( M; a) W4 t9 Q
3 Y) c& G/ Y( Q% E* f4 n/ ]8 ?( r) g. d////////////////////////////////////////////////////////////////////
; I& S; u$ ^* F) k3 {//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。, ^' H) ]* ~* I5 f5 h4 ^3 {
//参数: 无。
* U- k& q# p( H. j2 y; w//返回值: 无。/ [9 f4 K- h5 |3 ?
////////////////////////////////////////////////////////////////////
+ }  u2 X. Z$ }, [- Bvirtual void OnStreamEnd ();
% `9 C4 {. F' q};3 x. V) R5 t/ d' k3 B( I8 ]' S- C

1 N9 ^' Q, z' j) W( N! p. Q9 C& |# d  `" U% ?
///////////////////////////////////////////////////////////////////////
5 h( |# E; P. c% @///////////////////////////////////////////////////////////////////////
1 B2 K, h' w0 q( ^7 A//         CSR
& c' ^8 `1 A- l//
3 G9 R: C0 l# L4 t- m! P) H///////////////////////////////////////////////////////////////////////
' m0 x8 l! M  p2 O$ P///////////////////////////////////////////////////////////////////////: {( P+ e( i4 O
) _5 t. F# [. Y  Z8 |' E, g
class LANE_SPEECH_DLL   CSR5 _' t, N2 V1 t
{
* `% D3 M# c' K  L  s5 U: O6 [. o- l' E
protected:& Q5 Z3 P6 \, w0 T0 D0 z+ s
HWND m_hWnd;! O4 I! t3 [! k
# w4 [! n) b* V% X# f. E- G/ @* \
public:
: f+ {* [) B7 D9 ^; W3 |' oCComPtr<ISpRecognizer>   m_pSREngine; // 语音识别引擎(recognition)的接口。
4 ?  I* S9 N; ]3 B  m9 x, d" _CComPtr<ISpRecoContext>   m_pSRContext; // 识别引擎上下文(context)的接口。  |8 H$ q$ q% n4 @9 h  N& x
CComPtr<ISpRecoGrammar>   m_pSRGrammar; // 识别文法(grammar)的接口。# w6 j5 l9 I* v/ h3 I! u; ?
CComPtr<ISpStream>    m_pInputStream; // 流()的接口。
4 l- T1 u3 S( a7 h6 P0 l* Q) pCComPtr<ISpObjectToken>   m_pToken;   // 语音特征的(token)接口。
" w1 Y2 T# y; o7 U) j5 bCComPtr<ISpAudio>    m_pAudio;   // 音频(Audio)的接口。(用来保存原来默认的输入流)
2 p3 r+ ~, m7 o- e5 e9 _. jpublic:
- A# S- I$ x* S* Mstatic ULONGLONG    ullGrammerID; // Grammer的标识符, 64位无符号整型 每建立一个Grammar,加一。( {; b: w5 c3 h
. X0 r$ d# W) I; K0 z
7 _/ C5 M9 M& @8 d2 R% k# D
protected:
6 u5 z" B( m$ k6 g) ~//***************************辅助功能部分****************************************2 q8 x# X) S' |0 [

$ M. p% Z; k! \////////////////////////////////////////////////////////////////////
8 U& _* K+ `9 S8 O5 _//GrammarID加一,每个GrammerID必须不同。. x3 \  |! R' a& p' N  u! d$ {$ F1 s! E
////////////////////////////////////////////////////////////////////) S0 a# T% E* H; j) c
static void UpdateGrammerID ( );8 x2 P; o" d8 g  ^9 H' C" R

( {' \8 Q& B3 m, L/ h- y- K1 f/ I/ T, u; v) {$ k" x4 y" ?
public:+ k# \, v8 }, x  Z; [2 l4 Y6 L
////////////////////////////////////////////////////////////////////
4 `. |/ K  f) ]1 ~. Q: C//功能: 友员。TTS中的从SR引擎中建立voice对象。
, u3 A9 j- g- r- Z( _4 P7 D//参数: pSRContext:SR上下文对象的指针。% H+ x) J3 p* Y* f5 @  R4 S; C1 V
//返回值: HRESULT类型。
6 P1 S7 `  C6 o; b////////////////////////////////////////////////////////////////////
5 ?. b% o* \+ kfriend HRESULT CTTS::Create ( const CSR * pSR,
; b5 Z; @7 ^, s4 \" J* S/ ^          const DWORD dwLanguage );
, ^( R% m6 n7 E2 K* x/ U+ y% f0 U9 x) ^' i' z/ z9 W
& N% A9 i  {) y' O2 E  I
//****************************初始化部分*****************************************
, s4 j$ v  r' V, u; ^) ~0 p9 ]! L7 ?, K0 o
////////////////////////////////////////////////////////////////////9 [4 s% a0 R4 L+ }. \0 B
//功能: 保存与识别引擎关联的窗口句柄,更新GrammarID。8 X' E+ H* e. i# O5 H2 A$ o
//参数: hWnd:要关联的窗口句柄。7 P$ ~) }& _( I- r, Q8 n* W
//返回值: 无。
* z/ Z" K6 \4 l////////////////////////////////////////////////////////////////////
) p, ]0 M- x  O: P' X  DCSR ( HWND hWnd );
2 }8 H" E6 H% F
0 Y0 K7 J# K2 t  G5 o* G////////////////////////////////////////////////////////////////////
: p; o0 N) C7 g! a/ X( j//功能: 释放所有的对象。* Y& V. f% `0 p; b% P6 J
//参数: 无。
8 d4 _9 {9 ?" M//返回值: 无。
% H) a9 X; n( Y4 a+ M; V* E////////////////////////////////////////////////////////////////////
7 E& S3 Z& u  P" o$ w3 a~CSR ( );3 N# Q7 l) H8 G

+ C' p- N" I5 M0 i: D/ u% n9 D////////////////////////////////////////////////////////////////////$ ]- ]* J" A' k: t4 v, E+ I
//功能: 建立各个接口的对象。设置要是别的语言种类,消息,通知事件,' w; t) a9 P' H8 Q- H
//    加载文法文件。: R, o8 W5 T! M' c' C
//参数: SRType:识别引擎的类型,SR_INPROC为独享类型,SR_SHARE共享类型。
  J* o8 z0 X- k. z' R; {//    pwcGramFileName:文法文件的文件名,要用" L"" "转换为WCHAR型。2 @1 |2 J4 _! \& M- v; K
//    dwLanguage:要是别的语言种类,SP_CHINESE为中文,SP_ENGLISH为英文。0 O) h3 }; J4 G
//返回值: HRESULT类型。2 Y# j" u  Y" N+ S6 w$ H- R
////////////////////////////////////////////////////////////////////
# A4 Z% D/ D/ E6 [* a' \& cHRESULT Create (const DWORD   SRType,
8 j4 L  J% i, D4 s7 f6 D      const WCHAR   *pwcGramFileName = L"grammar.xml",
2 j  q9 H0 w7 \% r( t) r' l$ c# ?      const DWORD   dwLanguage = SP_CHINESE );
4 E1 ~6 \' m$ T, R& H. E
; N  F5 g5 g( ?: k! G" U
" ?* d$ E; e4 Y- q) H//**********************************设置部分*************************************
! L3 w. y2 D. R/ X9 p- {/ R5 k3 z; p4 x$ @5 T6 \- f
////////////////////////////////////////////////////////////////////
, ]- \! M; }7 K) @6 L9 W//功能: 设置要处理的上下文接受的事件。
+ v( S+ V& \. h& O, y+ V//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,
* t% B) }8 A# ?  d9 N) V//    设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事
' E9 E" o; D9 g2 X//    件都会收到通知。5 C) v/ A' X* n& r3 u( S) J: U, S
//返回值: HRESULT。0 O3 V& P4 l0 q' Q, o/ T
////////////////////////////////////////////////////////////////////$ ^; z% f0 x) O/ i4 [
HRESULT SetInterest ( const ULONGLONG   ullInterest );
( u$ L/ J( b: e7 G6 o* e: D7 H
: q- g7 S" e$ p# M////////////////////////////////////////////////////////////////////# r5 F& P* b' Q' S* `2 q' \4 h9 B7 v
//功能: 设置某个规则的状态(激活或者取消激活)。
' C: F! V# ~" q( d1 V, U//参数: pszName:规则名,要用" L"" "转换。bFlag:TRUE表示激活,8 V; E8 g' u: a' ]0 }+ A
//    FALSE表示取消激活。
3 [4 f8 j( _1 x+ h+ y//返回值: HRESULT。" W6 V( l. V  H5 L! q# \
////////////////////////////////////////////////////////////////////
) j9 s+ u! ?  i' @* GHRESULT SetRuleState ( const WCHAR   *pszName, const BOOL   bFlag );
6 Q" S4 P4 N6 ^  M
7 p2 F2 K$ E; g' t4 |' K4 h" f: Y2 {8 O: i8 \
////////////////////////////////////////////////////////////////////
& j: Q/ G1 M5 F9 U5 n//功能: 设置识别引擎从.wav文件识别语音,如果不调用此函数则默认从麦克
. z3 I' f. C' \" n//    风输入。
: s" a( |& ?6 D  y; M- N! S/ z//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。
5 D9 N- S+ R9 ]//返回值: HRESULT。
! s* F! d: k* e8 E* v( K////////////////////////////////////////////////////////////////////; Y. Y* n' n) l
HRESULT SetInputWithWav ( const WCHAR *pszFileName = L"sr.wav" );
0 T, c. m0 x( D/ b6 u2 o$ E7 c: k
" t. S" z" ?8 Z  \, y) p5 C/ g7 R////////////////////////////////////////////////////////////////////7 e0 d1 o$ T7 y
//功能: 取消从.wav文件识别。恢复从麦克风识别。
( C  r2 g  e7 {" p9 C3 k) T- g//参数: 无。
! `$ |) q8 I* i. g' T//返回值: HRESULT。
, m0 E7 b& R( N: B- P////////////////////////////////////////////////////////////////////
3 z5 S/ F: Z. i9 [5 bHRESULT UnSetInputWithWav ( );2 c6 \8 i. k# v7 o0 f% U3 k7 X# s( ?( l

' B, E+ g; O9 D: X//***********************识别开始,结束,识别结果的处理**************************
( X4 }# Z) ]- o* I! z. a, _7 N, T" Q5 f* ^$ @1 F
////////////////////////////////////////////////////////////////////
3 Y$ O' |! F+ W: \' S+ g# o3 R//功能: 识别开始(将所有规则激活)。; g' |+ n5 e5 V: \
//参数: 无
+ ]! [, b/ W" K5 }8 V; V//返回值: 无。
' d/ _0 F" Y, q: R& V4 E4 X////////////////////////////////////////////////////////////////////6 O8 U+ Z: i, n% A4 Y
void StartRecognize ( );
" y  C9 e" c4 s; }- @6 f. @' {# T. f; V% _- w5 N  K0 [. g
////////////////////////////////////////////////////////////////////
( g$ V9 `1 U/ b% t6 b- e3 f  f1 Y//功能: 识别结束(将所有规则取消激活)。
- {0 n, x, g3 O2 R//参数: 无。7 F9 o* k. q- ~2 }
//返回值: 无。
9 @8 r6 m. d' U) u- ]////////////////////////////////////////////////////////////////////
  S0 \: ~: K# pvoid EndRecognize ( );
# c' q7 @9 M" C( {
) Y. f+ T- Z1 k- c8 ^/ \( gpublic:- H. C5 G8 X0 q1 L( W2 V8 z
////////////////////////////////////////////////////////////////////
8 f: |5 ^( K. @5 k1 u//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。- B1 O% k9 I2 B% r6 q
//参数: 无。
3 s0 K! a9 f: W" c* N//返回值: 无。
/ a" q" S% Y1 i# O, M* t////////////////////////////////////////////////////////////////////+ J  x, k# j+ m, Z& ^% L; P
void ProcessRecoEvent ( );
& L. V3 |* Z1 H7 U
. ~! w* a1 h9 b5 Y1 F8 Y' Lprotected:7 H, E2 A4 j( p- L9 Y
////////////////////////////////////////////////////////////////////: _9 n3 @6 C% s7 k: Z+ G
//功能: 识别成功时要调用的函数。系统自动调用,不需要用户自己处理。) t6 }- a! o" `. n$ c. {9 z% I
//参数: pPhrase:ISpPhrase类型。
1 x, N# A$ L$ T//返回值: 无。
3 v3 y, X( C0 ?, L& g////////////////////////////////////////////////////////////////////9 t; K+ T  y7 [, j( N
void OnRecoSuccess ( ISpPhrase *pPhrase );1 |4 j  G9 U) j3 r. d

! x1 d; N0 _! [# ]/ _. {+ apublic:
7 Y* C; h& @7 ^; [3 i' }8 b: T9 [3 U////////////////////////////////////////////////////////////////////2 R1 @% T9 }) r
//功能: 识别成功后,根据规则的ID决定动作。系统自动调用。虚函数,
$ k) _( u) q* M7 ~# A//    需要在派生类重载。规则ID必须以常量形式预先定义。
: n$ n  S4 z7 ~& Q//参数: ulRuleID:顶级规则的ID。ulVal:子规则的ID。
, p4 C+ D- |8 A0 e//返回值: 无。
$ _6 }7 k; A' N6 C6 b+ y- O6 b3 h////////////////////////////////////////////////////////////////////0 v, u  r" y1 ?6 I, j. x+ h
virtual void ExecuteCommand ( const ULONG ulRuleID,4 ~  m$ l5 T2 R2 H
          const ULONG ulVal );
+ M8 A) @5 H% f: j9 |( a4 ]# u6 n
////////////////////////////////////////////////////////////////////2 K- ^; ^% L( A' X/ S& L0 M
//功能: 识别失败时的动作,系统自动调用。虚函数,需要在派生类重载。' V+ i9 g0 {# \  L. M7 T
//参数: 无。
- j- O0 f# {1 r//返回值: 无。, q  ?# z2 E) ^: w6 ]
////////////////////////////////////////////////////////////////////! u3 F4 k/ W2 n6 w& a( X
virtual void OnRecoFail ();
) a! }9 c! k) ~( M% ?
' z4 g. }+ Q1 m7 y////////////////////////////////////////////////////////////////////6 y: [5 X2 w' h* A1 Y
//功能: 为虚函数。当输入流开始时要触发的动作,需要在派生类重载。4 b$ \) N( x1 f8 Z3 E0 p/ v* j
//参数: 无。! U. \: S! t+ q% M5 ^
//返回值: 无。1 N: S* D2 ]( W' Z2 l
////////////////////////////////////////////////////////////////////
8 P5 a) h5 b: ?! U: P" Qvirtual void OnStreamStart ();: e% G6 l  [) s5 t  U, k3 U
& H  S2 L7 W9 S$ Q
////////////////////////////////////////////////////////////////////% O1 `+ l3 i2 I) d8 m3 @. L8 K  }
//功能: 为虚函数。当输入流结束时要触发的动作,需要在派生类重载。
& L) a+ F3 |* y9 Q//参数: 无。
4 F/ w& X0 T9 ]; z8 G7 O- I  l! V* ]: F. k6 I//返回值: 无。
- x* ?1 p# ]0 k* ~# W////////////////////////////////////////////////////////////////////
  T3 O% }' S, @9 K' k, B, o- Uvirtual void OnStreamEnd ();; e+ Z; ]; M) k! k

: o' O4 C3 ?: ?1 x! q! I6 |};. z3 S! G9 \& h8 q
) S3 t7 w! }+ }! R4 I

) W& H$ W) a+ W; ~- j
! ?! B# C7 `1 S#endif    //LANE_SPEECH_DLL_H
# L# i* L# e$ c0 k. V2 R
' P3 w0 X- T. f" p1 L///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6 Y" k* K& A) O8 R5 V5 q
" b0 D  P8 Z( O( ~7 {  U$ `  U
////////////////////////////////////////////////////////4 R7 J) K8 ^+ t/ B+ [
//
6 j; n$ ]+ T  ?' i3 u, S// 文件:LaneSpeech.cpp; G' c' A' K' ]
// 功能:封装的speech sdk5.1 的文本语音合成(TTS)和语音识别(SR)功能9 W7 ]2 Y, [, D, _' _1 q
//    语音识别只支持命令模式,不支持连续模式7 d. o4 b& @6 t" C" }" F# s* b, W
// 作者:吕宝虹(Lane), msn: lkjx82@msn.com, qq: 3619908" h, j# Q& _  Q4 R0 s0 {
// 日期: 2004.103 \/ |  k6 C/ |* e& G
// 版本:1.20 C2 }# F; ^7 \6 G3 J3 m
// . e; u0 u1 l7 f9 ?. x
//
+ J6 m8 W6 G; c! W4 C) T- I////////////////////////////////////////////////////////( |6 U. |( V( t" L7 h; v

( ?  j; }; a1 ]6 f$ w( D3 Y9 _
! q, D5 h! R) X) Q; ]/ |8 r+ k2 D: ^: A
#include "LaneSpeech.h"
0 R: P  `3 S. Z! w7 g/ y# v3 J7 v  S/ \+ J3 `- J7 B
//-----生成动态连接库和静态库的处理----------------& S0 K1 `# U) p
#ifdef USE_SPEECH_DLL //定义了USE_SPEECH_DLL,就按生成DLL,声明导出导入类
8 d* x& t+ c+ R' ?1 W& k  G4 L& }( N
BOOL APIENTRY DllMain( HANDLE hModule,
" L0 d  B5 ~. f. V$ r2 H7 x                       DWORD ul_reason_for_call,
, F, a  O  {8 p) f, j1 L2 Y2 ?3 c. }0 T                       LPVOID lpReserved3 V5 V& }+ E. L
      )+ P( p$ w3 @! T7 ?# q
{
9 I1 `1 U+ y  \! |' w    switch (ul_reason_for_call)
' x2 ]7 D5 J" m8 H+ j. ?+ k{
; T* d& |8 o# P' Y9 F% X/ I   case DLL_PROCESS_ATTACH:8 B6 X; c9 V0 {  c/ P
    CoInitialize(NULL);6 _+ q$ j: |( K
    break;
, \% w' ^# l: x4 `7 ^% f* }1 {( S  
" E7 p, h8 F. B- t7 N2 _   case DLL_THREAD_ATTACH:
/ I/ P/ K) ^( b& \. L7 C    break;7 x" f- g- c2 c' S1 M7 `
  6 j% d- {  x. g, s0 I; \
   case DLL_THREAD_DETACH:
2 _: g1 c( I* y0 \    break;
3 k+ f; [( a( @: U  K  9 j0 v  Y; u$ z5 s0 K3 O
   case DLL_PROCESS_DETACH:2 D" j/ k5 [7 r* b* e
    CoUninitialize();
# Q) P" v$ i/ @+ j    break;
1 T9 @3 R9 I% |) r9 L# V5 S    }# o- K+ l- R7 v# Q' h
    return TRUE;  j! J3 g6 [2 S" T/ q. l, r7 T
}
/ M" ^- |, h3 \$ S1 [# I8 Y' }- ]# N, j7 C8 E
#endif //USE_SPEECH_DLL
+ Z& ]& M+ ^9 ^0 }7 T+ j; C# z' B' `5 g3 U
. M5 V! n6 l  s* |2 }
3 s3 M5 Q. w8 X5 v7 V
///////////////////////////////////////////////////////////////
0 n9 @/ T. \' s! t; w% D% D3 S; j1 f% r
////////////////////////////////////////////////////////////////////
+ f9 H! ^: r% ^: X//功能: 弹出一个信息框。
/ T5 f3 P5 V; `: p, u//参数: lpText:是对话框信息。lpCaption:对话框标题。
* m  v5 g1 ^$ \7 ~4 v//返回值: 无。
7 b! n  X- _% n% D6 Q; I0 F////////////////////////////////////////////////////////////////////
2 O4 ^% C# ]+ }: ]' Kinline void ShowError ( const LPCTSTR lpText = "ERROR",* Y" Q7 o' {% |
        const LPCTSTR lpCaption = "ERROR" )4 [  P; n, z. C: E+ G5 I; z
{
- }) G9 Y4 e% n0 }4 k5 Q. C- i   ::MessageBox( NULL, lpText, lpCaption, MB_OK | MB_ICONERROR );
: `8 ?% C! G- U0 P, K! _}5 O7 |! k! v5 m# Y! e! s" f+ T6 z

7 U, e: Z* w' t) a- g////////////////////////////////////////////////////////////////////6 c- Q3 o# i* d) u, v& K
//功能: 检查一个HRESULT类型的值,如果是错误的值则,弹出信息框提示错误。9 n+ c5 D2 R2 w
//参数: hr:要检查的HRESULT的引用。 lpText:是对话框信息。, D% J& [4 p/ g8 ^
//    lpCaption:对话框标题。9 B8 g- @+ Z8 R3 L* a: g/ x' A* V
//返回值: 有错则为FALSE,没错则返回TRUE。" C  {& ]3 |" K, U% A% x+ c) ?' I
////////////////////////////////////////////////////////////////////
1 A$ }5 G, a# M7 Tinline BOOL CheckHr ( const HRESULT &hr,: h& ?6 T7 f& f" K
        const LPCTSTR lpText = "ERROR",
- j8 S; F/ w/ r& l- Q. ]; N9 {4 D( Z        const LPCTSTR   lpCaption = "ERROR" ), G: B/ H. R/ v$ D$ x; L' k
{  O- K) p7 {" k$ ^
   if ( FAILED( hr ) ) {
; H. Q" ]2 e& C. y) d2 R( _    ShowError ( lpText, lpCaption );# y8 I/ h6 q' U: U8 _
    return FALSE;  M% t1 j$ ]: u6 l& W
   }; B1 i0 F' \6 m& L+ j3 J4 v; E6 C
   return TRUE;8 j) v# @4 A# i  k0 Z3 r
}0 v2 v9 J5 ]0 C6 F& I

# h; A3 J, k& U9 K( p- X( R2 V; p
///////////////////////////////////////////////////////////////////////
0 D% u( }7 ^' T& Y///////////////////////////////////////////////////////////////////////
. W2 ~9 C9 u. l/ t- k* a3 R//
$ Q' }+ r0 b) \0 n% ?( B& f' R! E//         CTTS- K( S! [/ R5 K+ [# @: @
//& N7 }6 D# a; P  z
///////////////////////////////////////////////////////////////////////
! l/ d0 V0 _0 P/ C& [///////////////////////////////////////////////////////////////////////9 H9 j5 Z5 D7 s& [! S8 C1 R9 C
0 J7 K: f3 [$ i
////////////////////////////////////////////////////////////////////
  s6 j  m" G. `7 M//保存关联窗口句柄。初始化COM。, Y/ \. m% D5 u  [, A) R8 |, P' R
////////////////////////////////////////////////////////////////////
* L) C6 N2 Q* _CTTS::CTTS ( const HWND hWnd )4 A. V+ _- T0 k
{' F& t( k- _9 M, e5 R: K. d' M
m_hWnd    = hWnd;
8 z7 G& i2 H* wm_pVoice   = NULL;6 V* P* K$ u/ c4 z/ M& t
m_pToken   = NULL;2 B  y8 ~3 x  V. ?  |' @
m_pOutputStream = NULL;
! p8 A9 H, h+ K  Z9 I2 Nm_pAudio   = NULL;$ j' n4 J0 m* P  P6 }7 Y, S
}6 a. {8 w. L3 N3 a8 W; x! P
1 A, z& _, m' M4 d: ~, O
////////////////////////////////////////////////////////////////////
! u" M! n  l/ G- F1 ?7 X8 v2 V//释放所有对象。/ p5 {. q. D: B8 u
////////////////////////////////////////////////////////////////////& ?9 x9 Q! Q4 i# B, h7 ^: C
CTTS::~CTTS ()5 P- }3 H+ E' C/ ~% O# @
{" N2 T$ }# o( C( e1 B
if( m_pToken) {+ l8 y8 I2 |: [3 ]4 R; D
   m_pToken.Release();
( T: A' i& K7 ?, O' ^   m_pToken = NULL;
- v; z% d' z9 w& J3 a& ^- x& K3 J}
6 w7 Q$ ?% d4 q  b  e" Sif( m_pAudio ) {
' b" p2 |1 g2 S, G6 J# |% |* _: a& j   m_pAudio.Release();
  z1 j, c' X4 {3 E: i   m_pAudio = NULL;0 Z' U5 k! G+ r8 i0 Z! F
}( A8 ^: E  h: o* F" s" k" d5 P4 @% C
if ( m_pOutputStream ) {' i8 s% |6 ?$ t. e# t3 \4 n, w
   m_pOutputStream.Release();$ [/ P1 t9 z5 R8 ~% s+ o1 k+ `
   m_pOutputStream = NULL;
0 Q; V- I6 U. p, I/ W}2 h3 L, I" V# I5 W$ p, b/ ]+ e
if( m_pVoice ) {2 q) ]" g4 f2 R1 b
   m_pVoice.Release();; q/ I4 Z- w! F5 o) m( ], p0 |, \) r
   m_pVoice = NULL;
0 {3 W/ Z3 R, z/ `7 b& M}4 _) ]6 n+ ^8 v6 C6 j" K3 l
}
/ N2 ?, w( ]. W" t7 u, U( T/ ~7 y' y5 [; A% j
////////////////////////////////////////////////////////////////////
* `# K4 t) E6 ~/ W- N, \//从SR的上下文中得到voice对象。此函数在CSR中被声明一个友员。
! L  O; J$ v' N4 V) K6 q5 f6 ]////////////////////////////////////////////////////////////////////
- J* O& V3 F- m& ]HRESULT CTTS::Create( const CSR * pSR,3 U  Y. H+ g" O
       const DWORD dwLanguage ): \" Q: T" D  f" E; u
{
# g# I# K* g: Z5 hHRESULT hr;, e4 y2 s; R! d' G8 y+ i0 K
hr = pSR->m_pSRContext->GetVoice ( &m_pVoice );& T$ A: H. Y: v( t5 Z% o
if ( !::CheckHr ( hr, "pSRContext->GetVoice()" ) ) {9 o* s; Y2 Z+ k7 |5 ?/ Y
   return hr;- f) l- w/ d7 W) N8 g0 w
}: W4 o2 c; {& i- v- z- o

' Y" A. |  J( i2 V- R. F( cSetLanguage ( dwLanguage );
* X& z+ S1 x. Q5 j0 @/ r% {
& a0 Z  j: E! @' N2 V7 ehr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );//建立一个默认音频流
! b$ E; o+ ~! @+ i9 I1 vif ( !::CheckHr ( hr, "CreateDefaultObjectFodd()" ) ) {; R9 C& j$ F( ]6 p0 ]+ v8 R/ K
    return hr;4 _) p' j8 m$ j" i% M$ @+ B% G
}6 k- s5 S# @5 d6 g  k# U3 u

* {$ S8 Q, f: D. q, r2 }3 x: S//SPEI_START_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM
% G" l: U+ v8 l//SPEI_END_INPUT_STREAM 表示完成流输出。
$ N" y: C% _; ihr = m_pVoice->SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) |1 J' `  ]- {& {* O- k/ E
         SPFEI( SPEI_END_INPUT_STREAM ),
2 E9 F/ ?2 Z1 W% Q6 |7 ~# g            SPFEI( SPEI_START_INPUT_STREAM ) |
1 y0 M  z. L% n+ s            SPFEI( SPEI_END_INPUT_STREAM ) );  W) }3 m! V2 p" J0 c+ p$ }8 w! m
if ( !::CheckHr ( hr, "m_pVoice->SetInterest()" ) ) {
& f. M+ E. Y4 d- b1 `    return hr;
! B& @( l9 Z9 w1 Y* t; S# p}
  C9 J  j+ j2 L" l  P- c6 Z+ i4 ^) a5 ]6 t
//设置通知消息
  e/ d4 ~! U7 ehr = m_pVoice->SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 );/ d' g- F0 B/ i* d" B- w
if ( !::CheckHr ( hr, "m_pVoice->SetNotifyWindowMessage()" ) ) {& m( z: e. A# _8 [# N" k
    return hr;
  t$ {7 ]* d7 v}
) D0 S0 ]4 e/ b6 b2 B" q; ^9 k" e' ]$ m( i! Q: P, d+ ^
return hr;8 i4 D% b$ h" D, r" m) Q1 q& @
}
9 l6 `2 B7 }5 |; y' B* c2 j% M$ _: x( Q) g
////////////////////////////////////////////////////////////////////  W# |! X* @% p. {2 `0 c4 G3 a5 N
//单独(相对于从SR的上下文中得到voice对象)建立一个voice对象。1 X* h0 v2 H4 N' I( n
//并设置兴趣,设置通知事件。% w4 e" v& W" z" {' [  z
////////////////////////////////////////////////////////////////////
/ ]1 W; k0 K+ R7 D7 O/ p& o' N7 @: m: EHRESULT CTTS::Create( const DWORD dwLanguage )
  P) I9 }* e+ K6 t1 p. {1 O2 i( `0 R{
& R5 X1 [- @8 [, c  _  ]HRESULT hr;
7 ~/ V3 S1 l; C! F4 v! `hr = m_pVoice.CoCreateInstance ( CLSID_SpVoice );' ?& x; ]0 m' P0 ?! t
if ( !::CheckHr ( hr, "m_pVoice.CoCreateInstance()" ) ) {1 I& r- s% J; @. A! B9 A4 T
   return hr;8 O( i0 l8 M- J3 v8 R: k7 E% W( W
}7 i* r, T  R& m9 {( j% s

: o) s/ ~, I0 b; L$ t4 E1 V$ gSetLanguage ( dwLanguage );
' G2 `) P* z# Z- W: G' d1 O
4 A/ y( ~  c; M4 chr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );//建立一个默认音频流. Q* }' z' A8 w8 c
if ( !::CheckHr ( hr, "CreateDefaultObjectFodd()" ) ) {
; i  E' G! V2 V7 S% @6 x    return hr;1 i, F/ K+ `4 P6 K. q# O
}- s  U# g" t1 l- K2 T
% z, s' n3 f2 N. s) J& R) p
//SPEI_START_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM
! j3 O8 O% i( y& i4 _- ~9 E. K# R//SPEI_END_INPUT_STREAM 表示完成流输出。% x0 k" y8 d/ i( z5 u, V
hr = m_pVoice->SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) |
7 t, m3 ^. D0 a9 Q8 r, C         SPFEI( SPEI_END_INPUT_STREAM ),
2 A) [1 Q- `4 j- ]            SPFEI( SPEI_START_INPUT_STREAM ) |
5 ]7 Q9 x7 [1 O" R/ S            SPFEI( SPEI_END_INPUT_STREAM ) );. Y$ N. T$ T3 a4 P0 s) c1 c7 W
if ( !::CheckHr ( hr, "m_pVoice->SetInterest()" ) ) {
9 D# P! k, j1 \; B1 G    return hr;
+ D" {! ^/ t% @0 [* D% X}1 m- F/ v; G4 w5 [, d: v6 m2 ^4 L

4 b1 |# L6 P8 k//设置通知消息/ _' P9 y3 Q9 U- x7 `
hr = m_pVoice->SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 );6 A0 f  N! Z/ b* ]- T5 m/ \; m
if ( !::CheckHr ( hr, "m_pVoice->SetNotifyWindowMessage()" ) ) {) C; G. |" v, P+ |, ?- l; E
    return hr;
4 F& J4 B+ I/ ^. [4 H" h  z}
! f, r5 `$ h! p, c. a8 X9 ?/ p) X# G' O/ d3 w
return hr;( x* r) X/ c7 r" y, l( B
}- O4 f9 V' }& S; A- O
 楼主| 发表于 2011-5-23 17:06:27 | 显示全部楼层

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

第一个小程序
装好SDK后,我们当然要运用了,要不然我们装它干什么呢。我觉得写程序的乐趣就在于自己写出了一个能运行的程序,那种成功的感觉很好。好了废话不多说了,接下去就来写第一个能运行的程序吧。
1、新建一个Win32 Console Application空工程,在工程里面新建一个C++ Source File。
2、首先当然是包含头文件
#include <sphelper.h>//语音头文件
3 y* L$ W9 S) J#include <iostream.h>//C++头文件,用来提示错误信息
3、然后是主函数
int main()
! V3 I8 S8 [- G6 M! i" _{
% d1 p7 k; M4 z& n  `& s    ::CoInitialize(NULL);//初始化语音环境" P5 x+ ]( u. R
    ISpVoice * pSpVoice = NULL;//初始化语音变量. s" ?" B- ~3 }
    if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL,CLSCTX_INPROC_SERVER, IID_ISpVoice, (void **)&pSpVoice)))  
    //给语音变量创建环境,相当于创建语音变量,FAILED是个宏定义,就是来判断CoCreateInstance这个函数又没有成功创建语音变量,下面是不成功的提示信息。
    { % Y- K6 l& v  I5 R1 R* ~
        cout << "Failed to create instance of ISpVoice!" << endl; - R6 {( ]3 b, G
        return -1; 7 K0 A  `& h6 {% L3 s
    }

$ l6 M8 ~7 I: J& t. u2 x# K/ ?    pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);//执行语音变量的Speek函数,这个函数用来读文字。
    pSpVoice->Release(); //释放语音变量* }  V* E# X" n0 g) K
    ::CoUninitialize();//释放语音环境

3 F+ J: K. h9 x) X    return 0;- w, W3 y# ]4 J* ~2 e: E% U
}
4、第一个程序就这样写完了,运行读出了Hello World,是不是觉得很神奇呢,呵呵~~~~~
回复

使用道具 举报

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

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

VC6.0下开发Speech SDK5.1程序
$ u5 O/ m5 O0 z
1 v3 g8 C& i& D& z8 O$ l5 u; s3 D1.首先开发得需要Microsoft Speech SDK的支持,以下是下载地
% Y, @$ W6 g4 d; \# j
' l6 }3 J$ ]7 q, S1 fhttp://download.microsoft.com/do ... -US/speechsdk51.exe   - x2 f+ Z! z% ?+ q0 a6 A1 S+ p/ H
Speech SDK 5.1安装包 (68   MB)     
1 }2 u4 t' i- S- T& h: zhttp://download.microsoft.com/do ... chsdk51LangPack.exe      
' @4 D0 ~, }- I中文和日文语言包(上面的安装包只支持英文,如果要你的程序支持中文则下载此包)(81.5   MB)  0 V0 f1 E/ x8 k6 _4 o& _

, w. ]" t3 |+ [2.下载后,执行安装
$ z+ W9 H* B8 B2 [" w' D" L  k8 f
4 n9 e5 d  e  K$ ]' Y9 b下载完毕后首先运行SpeechSDK51.exe,它其实是个压缩包,不是可执行文件,解压时选择解压到的路径,然后,运行解压出来的可执行文件,默认安装路径为C:\Program Files\Microsoft Speech SDK 5.1。运行那个中文语言补丁包SpeechSDK51LangPack.exe,和上面的一样过程,这也是个自解压文件,不过这个第二步不需要选择安装路径,运行一下就行。6 b% Z0 d, z' D/ r
4 x3 \0 j6 h9 f7 Y/ C& l
3.VC的环境配置
) Y- e- l! D  D5 T  p0 w$ H7 v( H1 C; i+ S5 u# i
在应用SDK的开发前当然得需要对工程环境进行配置,我用的是VC6.0(其他情况类似),配置的过程如下:
4 N, U) c! V: h
) S& T5 Y) i0 f* e工具->选项->项目->VC++目录,在"显示以下内容的目录"下拉框中选择"包含目录"项,添加一项C:\Program   Files\Microsoft   Speech   SDK   5.1\Include到目录中去。再选择"库文件"项,添加一项C:\Program   Files\Microsoft   Speech   SDK   5.1\Lib\i386到目录中去.
, \) w# q  z% ?3 A" f. ^" x- Z( B# r( e" [9 U
好到这里为止Speech SDK5.1的配置算是完成了,接下去就可以写程序了。呵呵~~~~~~~
9 m6 f/ w5 {* c3 `
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 07:33 , Processed in 0.016288 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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