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

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

[复制链接]
发表于 2011-5-23 17:04:22 | 显示全部楼层 |阅读模式
////////////////////////////////////////////////////////" l+ g5 x5 @0 ]/ h+ w0 F7 z
//1,生成动态连接库时,要#define USE_SPEECH_DLL,. w* c- F. {- f' l; H
//      并且#define LANE_SPEECH_EXPORTS2 b5 s/ g% e: L
//2,使用动态连接库时,要#define USE_SPEECH_DLL
  F3 Z9 K* k% J! O# W//3,声称和使用静态连接库时,什么都不需要
: ^* O9 }: N  O0 e//4,另外主程序中静态连接库要调用的方式里要调用CoInitialize( NULL )和CoUninitialize(),
/ a1 z! k/ u& P9 o( N6 S& W//      动态连接库就不用调用了。
+ [" ?- ~% i- u////////////////////////////////////////////////////////. e& S( l9 |( p& n: A# s9 e& X1 v
#ifndef LANE_SPEECH_H
' |( V* X0 X8 \; O6 g6 R) r#define LANE_SPEECH_H
, b% t  @. z' f* z: j) j/ n( x4 j  L' @2 _
#include <windows.h>
9 [5 O9 H* x% V3 R; a2 r#define _ATL_APARTMENT_THREADED1 P: e4 ^$ {1 [, b2 O- F+ {8 _
#include <atlbase.h>
0 R: B  Q! `) O: eextern 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# M' s0 p9 k# b! x8 v% c. g
#include <atlcom.h>
1 v6 ~- W" e0 O#include <sphelper.h>   //sapi需要的头文件0 K4 g; k, u" T/ F& W

* t! J1 I- z7 L) g! {9 \//-----生成动态连接库和静态库的处理----------------1 A8 g9 l4 m' {
#ifdef USE_SPEECH_DLL //定义了USE_SPEECH_DLL,就按生成DLL,声明导出导入类9 L# q4 f. S7 c# z5 G& o

& @( i; A& g1 ]1 d#ifdef LANE_SPEECH_EXPORTS! S, u' ~* E" h" c
   #define LANE_SPEECH_DLL __declspec(dllexport)( i. D  w! I9 n
#else# G4 D; ]0 y0 ?1 z8 X6 N$ p
   #define LANE_SPEECH_DLL __declspec(dllimport)
# j; Q% o1 O$ p#endif
( I0 U5 R, M$ f- A9 Y: W: d. K* I8 x5 z, a& q" A
//这个警告我现在还没闹清楚是怎么回事了,估计是DLL和com或atl有关  h) F8 N/ b/ u4 n7 _/ b
//暂时只能屏蔽掉它,在静态库里就不会出现这个警告。
, I# h1 |$ ?6 c* i1 [! u" r#pragma warning( disable : 4251 ); O, X0 w* I1 d3 M+ s( A
" q$ Z: |2 [0 ?7 f% K
#else     //没定义USE_SPEECH_DLL,则不声明导出或导入类(LANE_SPEECH_DLL就为空)' x' J0 Y0 x& P% P8 B; S
#define LANE_SPEECH_DLL2 W; B0 G* |6 ^2 O  l( V
8 b. ~: Z$ @, x) z4 h) J" I
#endif //USE_SPEECH_DLL
  o; M& x3 y- _% ?2 G
8 I8 W) d" C  s' ^! T# W) e  F" u# c: F  V* M" C  u* Y- k
//***************************常量***********************
. @3 T* t6 }- ~/ a" J: _, T* R9 i1 `5 `
/////////公共常量-----------------
. s& e1 M4 }0 t, K9 p9 sconst DWORD   SP_CHINESE = 0x0000; //简体中文.
7 r9 Q' c* O) @$ V- y. l: pconst DWORD   SP_ENGLISH = 0x0001; //英语.
5 R, N. h' @  b& |
# I. j9 E1 t+ r/////////CTTS常量-----------------
3 y4 c6 ]. i0 c9 Z% ~& I' Qconst UINT   WM_SPEAK = WM_USER + 4444; //触发事件产生的消息。
5 W. B6 u; y/ ?) C( O0 K; T: {' G9 n/ ~2 A  G8 l+ D8 C: j' \
/////////SR常量-------------------
* V2 ]$ Z0 }8 ^: y2 i) ]const UINT   WM_RECOEVENT = WM_USER + 3333; //触发事件产生的消息。
' ?/ l3 D2 l) Wconst DWORD   SR_INPROC = 0x0000; //独享类型的SR.
0 y. A( u- @5 _( W' I, [& N/ jconst DWORD   SR_SHARE = 0x0001; //共享类型的SR.: M$ z: Q( e% D9 \5 \- x

( r2 d! I: U/ l2 \6 X//以下常量仅作例子用。- J+ i" H! g( A7 B
#define VID_TopLevelRule 9000   //顶级规则ID
& R* S  |1 n9 s% k: @5 l#define VID_SubLevelRule1 9001   //子规则ID% \, k9 e( }3 v
#define VID_SubLevelRule2 9002   //子规则ID. B: E/ J3 u0 v" Q! o+ v/ x
#define VID_SubLevelRule3 9003   //子规则ID- f# Z: z9 y+ q5 z  Z  {

5 F8 Y- y7 X: H9 |  q  {
# \: _( Q4 k/ g& f, }) R3 H//*************************类声明************************- K7 m. V- _* o, N# {6 J

8 Z2 s2 R  B& {
8 q" i$ m+ M) |class CSR;# b. k! ^$ O" M; ?2 T
///////////////////////////////////////////////////////////////////////4 N7 T, m0 O0 X, T$ I7 J& r
///////////////////////////////////////////////////////////////////////- D" k. _. Z+ R2 M
//8 d" ?; E. @+ Q4 J  S& S
//         CTTS! D5 V- f1 o5 A, f7 x
//9 B# u* K0 P: r- a+ U. J
///////////////////////////////////////////////////////////////////////, v0 ~: ]9 Z  x3 E' d$ n9 {
///////////////////////////////////////////////////////////////////////3 T0 O: b$ h8 B1 ^6 i1 j
; d" A0 G3 @/ v: M7 c) f0 [% s
class LANE_SPEECH_DLL   CTTS8 |1 b7 E6 j2 n$ M1 v. ]- R
{
. I+ p- `- H/ h; ?/ [protected:
6 k! p7 ~4 @- }! WHWND       m_hWnd;     // 关联的窗口句柄。
- ~- Q$ K2 I' ^8 i4 n: E
$ l. L: n& B  l9 {9 q. P  x: P% uCComPtr<ISpVoice>    m_pVoice;    // 声音对象的指针。6 q) J- A$ t5 d2 x0 D
CComPtr<ISpObjectToken>   m_pToken;    // token对象的指针。7 w5 o9 U5 z0 O' `( Z# o& n
CComPtr<ISpAudio>    m_pAudio;    // 音频对象的指针。(用来保存原来默认的输入流)% A5 M7 h$ P: d( I3 P4 J% @
CComPtr<ISpStream>    m_pOutputStream; // 输出到文件的流对象。  x1 I8 Y2 Q0 O* T( A3 l% W
# s% Z5 F, `$ d+ }* A
public:/ V5 M$ k; T* V$ e$ N
//********************************初始化部分********************
7 ^+ q0 c. c: u( B! q  m* f
. ?. Y/ x  T" n& `; o& J////////////////////////////////////////////////////////////////////; I1 i2 B* q; E/ e
//功能: 保存与识别引擎关联的窗口句柄。
% a  a3 c9 L$ u) L/ J% p6 ?//参数: hWnd:要关联的窗口句柄。/ x) |3 L# }& l7 l
//返回值: 无。
, p) g9 [( f+ ~5 e0 Y, }////////////////////////////////////////////////////////////////////
& M, |  R! Z8 F6 A' W5 \: iCTTS ( const HWND hWnd );  N: l$ j; P  y- G
! F& z. j# J! x0 j5 }
////////////////////////////////////////////////////////////////////! r$ D; w( a2 E- t/ F: s
//功能: 释放所有的对象。
+ {) B4 P. W2 Q4 i7 {0 g) J9 x//参数: 无。
- a: y+ e8 E' u: e6 b* {8 x//返回值: 无。
+ r# r' a: k- p$ L* c1 u  p////////////////////////////////////////////////////////////////////0 O2 L7 c" B2 k" _1 D
~CTTS ();
) G: k- J0 X! s2 K- {! C5 N. l
1 b! e$ x& {8 _3 I- `% M////////////////////////////////////////////////////////////////////
) ?9 b6 O( L8 [) r/ [4 T( r//功能: 建立一个voice对象。设置要是别的语言种类,消息,通知事件。/ n. V$ i% v  n7 |: n
//参数: dwLanguage:要朗读的语言种类,SP_CHINESE为中文,
8 y# v' D4 s2 f( t  u//    SP_ENGLISH为英文。' `9 P2 p# ^5 k( @. Y
//返回值: HRESULT类型。
' \5 k; O9 _, t; [////////////////////////////////////////////////////////////////////" f3 X1 t5 E! ]2 N
HRESULT Create( const DWORD dwLanguage = SP_CHINESE );% O5 i" H3 m) R7 }0 K

- g9 y: e  d5 @5 e5 }////////////////////////////////////////////////////////////////////
' t% x! o- ^$ g$ e' b//功能: 从一个SR引擎建立一个voice对象。设置要是别的语言种类,消息,6 @6 I& o" F4 {  q% F; L" E
//    通知事件。# I8 [9 N. N6 ]: l# k
//参数: pSRContext:SR引擎的指针。dwLanguage:要朗读的语言种类,) L# ~5 I; u) b! j' K& n
//    SP_CHINESE为中文,SP_ENGLISH为英文。- O7 ^& i7 ?+ ~/ ^- ^1 B% L4 l
//返回值: HRESULT类型。+ _8 R5 R" Z) l2 A2 I
////////////////////////////////////////////////////////////////////6 e9 k2 u. [- U
HRESULT Create ( const CSR * pSR,
0 V) }: M3 T4 C. D) Q5 U( E3 U  a* t8 I       const DWORD dwLanguage = SP_CHINESE );9 G) x/ @7 q/ x# t7 A
0 z4 V9 T6 G$ `2 w8 `4 z& C1 C" k

( h: J6 U( o; C//********************************设置部分***************************************
: F9 H# J) J, _. o# [7 \+ G3 ^3 Y+ E; h, H1 u+ u5 `: f1 g
////////////////////////////////////////////////////////////////////# Y. Z( e5 W2 e6 u' }
//功能: 设置朗读声音的语言种类。
% K, k. N# |/ j0 J$ I6 J//参数: dwLanguage:语言种类。SP_CHINESE为中文,SP_ENGLISH为英文。) d. P* I/ \6 ?; l  I8 g4 Q
//返回值: HRESULT类型。* L5 M0 D& K3 p+ Z
////////////////////////////////////////////////////////////////////
. T9 Y" ?# {7 E" o0 V  t# }5 QHRESULT SetLanguage ( const DWORD dwLanguage );
2 I) K" ^& T* h* l
6 T8 h% \0 `6 c# }5 L4 u8 ]///////////////////////////////////////////////////////////////////// x/ I9 n) `! u" U% ]/ ~
//功能: 设置要处理的的事件。3 C/ l6 w: I# B& R! m/ v) p% \
//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,
) S; D; O/ T2 C( G9 v- B: T//    设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事$ d+ }& K6 P- T1 w; D2 X' E% A7 [8 ^
//    件都会收到通知。
/ E( b: x/ H" V5 n//返回值: HRESULT。
$ j8 G, u6 Z% n/ r' f1 a////////////////////////////////////////////////////////////////////0 E0 q7 _% h8 Z' S
HRESULT SetInterest ( const ULONGLONG   ullInterest );8 }4 ?$ I* K  ]* s9 f5 ?
4 _) k  _/ G; i0 V& _, S/ Y9 t
////////////////////////////////////////////////////////////////////+ g  ?) Y; E6 A$ D
//功能: 设置朗读声音的音量。
+ r! P4 A$ J. Q8 y//参数: usVolume:音量数值应该从0到100
4 t8 @1 g6 i* @8 X. o4 U7 Z! T//返回值: 无。. U; e9 I# b  i( J1 l; o, |
////////////////////////////////////////////////////////////////////
! Q' W5 ^: |! h* v# h. \% svoid SetVolume ( USHORT usVolume );
- V$ s; ^( k' u4 ?, d- s
$ ~5 d# G* Q% ]0 D* w////////////////////////////////////////////////////////////////////
- o  c+ I) ^8 q, L//功能: 得到朗读声音的音量。
# O  E0 W2 ~+ z1 t$ [, M//参数: 无。, K/ w6 M9 b4 }1 E
//返回值: 音量数值,应该从0到100。
8 ?8 q4 V5 _, j1 N$ E, E. q////////////////////////////////////////////////////////////////////
! O7 C, \" ~7 [& C, F6 RUSHORT GetVolume ( );
. m0 S! j9 g. h
& u: P: K. z" c7 r' }; K- {: x////////////////////////////////////////////////////////////////////& l/ k5 O' W, k" i
//功能: 设置朗读声音的音速。) x% b/ B9 M" n$ z4 b
//参数: RateAdjust:音速,参数范围从-10到10。
8 d/ [% ?4 _1 L2 ?( f5 }//返回值: 无。, ~" I! r" W- D5 W" L% C
////////////////////////////////////////////////////////////////////: K7 L$ R6 X# P2 g2 T' Z
void SetRate ( LONG RateAdjust );
( k! ^7 n( C3 H
. I2 h  m+ x. j2 T6 d////////////////////////////////////////////////////////////////////
" `9 ^, k( ^9 N8 j+ w//功能: 得到朗读声音的音速。
2 _! z$ u7 T5 k8 y8 w0 ~//参数: 无。3 Y, h; x" q3 T& k( a
//返回值: 音速,参数范围从-10到10。' A2 k' T1 M( z& d% G& P
////////////////////////////////////////////////////////////////////# G7 T7 ^$ e8 k* T
LONG GetRate ( );
5 _6 n' `8 w4 O, R8 J2 X* T" F$ q6 l' c7 L( B
////////////////////////////////////////////////////////////////////; h5 l" K+ I( G3 G' G* g" j8 \  S
//功能: 设置朗读的声音流到.wav文件,如果不调用此函数则默认从音箱输出。# {# P; }5 k0 K: D; W% ?' p9 H0 M
//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。5 g( {. V! F) d( z4 X) J2 |& Y/ ]
//返回值: HRESULT。
, C+ Y# M5 z4 a( M; u5 G////////////////////////////////////////////////////////////////////
5 H+ X" P" N% }2 _' T* sHRESULT SetOutputWithWav ( const WCHAR *pszFileName = L"TtsOut.wav");
, ?' e5 V/ U& e: _. H# ~6 q9 p
$ J( q( u; f' w3 j! e  n////////////////////////////////////////////////////////////////////
7 F8 I+ p: ~  y$ S3 }6 F//功能: 设置朗读的声音从音箱输出。
! d( {3 I2 s+ V: w6 [//参数: 无。" `3 ?) q# k0 Q) B! q1 _2 @; J% t* o5 A
//返回值: HRESULT。
! ~2 h3 E: ~8 x1 P2 p' R////////////////////////////////////////////////////////////////////. d' y( _) R. y* }9 j8 D
HRESULT UnSetOutputWithWav ();
+ ~$ D5 f% A* r
- p8 ]1 q) M' J5 w3 O. Z: D" y7 K
//**********************播放语音,文本到语音转换部分*****************************+ w% a: ], ~6 K, J# _

8 u; H( `1 b8 H$ A! C( M' ]////////////////////////////////////////////////////////////////////
, {+ _  @6 ^3 {( r2 o$ n( k% Z//功能: 停止朗读。如果朗读为同步方式,则不能停止。" j3 n' N3 n- ?! o" u
//参数: pwcs:要朗读的字符串,需用" L"" "转换,可以是包含xml标记: q. Q3 @9 M: h" k
//    的字符串。dwFlags:朗读方式。SPF_ASYNC为异步,SVSFDefault为同步,
  F( Q  P; D5 b0 e! \//    SVSFIsXML为朗读带xml标记的文本。- s( c4 E* p9 X( m+ k( \6 Z
//返回值: HRESULT。( f' H+ C9 G& ^' e' Q
////////////////////////////////////////////////////////////////////8 v: ^! [; L7 E; m: y
HRESULT Speak ( const WCHAR *pwcs, const DWORD dwFlags = SPF_ASYNC );
" l- V, j. s2 m+ y
; h  K0 x7 ?6 x) n5 s5 N////////////////////////////////////////////////////////////////////
0 X) }: R5 |1 ?! r# d5 c2 t//功能: 停止朗读。如果朗读为同步方式,则不能停止。/ Q% ], A, z( n" o
//参数: 无。
: X3 T3 a4 B3 t/ y% B% x//返回值: 无。6 g, l' [6 V2 A) I- c
////////////////////////////////////////////////////////////////////
' U1 {5 H" t8 o, A& _! d, {void Stop ( );5 y: ]5 h  ~5 A2 ~  F' a
, @, {" j) c2 v+ I" T% ]2 y% T
////////////////////////////////////////////////////////////////////5 M+ M' a# ?, ~. i2 n
//功能: 暂停朗读。如果朗读为同步方式,则不能暂停。
: R6 y; f# F- w' f2 s5 s; F/ |2 T//参数: 无。
+ G( \3 M& u) Y4 B& [9 J- k//返回值: 无。0 J. R4 H+ E4 [" `" i
////////////////////////////////////////////////////////////////////
* u) r, }8 B7 `+ wvoid Pause ();# _. D' E' R" i2 F2 f9 {  c/ a( B

5 @% W8 N7 J3 _+ [: @$ [# b////////////////////////////////////////////////////////////////////
. x" X$ o, t- ?4 ], w//功能: 从暂停的地方继续朗读。
2 Y3 ?, d$ p8 m( a/ e3 `% p//参数: 无。3 T8 ^' h6 H. p) R/ J
//返回值: 无。
; J& V% H7 w2 o  x, J+ L: O: _, K////////////////////////////////////////////////////////////////////# c% p% {1 `5 R" c. I: Z0 S( K
void Resume ();
. b: ?, C( @! P1 u5 O, b
" t, F/ T0 T6 a; C7 ]4 S: m7 F' s  |
//********************************处理事件部分***********************************
% ~6 Q: x0 |( Y" P5 P& U+ Y. M4 t, A: n& V2 y
public:0 {  n. P6 k/ X; G: m/ K4 \
////////////////////////////////////////////////////////////////////7 p; ], d6 g2 ^' _  E9 t
//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。+ z# Q% I+ B7 C1 B$ X' D
//参数: 无。
  }% \+ j6 a. E8 X1 K//返回值: 无。
3 D' T/ ~9 e# o, k" s: k, u////////////////////////////////////////////////////////////////////* G0 g. e) |- S1 g
void ProcessTTSEvent ();
% t" D5 q5 \9 X7 d  t1 E$ [& a- u. H$ i- X7 ?

: ^6 P0 {: s: d6 d0 U7 T////////////////////////////////////////////////////////////////////
, h" @! E; u1 [//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。
8 c" |3 n! I/ [. q6 M; l//参数: 无。
- d1 w' M; L, ]1 o8 f8 C* H9 `//返回值: 无。
& B% J0 c' d! e////////////////////////////////////////////////////////////////////7 o+ l7 T: m( }& l
virtual void OnStreamStart ();
! `4 M( @5 @" u" J0 ]% j; P( N# @' [' \  a" z2 m% a
////////////////////////////////////////////////////////////////////# r/ G+ Z( I' O" ?1 S# A
//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。
+ _$ S' E* `4 n1 n' V7 W//参数: 无。+ K# y& S' a+ ]2 M3 R
//返回值: 无。) m8 _3 H2 e9 M; m6 D) ~" j
////////////////////////////////////////////////////////////////////
) B& j$ _; {7 v$ r- [5 Lvirtual void OnStreamEnd ();/ L2 ^9 E- v5 A2 u( J  T& z
};( o& {! ], D9 l$ P
3 |: X/ H/ |( l- u
0 i/ a5 G, I' Q8 e5 D
///////////////////////////////////////////////////////////////////////
6 v( M+ c, A7 |1 n! B& E: @; q///////////////////////////////////////////////////////////////////////
) W# Y( z4 `4 W3 ?4 ]$ P* }# N//         CSR) }, i/ ~; D! p  ?
//
. z3 F! f# D+ W  ~( u///////////////////////////////////////////////////////////////////////
# K. P& k4 G" \3 b2 I///////////////////////////////////////////////////////////////////////
* \  T+ @7 O: v1 P$ c% Q$ @4 y: T* t
class LANE_SPEECH_DLL   CSR
& b. ]8 O, o' r8 U{3 B- N$ B4 P( @! c9 \/ M4 _9 t$ J' [. |

4 W- S; U; n! O4 [, y/ h3 tprotected:
5 K  _1 h' _( @HWND m_hWnd;
6 J7 L5 v$ U8 F; r9 T6 V7 w
; S0 v" B1 F1 ~7 Lpublic:2 q2 D5 |- R0 z. s" h
CComPtr<ISpRecognizer>   m_pSREngine; // 语音识别引擎(recognition)的接口。& U1 E4 X$ z- H( z1 [; e
CComPtr<ISpRecoContext>   m_pSRContext; // 识别引擎上下文(context)的接口。
! a# R5 w  x$ g8 x, m* ?CComPtr<ISpRecoGrammar>   m_pSRGrammar; // 识别文法(grammar)的接口。6 {+ N3 d$ u7 u! a& Z
CComPtr<ISpStream>    m_pInputStream; // 流()的接口。) Q1 K+ ^6 q9 `4 i" |5 [0 R
CComPtr<ISpObjectToken>   m_pToken;   // 语音特征的(token)接口。
6 h% _& y; o4 W: N" w- B1 S. dCComPtr<ISpAudio>    m_pAudio;   // 音频(Audio)的接口。(用来保存原来默认的输入流)
" P  p* t. t# `" E' tpublic:. ]1 g0 ]3 `, L
static ULONGLONG    ullGrammerID; // Grammer的标识符, 64位无符号整型 每建立一个Grammar,加一。+ h* G3 G7 S! J
# R  o4 a2 s, ]+ b
' p- X) A/ B2 [4 y; W
protected:! s& Q" b6 o, c- H0 M4 h: w. H
//***************************辅助功能部分****************************************
& `4 q3 P4 v% ?, o  |) Q; k7 Y, n$ J% F+ q
////////////////////////////////////////////////////////////////////- y# _% n/ ~. h" i/ g# Z4 e
//GrammarID加一,每个GrammerID必须不同。6 M' T$ P* w2 Q9 O/ e; E/ z8 W" b
////////////////////////////////////////////////////////////////////
+ R# C- d- U4 Ostatic void UpdateGrammerID ( );
9 L+ _6 A' d. n; j& ]+ `
7 c, @1 N+ w* [
9 i' V; ]/ B1 s8 {# V: {) h' f8 ^public:8 \, `! t  ~! a7 F! Y. q
////////////////////////////////////////////////////////////////////# L' G3 ^0 t0 V' H
//功能: 友员。TTS中的从SR引擎中建立voice对象。
: S! V. }! G/ w4 H4 e& `//参数: pSRContext:SR上下文对象的指针。" i+ S7 e0 T; }
//返回值: HRESULT类型。" W3 ^1 J9 S* r1 b3 z$ W9 v" A
////////////////////////////////////////////////////////////////////$ d  Y+ ~5 L) x7 u
friend HRESULT CTTS::Create ( const CSR * pSR,
; e$ M9 r7 m- ~' R9 T0 N          const DWORD dwLanguage );
3 \* |( r" \7 a( C7 g7 W7 |" D2 n* v0 x

0 s& Y7 B7 |* h' F* m//****************************初始化部分*****************************************! f( y: O. `& q% F9 E( D3 `0 Y
; r& [5 S4 @( ?6 k; D+ Z1 k8 p
////////////////////////////////////////////////////////////////////8 Y8 P/ @4 `, O7 h( n
//功能: 保存与识别引擎关联的窗口句柄,更新GrammarID。
! f1 Z- h9 N/ W8 ~( j//参数: hWnd:要关联的窗口句柄。
- }2 N1 v7 `% l- W: k2 h4 K7 U//返回值: 无。; ~& C. q. b$ k, l
////////////////////////////////////////////////////////////////////
3 X4 b% c* u$ q, `6 y) |CSR ( HWND hWnd );# r- a6 Z7 V# A: d3 C8 B

- `0 Q% z5 W& a5 F" T0 \1 r////////////////////////////////////////////////////////////////////5 n% _* Z5 c, I/ {7 [9 K" k
//功能: 释放所有的对象。. H- F$ T/ `6 H5 A1 r' v
//参数: 无。  Y2 D$ E) o! k) C6 s: ?
//返回值: 无。
7 p, D0 x- T2 ?5 e////////////////////////////////////////////////////////////////////- n, V3 a1 A& u2 z. Z' i! s
~CSR ( );, f- P6 Y5 ~- W. F" ?! L; [- p8 S# ~

$ ]6 F+ B6 R; u3 W* D////////////////////////////////////////////////////////////////////
8 `) Y3 @* F2 @, q7 w//功能: 建立各个接口的对象。设置要是别的语言种类,消息,通知事件," k4 @) t/ e1 |, ?
//    加载文法文件。
& G. B8 X, R- s1 n' N# y//参数: SRType:识别引擎的类型,SR_INPROC为独享类型,SR_SHARE共享类型。* v  J: I+ P3 ]- x% Z6 w8 m8 c
//    pwcGramFileName:文法文件的文件名,要用" L"" "转换为WCHAR型。
+ x  A# W6 {- r5 v6 g//    dwLanguage:要是别的语言种类,SP_CHINESE为中文,SP_ENGLISH为英文。6 J& R  A8 Z* q" ?/ ~
//返回值: HRESULT类型。3 A) g2 |8 z6 C; X
////////////////////////////////////////////////////////////////////
/ X- V( \) i# l" W" H8 O- bHRESULT Create (const DWORD   SRType,
6 f7 |$ x- [* R$ B      const WCHAR   *pwcGramFileName = L"grammar.xml",1 O7 ^0 j+ ~& [  V& b
      const DWORD   dwLanguage = SP_CHINESE );* f' L$ s7 o7 B

: _; c" c5 g2 I& M2 z  Y9 Y) L) r( `& Y# A
//**********************************设置部分*************************************8 v! ^+ O5 n' J9 L
0 M* N$ M( @3 u% Z, p
////////////////////////////////////////////////////////////////////
. N6 U' B) \2 e, q2 [4 d! i$ r% u//功能: 设置要处理的上下文接受的事件。
+ h! a: i  N  U. l- G' n3 b//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,7 _* O- ]  n& B* D9 q# s
//    设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事1 p" j* P* ?) k' a6 ]! B1 Y* E# S
//    件都会收到通知。0 s# ^6 P" x3 J1 d% l
//返回值: HRESULT。
4 P2 Z: P* R. B* e////////////////////////////////////////////////////////////////////
% o; S: {" _2 @# a+ i; XHRESULT SetInterest ( const ULONGLONG   ullInterest );
, r6 E( k) |. H# M. f9 L6 m# [7 r: j4 }1 x5 X/ G7 I2 i0 f; U& I
////////////////////////////////////////////////////////////////////
* `5 a) ^% i' A7 t: b//功能: 设置某个规则的状态(激活或者取消激活)。) |1 d" E2 L0 q8 x
//参数: pszName:规则名,要用" L"" "转换。bFlag:TRUE表示激活,4 L. k0 k& a) h* ?3 ^" |: \
//    FALSE表示取消激活。' b: P$ M6 s9 L. R' D" A1 F4 y
//返回值: HRESULT。" D  G" v; M1 j4 p
////////////////////////////////////////////////////////////////////1 U9 [* Z* n7 m8 [  a" ?
HRESULT SetRuleState ( const WCHAR   *pszName, const BOOL   bFlag );0 W( [; U3 ~! G0 L" A
  P+ D. w6 ^! f* y( v( b8 O0 P

' R) D. h" E6 S( n* v% p1 k3 j////////////////////////////////////////////////////////////////////" K. r% k- y! a; J' P
//功能: 设置识别引擎从.wav文件识别语音,如果不调用此函数则默认从麦克4 o" {0 H! L7 s- h9 K/ d4 O! k. Q
//    风输入。
" a! c  x! O6 G- b: `8 z- F//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。6 N6 Q& i2 C( Q9 n( n
//返回值: HRESULT。
7 q: t" V: c) b3 Y. h: Q1 U( q& g) f////////////////////////////////////////////////////////////////////
$ J. D! Y3 V* sHRESULT SetInputWithWav ( const WCHAR *pszFileName = L"sr.wav" );# z. z: I; m( G9 ]5 s- n

0 t+ ]1 v5 Q6 i////////////////////////////////////////////////////////////////////5 v# Z; q& `' ]
//功能: 取消从.wav文件识别。恢复从麦克风识别。
! Z6 ~8 X' H( t9 @) |//参数: 无。
9 V2 |3 Z5 k& G- A, u& S* }" F//返回值: HRESULT。- @/ v/ S! \/ Z) w  H% }; x
////////////////////////////////////////////////////////////////////4 g; q: Z. U7 ~
HRESULT UnSetInputWithWav ( );
/ B2 C2 Q  v' F5 R0 T0 N4 x6 K4 w+ Y4 I$ d4 ]( w! J
//***********************识别开始,结束,识别结果的处理**************************# N9 P) \" R9 b: y
* L6 D# X! C- ]1 w3 o& @
////////////////////////////////////////////////////////////////////
6 B* ^+ I# v( G1 ~//功能: 识别开始(将所有规则激活)。
- y! o& g4 h4 l' |//参数: 无- K* Y2 t, b3 ^$ W0 X# I! y
//返回值: 无。& k8 q& }' I; w- P( }
////////////////////////////////////////////////////////////////////) g. m' j$ Q; s# s
void StartRecognize ( );
$ M" z* h# n- R  _* O. p) j# c3 h1 X9 a$ b3 n: k/ B5 J
////////////////////////////////////////////////////////////////////
/ d0 x0 K/ @# U& B- s//功能: 识别结束(将所有规则取消激活)。
: M) s* h( [! O2 j( m5 x//参数: 无。, r$ P$ z% H, p: C
//返回值: 无。
. ?8 j0 w! h) {+ L/ {: m- l  n////////////////////////////////////////////////////////////////////6 s* a4 A4 t% \
void EndRecognize ( );6 I; H, g$ `+ a; Q1 \; V
0 u6 ~# L2 U  p5 A* n1 `5 k9 B
public:
1 ?. e3 `1 k- Q( {# l/ s+ e///////////////////////////////////////////////////////////////////// W6 {& ^$ {$ s2 v. e* K
//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。2 g6 u0 T: G: z* v7 T
//参数: 无。
# z9 H2 J, \' E//返回值: 无。
5 d& X% F9 U$ `' ]! h////////////////////////////////////////////////////////////////////
* w2 v, M! I2 w; c0 |; s/ k6 Pvoid ProcessRecoEvent ( );
8 g* |! W2 H7 s4 {) z; ?- j8 `7 ]1 ]: H$ `0 Y5 z
protected:
8 K2 ]; t4 X% S* o# N+ \////////////////////////////////////////////////////////////////////+ D* k# p( z% b: c" ^6 D
//功能: 识别成功时要调用的函数。系统自动调用,不需要用户自己处理。
5 z- p: y3 i* O. _1 E. d//参数: pPhrase:ISpPhrase类型。
9 c7 G  f* s8 Q//返回值: 无。
$ B% W3 L3 O: A6 l/ [4 w////////////////////////////////////////////////////////////////////4 v( h% q( g' y
void OnRecoSuccess ( ISpPhrase *pPhrase );
6 X, |! j; b, H3 A; {! m$ v. U% S+ t% x0 p+ J
public:
- [8 `4 U2 u& h: ^* v& u( A, c. Y+ p5 ~$ l////////////////////////////////////////////////////////////////////  u9 q* c1 P9 m5 @
//功能: 识别成功后,根据规则的ID决定动作。系统自动调用。虚函数,- k4 o4 U0 U1 a- }. D( k1 Q' k% D
//    需要在派生类重载。规则ID必须以常量形式预先定义。+ `) K  @9 p! \2 o! _: L+ r! S' o
//参数: ulRuleID:顶级规则的ID。ulVal:子规则的ID。
/ _; S9 s9 u4 ~* `$ C' Z//返回值: 无。
! u5 N9 @. T1 U2 [* l. g5 t////////////////////////////////////////////////////////////////////
+ b4 n# B+ U% T& J, h' ovirtual void ExecuteCommand ( const ULONG ulRuleID,; m; a' l* S. t' ~* w. V1 i
          const ULONG ulVal );5 D6 q7 E  \0 f2 c: W

  G( Z/ [# U' k. B: k3 R9 P0 y////////////////////////////////////////////////////////////////////
  b, v8 W- S5 }7 b0 {//功能: 识别失败时的动作,系统自动调用。虚函数,需要在派生类重载。
! Q1 v: Q( c( [0 @5 g) @; j//参数: 无。
! F/ u2 V/ k. F9 y  A8 c+ N//返回值: 无。
4 s3 a& s; Z: d0 \- y* ?////////////////////////////////////////////////////////////////////
/ S# x1 {# Q0 a3 h+ T8 j  f6 ivirtual void OnRecoFail ();  y! w6 C0 y: D8 t# w

5 b/ u" U% G! Y3 H) v////////////////////////////////////////////////////////////////////
# ?# k  V# }; i8 k//功能: 为虚函数。当输入流开始时要触发的动作,需要在派生类重载。
# ~2 [3 i9 t+ @6 e, z  u//参数: 无。
" T. }  q) M" [//返回值: 无。
$ a+ i4 W3 ^' m- ~" I* p////////////////////////////////////////////////////////////////////$ k/ R) r; S- q) c
virtual void OnStreamStart ();" d9 f" G5 V8 B9 ^2 S
, C6 `5 g/ b& C; u3 c! _7 M2 f2 d
////////////////////////////////////////////////////////////////////
3 P  C/ i0 d( V3 C//功能: 为虚函数。当输入流结束时要触发的动作,需要在派生类重载。
; A+ e2 d; t1 X" L//参数: 无。# @2 n% {3 p$ U( ~
//返回值: 无。
- ?2 {! b& d6 _) x2 }5 U2 Z3 O8 o% W////////////////////////////////////////////////////////////////////- K- ?0 k" v2 o. r1 X
virtual void OnStreamEnd ();1 j( D/ l' v1 Z* y# m

8 d; p, ^& k. W8 z+ V};
, i% U  W, c! `. f5 Z8 U" Q9 q! b2 N
$ q8 o6 B' h. m! X. }& P9 v
) \8 a/ B, Q! h; G+ Y$ A. z# t+ L9 w9 G) K3 F
#endif    //LANE_SPEECH_DLL_H
/ _. {4 `8 ^5 x4 J
  ~7 t' E+ n  L///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////; P" q; E" e+ F$ O0 ~
# Z. d7 I. X, `8 k( B: e  z8 i
////////////////////////////////////////////////////////
" L1 R  Z( I5 E! j//
5 L* E+ k- c* M" U, j! n) Y4 l// 文件:LaneSpeech.cpp
, P9 H) i" |0 d. _( D6 }6 l  e$ z7 K// 功能:封装的speech sdk5.1 的文本语音合成(TTS)和语音识别(SR)功能1 s$ D; T% \/ Z5 a# P: I
//    语音识别只支持命令模式,不支持连续模式( e, V2 W+ \9 l$ U0 h8 Q0 R0 e
// 作者:吕宝虹(Lane), msn: lkjx82@msn.com, qq: 3619908% x4 G& i9 N% k. H" Y$ m- ^2 U
// 日期: 2004.108 n' n5 k. ], q" B( a$ R
// 版本:1.2
- s1 J9 f" A: t  ^1 v// # W! `3 K. g8 Q3 }- ^' u
//
3 O" S! ~4 q1 Q$ c' F# b, m$ ^& O: Q8 C////////////////////////////////////////////////////////: p" y& K; B4 @# Q
1 J( v* {0 T  d+ U0 p- j

; ^2 S. S( ^. l
- j4 P8 x' l/ ]- P: ?#include "LaneSpeech.h"
, U0 o8 D+ L. w' y; L9 {
- h3 [0 C* j. c  [5 b7 ?//-----生成动态连接库和静态库的处理----------------
5 a1 T- l( T, I$ o' J! u#ifdef USE_SPEECH_DLL //定义了USE_SPEECH_DLL,就按生成DLL,声明导出导入类
6 q* F; k& o/ m! L+ R/ \! z# v  R9 f, }7 |
BOOL APIENTRY DllMain( HANDLE hModule,   j& x5 H- m) C; U
                       DWORD ul_reason_for_call, 4 r$ t4 l4 q2 M8 q. U9 n
                       LPVOID lpReserved( i! ]2 l& o9 i4 U7 A/ _2 p
      ); u: ?: S/ c6 t
{
- J; N# Q5 g3 E; {5 i4 U    switch (ul_reason_for_call)
2 {6 |. _. L5 c& h{' g- c. E5 k$ B
   case DLL_PROCESS_ATTACH:% g5 {% R% |9 m; ]/ ^# i
    CoInitialize(NULL);' z6 {% T0 J- B$ x" z  q) z
    break;
( D4 @: r$ u4 F! O/ v  " @  z$ U, _" H1 F
   case DLL_THREAD_ATTACH:
7 O: R4 j' d; F+ ^    break;; t$ M7 y, ~9 y
  # {/ P/ O! N8 l7 e  c
   case DLL_THREAD_DETACH:
3 \. v5 Q- `1 `/ X7 V5 H% N    break;
  U+ X! _) X" Y  h- {  5 c2 k" L7 G3 Q6 {/ B' j
   case DLL_PROCESS_DETACH:
5 C) F3 k- l* i) k4 F- e' z, Y    CoUninitialize();
4 }& `) T' x6 }- W* ^# j    break;
$ \' A( s5 }( G' K, z    }5 Z; U2 I1 x+ \. D$ r1 n
    return TRUE;" W. K; i0 w" m# r7 Q# c9 z
}
* b0 s! N; T* u% d1 m
. V8 b  \2 r9 b( r6 j#endif //USE_SPEECH_DLL* F: Q, a' H) U6 Y" L' g/ k3 C4 [

. L$ C. k9 [. B2 Y" ^
- _) H7 X8 \3 y' r, G8 C$ s1 }$ X% ?" e
///////////////////////////////////////////////////////////////
$ |0 W* S: _% h; Z) j+ _0 t$ b& H2 D; t0 }
////////////////////////////////////////////////////////////////////$ ^1 ]  h3 m$ b# O: E, z& J# j3 e
//功能: 弹出一个信息框。: X3 p; d! X: _% V
//参数: lpText:是对话框信息。lpCaption:对话框标题。
  Q8 E) ~6 b% ]0 F//返回值: 无。: l, B1 K1 f" \1 m! D% B  N
////////////////////////////////////////////////////////////////////
4 A9 _6 M4 E- m' m7 Einline void ShowError ( const LPCTSTR lpText = "ERROR",: C3 Y5 z, w" u
        const LPCTSTR lpCaption = "ERROR" )
2 P, z* s1 }0 h3 d$ ?1 N6 P8 B8 O. e{
2 q  u4 I4 F' E* L( G! g/ w   ::MessageBox( NULL, lpText, lpCaption, MB_OK | MB_ICONERROR );
4 `; S1 ~7 A; U3 ~$ q* r}
5 H. Q4 Y" p- C
( ]) ?4 A9 F; n2 t% V7 @////////////////////////////////////////////////////////////////////% c" R7 ?2 E$ r! g) ?1 X0 i* `: X
//功能: 检查一个HRESULT类型的值,如果是错误的值则,弹出信息框提示错误。
# |8 p6 a2 K5 m1 {! {//参数: hr:要检查的HRESULT的引用。 lpText:是对话框信息。
, e& T0 M4 l) l& P$ ?" j) k- k//    lpCaption:对话框标题。
" F0 o! U$ w$ m2 l; s8 ^//返回值: 有错则为FALSE,没错则返回TRUE。
$ C2 Z+ Y6 l. p" F& D4 q////////////////////////////////////////////////////////////////////
$ F5 o/ v/ ]0 |! J, {inline BOOL CheckHr ( const HRESULT &hr,% d% V/ d% M( \' m. e
        const LPCTSTR lpText = "ERROR",: T, V9 x% Z# G8 @: W
        const LPCTSTR   lpCaption = "ERROR" )/ `, {# [2 z' i- E( C( Y
{9 d/ ~) t4 o  {' q
   if ( FAILED( hr ) ) {8 O8 @) e0 P: ]6 y- n! [
    ShowError ( lpText, lpCaption );& `4 a/ `, X. R; P$ U
    return FALSE;
$ C7 p! X# w/ q   }# |' W1 {. _0 P- o, g- [. s
   return TRUE;
) A; a6 w2 q+ Q  A# O; C- v$ i}5 Z. p- i+ v. N) _- Z. _! T* ^

3 m& u9 o+ d# E% I) u! [" \+ C/ i) d% m& m
///////////////////////////////////////////////////////////////////////
8 L( E- H& t- @" `( d7 a8 x, @3 a///////////////////////////////////////////////////////////////////////3 u% `. w0 U* ~+ h8 O% `7 p! B
//! m  i3 D" P0 [$ v9 p1 d; b' A; A
//         CTTS
4 Z2 B& ?9 }8 d; G//3 u" a& K% [$ c7 h# M
///////////////////////////////////////////////////////////////////////9 Y5 i$ _7 |, R% Y% v
///////////////////////////////////////////////////////////////////////
6 @( n" H5 Q" n4 E  u" {; N) B. [9 I* e4 X  |* |) w. U
////////////////////////////////////////////////////////////////////6 g# @6 b" R, D4 [$ ~) Y, j  Q* {+ |# G
//保存关联窗口句柄。初始化COM。) Z; B" O4 \$ B' ~
////////////////////////////////////////////////////////////////////$ W" ?7 o* X) D
CTTS::CTTS ( const HWND hWnd )3 R, B, k' v* k* \3 ]1 I& S' Q
{
& E, \# e6 r& `" P  ym_hWnd    = hWnd;" C" _- i4 c6 b) S
m_pVoice   = NULL;2 S# X$ {; x- n% n) m% E
m_pToken   = NULL;. C' _! x% o5 v
m_pOutputStream = NULL;
0 W. T" i( F5 Z, Bm_pAudio   = NULL;
2 V: U/ w* |3 u9 M( N" r! V}7 a4 r7 Q7 D. @* Q/ q8 x
$ c7 r$ S9 G& r  s
////////////////////////////////////////////////////////////////////0 x# o4 Q# f' ]
//释放所有对象。* w0 R7 l1 Q! Q; X, k' ~
////////////////////////////////////////////////////////////////////' k; X6 C. _/ M; t
CTTS::~CTTS ()
  i8 `5 _' c4 _" k  [6 N' K4 W+ _{
( E$ M4 j  J4 I1 aif( m_pToken) {* e. z+ j7 ]* Q' N9 _6 `) R
   m_pToken.Release();
8 g& p' P' _3 _   m_pToken = NULL;1 R2 v; f7 \4 T* _
}( U, M  ]" G$ j9 k. m8 f& M5 H
if( m_pAudio ) {
3 v1 H; i' G9 f1 N7 y8 i   m_pAudio.Release();
- {2 m) G" S' N/ E+ F. f   m_pAudio = NULL;
- k6 q* F! }: l}9 }1 ]8 O8 e# f$ o
if ( m_pOutputStream ) {
# Z. B% p8 E( e! Y% I   m_pOutputStream.Release();
" \* j. k( J& V# N) V. }2 k6 D   m_pOutputStream = NULL;
+ _7 Y+ W4 l3 ^; \' d}0 }- ^/ x6 O4 S! ]0 s8 k- s
if( m_pVoice ) {
# {  J8 L# f% t9 T: L   m_pVoice.Release();
/ ?* _5 u6 t2 h% V/ k8 o6 U4 L   m_pVoice = NULL;
: \2 ~5 u3 m' q* e# b- `}! j  u' X, p2 p8 s/ T
}
( p7 M2 ~8 w9 ?* W7 v$ H5 j' x9 Z4 Q8 Q2 P2 @
////////////////////////////////////////////////////////////////////' M* Q8 Z+ x7 `" n  X, V( B3 H
//从SR的上下文中得到voice对象。此函数在CSR中被声明一个友员。0 j5 [" x$ U  @2 {# Y8 `
////////////////////////////////////////////////////////////////////
( i) N) O! h- J, s% c$ YHRESULT CTTS::Create( const CSR * pSR,
9 h* {& o* _; S" H" W6 N1 X: n       const DWORD dwLanguage )
1 E+ H6 o& F9 s$ h  A{" Y8 O4 r2 q$ r) @
HRESULT hr;0 s+ D  g8 F- c1 A9 a
hr = pSR->m_pSRContext->GetVoice ( &m_pVoice );. N5 t+ [3 e" Z, M1 b8 S( p6 m
if ( !::CheckHr ( hr, "pSRContext->GetVoice()" ) ) {
+ E: W  a8 ^( ]; e6 e   return hr;% P+ {2 O. E5 G! [3 }/ P
}2 X) u7 P7 E& K. |
) J! F, W! g7 n; Q  A2 q2 M
SetLanguage ( dwLanguage );  f0 h4 q. `% Y5 P+ ]: K' o" r! a

: X$ W. x. W" [hr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );//建立一个默认音频流
5 M: Z0 p4 q; h! N0 t( Bif ( !::CheckHr ( hr, "CreateDefaultObjectFodd()" ) ) {. q3 w/ ]  X% S; h8 \! w
    return hr;
9 q$ n6 \+ n1 F5 N$ }}% ^6 e+ y) O% y6 B# {& R
# `- C8 h- X- T* H" b
//SPEI_START_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM4 C3 j$ u, B) b$ X
//SPEI_END_INPUT_STREAM 表示完成流输出。
2 m2 R; Y* L8 c9 N! z$ bhr = m_pVoice->SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) |
" ?  [0 _+ g# P: k* C% g, F0 o( l         SPFEI( SPEI_END_INPUT_STREAM ),5 @: I$ H4 D( z  P
            SPFEI( SPEI_START_INPUT_STREAM ) |
' a4 Y7 C( i$ O5 ^            SPFEI( SPEI_END_INPUT_STREAM ) );
  e' a% s! Y7 _6 |" {$ C9 Lif ( !::CheckHr ( hr, "m_pVoice->SetInterest()" ) ) {
5 Q, @3 w& E! {: N, J  }    return hr;# y3 K8 s7 U- X& ^
}- U( q% Q3 R, `
# _! [$ h# _- W8 r3 |0 J( t% L
//设置通知消息5 d) u9 A  Q' W
hr = m_pVoice->SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 );! \7 ^! C0 r; ^9 F( n
if ( !::CheckHr ( hr, "m_pVoice->SetNotifyWindowMessage()" ) ) {& _( u2 T3 }1 b0 @
    return hr;
1 s3 t" ]2 M& f( g}; S. z! n( H( w) z7 y# n
- c. n9 b" g- c. x; j
return hr;
' |8 @, F! }# B; u}% j$ p$ Q* J9 q8 ]2 k* b
+ _0 P* h/ ^8 n: M% E9 V# x
////////////////////////////////////////////////////////////////////( S5 i0 Q0 w% F( b: _& ]
//单独(相对于从SR的上下文中得到voice对象)建立一个voice对象。
2 ]  o) K9 l" R- d$ ?+ A, L- n//并设置兴趣,设置通知事件。
6 k$ \' ^& [( Y, h. L+ s////////////////////////////////////////////////////////////////////: ]+ d/ u/ ]" K) G8 j9 }
HRESULT CTTS::Create( const DWORD dwLanguage ), u0 s; L* W3 D! s) M: Y4 @
{) |2 B4 u6 _$ i- P( K. P0 O
HRESULT hr;
. v- C. t, o$ m, Ehr = m_pVoice.CoCreateInstance ( CLSID_SpVoice );
9 K. f4 J3 P9 R" tif ( !::CheckHr ( hr, "m_pVoice.CoCreateInstance()" ) ) {
' X. R* q3 f- i  h$ M   return hr;) u! u& G$ F; t' G) x- c, l
}
: c, P7 ?9 a2 L! T9 S" a4 J1 O, L: P0 e# @; q& P4 n, ^
SetLanguage ( dwLanguage );8 b1 u: @  `" e$ w, A  \- L
' }% g( |9 y) k; t
hr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );//建立一个默认音频流
+ E4 |/ z) y: }) ~8 zif ( !::CheckHr ( hr, "CreateDefaultObjectFodd()" ) ) {9 q& P# R. q8 P0 `
    return hr;
; R& V8 F8 q, l/ Q4 U4 g5 }}
, H0 p/ e. j+ b5 s8 [9 K
2 W$ P* H1 e) s' k4 E//SPEI_START_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM& r$ Z0 C3 J; l4 q" ]& s4 E' i
//SPEI_END_INPUT_STREAM 表示完成流输出。
- h1 M1 L" a7 z5 khr = m_pVoice->SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) |
! q$ ]. [3 D& \( D$ }% J6 D7 k         SPFEI( SPEI_END_INPUT_STREAM ),
7 ^# Z  w& l, @% ?& `8 ?* X% {) v            SPFEI( SPEI_START_INPUT_STREAM ) |8 X# q( p1 I' B5 T
            SPFEI( SPEI_END_INPUT_STREAM ) );- y4 D9 ]) R. S8 N. O
if ( !::CheckHr ( hr, "m_pVoice->SetInterest()" ) ) {
/ @+ i* @, G& B+ b6 g* H: Q) h4 }    return hr;
3 r! j9 ?  \) x3 V}7 D* A- |1 D+ t7 f; f  _

- V; t7 \$ y. D% s+ y& R//设置通知消息8 {9 f/ o. X# \  k! i) D
hr = m_pVoice->SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 );
0 x' ]" F8 z6 p9 Y2 A2 E4 l( K0 a/ `if ( !::CheckHr ( hr, "m_pVoice->SetNotifyWindowMessage()" ) ) {
  p! t4 U! Q* g    return hr;: v& S* ~3 x) J; T4 b
}
/ p: [, M- a3 B1 p: ?" W/ M3 t- ^3 `( b3 C
return hr;- B5 K% m1 F  r' G  L) i
}3 F# p5 O" Q$ w$ B) B, W! Q# W
 楼主| 发表于 2011-5-23 17:06:27 | 显示全部楼层

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

第一个小程序
装好SDK后,我们当然要运用了,要不然我们装它干什么呢。我觉得写程序的乐趣就在于自己写出了一个能运行的程序,那种成功的感觉很好。好了废话不多说了,接下去就来写第一个能运行的程序吧。
1、新建一个Win32 Console Application空工程,在工程里面新建一个C++ Source File。
2、首先当然是包含头文件
#include <sphelper.h>//语音头文件
  X7 z3 B. \1 _: U; d. l#include <iostream.h>//C++头文件,用来提示错误信息
3、然后是主函数
int main()/ Z7 c/ }( f, p0 y4 L  f% f
{4 W: E5 y" U4 ]% }7 A  X
    ::CoInitialize(NULL);//初始化语音环境; R7 z5 `* \1 [5 `) y9 R, v9 V6 Q" v; Z
    ISpVoice * pSpVoice = NULL;//初始化语音变量
8 \( Q2 |( D# ~' D/ s    if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL,CLSCTX_INPROC_SERVER, IID_ISpVoice, (void **)&pSpVoice)))  
    //给语音变量创建环境,相当于创建语音变量,FAILED是个宏定义,就是来判断CoCreateInstance这个函数又没有成功创建语音变量,下面是不成功的提示信息。
    {
* J2 z( L. U* O( l. @        cout << "Failed to create instance of ISpVoice!" << endl; 1 K- y) ]. @  ]' R$ |: `
        return -1;
' _3 U! j  n6 f1 u3 ]    }
8 S) v8 q4 f6 y& z: i
    pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);//执行语音变量的Speek函数,这个函数用来读文字。
    pSpVoice->Release(); //释放语音变量
  @) e% ^- s" l* ^$ w    ::CoUninitialize();//释放语音环境

- K" O5 ~0 f" S$ Y* I    return 0;- C& p. h8 R2 y& _# p
}
4、第一个程序就这样写完了,运行读出了Hello World,是不是觉得很神奇呢,呵呵~~~~~
回复

使用道具 举报

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

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

VC6.0下开发Speech SDK5.1程序" r1 R" J3 ^) t  V

9 r+ ~, ^' X4 _1.首先开发得需要Microsoft Speech SDK的支持,以下是下载地/ n: H# W2 T, c+ C, Z( R
6 p1 Y0 H0 Q/ q+ O' z, ]- s
http://download.microsoft.com/do ... -US/speechsdk51.exe   1 L! u+ h2 Y: k4 P$ A
Speech SDK 5.1安装包 (68   MB)     ' ^  g' S3 ^1 Z9 W/ U9 m
http://download.microsoft.com/do ... chsdk51LangPack.exe      
4 {) h! E/ H. K1 l& V' z中文和日文语言包(上面的安装包只支持英文,如果要你的程序支持中文则下载此包)(81.5   MB)  . q6 R$ V/ s* w; n$ B. Y0 t7 @
4 t; ]% ?8 O. ?% ^1 n% O
2.下载后,执行安装! w* F& d, z  [( O9 |
1 J# q7 Z+ Q' A$ W
下载完毕后首先运行SpeechSDK51.exe,它其实是个压缩包,不是可执行文件,解压时选择解压到的路径,然后,运行解压出来的可执行文件,默认安装路径为C:\Program Files\Microsoft Speech SDK 5.1。运行那个中文语言补丁包SpeechSDK51LangPack.exe,和上面的一样过程,这也是个自解压文件,不过这个第二步不需要选择安装路径,运行一下就行。) |7 g. B/ v) J1 P  T! Z  I

5 j0 O: \) S6 t3.VC的环境配置7 K$ @6 n$ W; a2 e
8 Q8 _! {% U/ q+ T. V2 ?
在应用SDK的开发前当然得需要对工程环境进行配置,我用的是VC6.0(其他情况类似),配置的过程如下:5 ?" z1 c/ D) Q: _
% G3 ?5 v( h, B% y8 {' c6 u3 f
工具->选项->项目->VC++目录,在"显示以下内容的目录"下拉框中选择"包含目录"项,添加一项C:\Program   Files\Microsoft   Speech   SDK   5.1\Include到目录中去。再选择"库文件"项,添加一项C:\Program   Files\Microsoft   Speech   SDK   5.1\Lib\i386到目录中去.
' d; n' ]- A+ L6 T  q+ I( H7 s( V* O! z5 T- K- {; b
好到这里为止Speech SDK5.1的配置算是完成了,接下去就可以写程序了。呵呵~~~~~~~) ?+ a2 v- O4 E0 Y! {+ {; N
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-5 00:09 , Processed in 0.017316 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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