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

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

[复制链接]
发表于 2011-5-23 17:04:22 | 显示全部楼层 |阅读模式
////////////////////////////////////////////////////////  e: ^$ h9 s$ b' {& ?
//1,生成动态连接库时,要#define USE_SPEECH_DLL,% S) t( w; ?: ^+ _$ i' z
//      并且#define LANE_SPEECH_EXPORTS% ^8 O( s0 Q! n
//2,使用动态连接库时,要#define USE_SPEECH_DLL+ `/ O! b5 t. O# T
//3,声称和使用静态连接库时,什么都不需要
! l3 I1 k/ M6 n4 x, s% C//4,另外主程序中静态连接库要调用的方式里要调用CoInitialize( NULL )和CoUninitialize(),
( F4 `( C( P! g  H( Q//      动态连接库就不用调用了。
; b! }7 }' V* ^3 J7 D. X  ~" b* o////////////////////////////////////////////////////////' b/ t! u$ v- h( L
#ifndef LANE_SPEECH_H
9 _6 {. D' O# \* m0 y3 x#define LANE_SPEECH_H
0 K( Q* Y) J& }) t& h1 P
7 I1 u2 q$ j5 |( }5 v#include <windows.h>- S) M4 |* `# k
#define _ATL_APARTMENT_THREADED* P  \, F$ l% u; C) U& @7 K
#include <atlbase.h>$ ?% P1 _/ U- X& L, n$ R
extern CComModule _Module; //You may derive a class from CComModule and use it. if you want to override something,but do not change the name of _Module
/ C( R8 a( ?( N1 m" h5 n# I% D#include <atlcom.h>
8 K# f+ M" \% V7 a#include <sphelper.h>   //sapi需要的头文件
. g6 p6 z- s: Y  V6 \7 l* J+ Y% ^9 S7 R. W0 T
//-----生成动态连接库和静态库的处理----------------
( r2 a; ]) }( }#ifdef USE_SPEECH_DLL //定义了USE_SPEECH_DLL,就按生成DLL,声明导出导入类
. z+ e$ F$ x; L0 x! I2 |0 k% Q9 p% N2 Z( h1 i0 Q/ a7 T7 \3 B  A
#ifdef LANE_SPEECH_EXPORTS
8 ^" k9 h/ z4 z7 l   #define LANE_SPEECH_DLL __declspec(dllexport)) Q7 u9 U: O% y% n) x0 W; N
#else
: I5 ]4 ~$ e9 B   #define LANE_SPEECH_DLL __declspec(dllimport)" j1 f2 P) Y6 X3 e5 E- c
#endif
5 E% I- P/ }! H/ o$ u( H  ^; C. |: A( ~, Q: R
//这个警告我现在还没闹清楚是怎么回事了,估计是DLL和com或atl有关9 g/ u9 c' o: ]$ T7 D: p
//暂时只能屏蔽掉它,在静态库里就不会出现这个警告。8 Y+ ]/ w+ C$ f+ Y
#pragma warning( disable : 4251 )
3 R, r- h2 {" F5 e) M+ A  L+ W, B
#else     //没定义USE_SPEECH_DLL,则不声明导出或导入类(LANE_SPEECH_DLL就为空)  l# _$ m: O, b3 M
#define LANE_SPEECH_DLL0 Q" ?5 F& [, _8 b
/ z$ s8 Y  Z6 Y7 o2 H
#endif //USE_SPEECH_DLL
9 Z% {5 |; {; }" F& m0 [8 K
) j9 m( A& b- E  Q5 o) O0 l' `4 ^
- q/ _5 J2 q4 ?$ i$ @# s//***************************常量***********************) y/ C# L- X' y+ }* D" k6 D  N' \1 [

9 n1 L  U$ g* z0 L' C- T' R/////////公共常量-----------------
) S5 t( m! }) O/ O5 \% B8 |const DWORD   SP_CHINESE = 0x0000; //简体中文.
" h" o! e. t( X  N* [const DWORD   SP_ENGLISH = 0x0001; //英语.
* T  o8 X# [/ x6 c3 F: d9 t0 Z7 p- Q0 n$ [! C( Q2 [  m! Z
/////////CTTS常量-----------------6 Q/ O0 E, b. m4 d9 h6 N
const UINT   WM_SPEAK = WM_USER + 4444; //触发事件产生的消息。
/ o1 X$ X) R. A0 Q4 e+ z$ _4 g7 F( e# F1 D4 @
/////////SR常量-------------------% t+ l" k% I# B# w3 F: {' z" H5 |
const UINT   WM_RECOEVENT = WM_USER + 3333; //触发事件产生的消息。
# R! _$ R: B: f: v8 yconst DWORD   SR_INPROC = 0x0000; //独享类型的SR.
- k) ~0 U7 ^: cconst DWORD   SR_SHARE = 0x0001; //共享类型的SR.
& ^+ }/ t, B9 b& A# |
4 u; I6 E7 P5 _3 n0 \2 I//以下常量仅作例子用。6 b% W7 i) d6 K8 c
#define VID_TopLevelRule 9000   //顶级规则ID
% L' \4 a; J! N3 w3 k5 K- j#define VID_SubLevelRule1 9001   //子规则ID' q, I& ]! b* {, w  q
#define VID_SubLevelRule2 9002   //子规则ID3 h" k' K1 k" a5 @
#define VID_SubLevelRule3 9003   //子规则ID
! ^( \  _+ N" d2 h) b' {4 A0 E0 }1 G/ [1 C; r& n* N8 j

0 T3 a2 R7 Q9 Y  r  I6 ?# u/ F//*************************类声明************************
$ s7 a- G) [7 x4 P4 P9 E8 z2 w
- }+ i6 o' A* T/ e: d5 X- X- K' o" F
class CSR;
# c4 P& @+ X# R& O# |9 Z///////////////////////////////////////////////////////////////////////, A+ @0 E! _% O9 T; c6 [
///////////////////////////////////////////////////////////////////////% l0 u3 c! S* ?
/// w( q0 ]8 B# _$ S' Q
//         CTTS0 p6 u) _" m/ V, l) D. N: N4 S
//4 _' y5 [- f6 H; ^. E% E& Y: h* S
///////////////////////////////////////////////////////////////////////
. I4 w- t0 `+ ]3 y( p6 W* c2 m; O! c) R* H///////////////////////////////////////////////////////////////////////4 t) ~4 K0 b( [7 L* i5 K7 Q
: u- ]7 B' R! N0 f* d* ^1 g
class LANE_SPEECH_DLL   CTTS
; u$ S/ ?# T( S1 [* M2 _{
6 p# v- n! y( N4 Y: Gprotected:6 i" K) b, Y! C: H& |; T# {
HWND       m_hWnd;     // 关联的窗口句柄。
6 L: G8 n0 W0 E% j# d9 x3 V. n# E& ?$ |2 [" t& K" ]
CComPtr<ISpVoice>    m_pVoice;    // 声音对象的指针。
/ Q# t1 k( G+ M, s$ i( k( `CComPtr<ISpObjectToken>   m_pToken;    // token对象的指针。  D; b7 \7 U9 n2 q" J
CComPtr<ISpAudio>    m_pAudio;    // 音频对象的指针。(用来保存原来默认的输入流)# {! v# H* e1 a8 A6 O) V  E* ?
CComPtr<ISpStream>    m_pOutputStream; // 输出到文件的流对象。
1 I+ F) _3 h5 U' d. `- T" }" j6 t! o! W% B0 Y! R4 K
public:  l4 [+ l, z, D- I" e
//********************************初始化部分********************
. n+ l( H2 ]& W  q
  T6 P4 [+ X+ L////////////////////////////////////////////////////////////////////. a0 g( O: Z( H" B
//功能: 保存与识别引擎关联的窗口句柄。8 b' q5 s& L3 _- u
//参数: hWnd:要关联的窗口句柄。
+ x: y* X6 E+ w//返回值: 无。* x5 Z, z) H+ c8 {
////////////////////////////////////////////////////////////////////( H) c. o3 |. _& ~5 r) V+ z
CTTS ( const HWND hWnd );
0 V2 V) A9 t, p0 V+ V! \* l; z+ q  |% f, ]3 B0 v3 F
////////////////////////////////////////////////////////////////////
( Z0 k& e$ e2 G//功能: 释放所有的对象。! Q2 H- }, e6 Z# N7 p% h& w
//参数: 无。
7 {5 {! R* k. n# n//返回值: 无。
( h. x: `( \! C////////////////////////////////////////////////////////////////////
6 [! p1 m- X- P~CTTS ();  p& F' d% e- b2 ^3 v7 X* L* u3 @
! A2 j' y  l( o
////////////////////////////////////////////////////////////////////4 J3 ?( j" u, `3 _2 V+ B9 @
//功能: 建立一个voice对象。设置要是别的语言种类,消息,通知事件。
" M) ^' P2 [+ @2 b//参数: dwLanguage:要朗读的语言种类,SP_CHINESE为中文,
" w3 `; l& G2 @  w//    SP_ENGLISH为英文。3 a$ M, Z5 a* L) S+ S2 }9 a9 \
//返回值: HRESULT类型。9 y5 L  I6 V! e+ V2 v" D6 W& q* ]# o
////////////////////////////////////////////////////////////////////: d# L& N) K& A7 k* n2 B& ~
HRESULT Create( const DWORD dwLanguage = SP_CHINESE );
& |) f3 N9 T! y- H% F- N8 ?' X3 w  g9 Q1 R6 k
////////////////////////////////////////////////////////////////////
1 d8 g6 H& r* U8 j5 S//功能: 从一个SR引擎建立一个voice对象。设置要是别的语言种类,消息,
+ D* q6 v& m! f9 l; F//    通知事件。( w7 z& C( Z) ]2 @% [2 L  L1 j
//参数: pSRContext:SR引擎的指针。dwLanguage:要朗读的语言种类,# Z  W* I6 k& F6 [# p( l6 h
//    SP_CHINESE为中文,SP_ENGLISH为英文。' X4 x% `5 V, W: f
//返回值: HRESULT类型。
6 |$ u5 |: ^) E3 c////////////////////////////////////////////////////////////////////( ~; V: C* n" `' y3 V+ \/ |
HRESULT Create ( const CSR * pSR,) n' Q7 N* I0 F) i+ T, }
       const DWORD dwLanguage = SP_CHINESE );0 O5 y) Z$ t! d: x% z& _  X

. S: \9 O- o' ^, q& g
* q# ^6 r* s9 y: P! T9 @( U//********************************设置部分***************************************9 H9 F# P" D" N4 P! ~

' n3 y& n, q9 P  p: E% Z) \+ z5 D////////////////////////////////////////////////////////////////////
- m/ |7 J4 G9 ]//功能: 设置朗读声音的语言种类。: w& ]* b/ L6 e7 X& x* T1 H
//参数: dwLanguage:语言种类。SP_CHINESE为中文,SP_ENGLISH为英文。
5 B5 [2 }+ u7 C0 f5 ~5 h0 I2 F//返回值: HRESULT类型。
) W: F& A) ~0 k  K! G; w4 u////////////////////////////////////////////////////////////////////. v5 `, F8 q% K! i5 N8 c
HRESULT SetLanguage ( const DWORD dwLanguage );
( Z0 b; M- H  g6 n( z" n
1 i, m1 a3 h& t' x# D////////////////////////////////////////////////////////////////////
5 a' w7 r, v! \  P, ]//功能: 设置要处理的的事件。
) D- o9 j4 m* r/ x) o//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,0 m6 m! n" I3 x  i# A  t7 c
//    设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事
; [" P4 g. I# I//    件都会收到通知。
2 d$ r# n; O1 h1 ~//返回值: HRESULT。
% d3 S+ }' |3 \3 M) o  |! p////////////////////////////////////////////////////////////////////
" S# R  g/ s$ h$ A, ~HRESULT SetInterest ( const ULONGLONG   ullInterest );
( _* \9 }& F, o, J1 T$ [- u" R9 c' _. J
////////////////////////////////////////////////////////////////////# L1 L8 a$ E: a- z1 n
//功能: 设置朗读声音的音量。. R% s2 k) f9 K  f" N6 W, e& |
//参数: usVolume:音量数值应该从0到100/ {4 M+ m6 ?# T. Y) g
//返回值: 无。
: }, q) y8 _9 z' ^7 P////////////////////////////////////////////////////////////////////
5 x, T( Z4 J& V/ u5 i6 h6 p  n: svoid SetVolume ( USHORT usVolume );( k. T8 @  \, z' y

: s- j8 `8 u0 w; y; s6 O9 O////////////////////////////////////////////////////////////////////
- d& y* f$ q2 E//功能: 得到朗读声音的音量。
- {8 s1 Q5 b* b. X% B! V//参数: 无。; N8 u8 n9 `# x/ b9 u8 \
//返回值: 音量数值,应该从0到100。& g' k8 o6 c: R8 u4 [: U
////////////////////////////////////////////////////////////////////
, h9 e% X, c$ l6 M! ZUSHORT GetVolume ( );" t! L& @4 h. D' \* f* V

- v4 b$ x5 \( S4 z$ ^$ {////////////////////////////////////////////////////////////////////
* C0 p2 X0 J3 s1 ]//功能: 设置朗读声音的音速。
) b( c$ F" u3 K( d1 Z; z//参数: RateAdjust:音速,参数范围从-10到10。# l% H) U( V& R; M" X! `# C; H
//返回值: 无。
# C& U. W2 U. w, J" B; G! ]/ |////////////////////////////////////////////////////////////////////% e1 g4 {: p3 r5 n
void SetRate ( LONG RateAdjust );* n& K! K# V0 @! z, z" U

9 C* @( x* D4 B" p9 X, B: j////////////////////////////////////////////////////////////////////7 e4 Y& |9 _$ @6 d- [+ T
//功能: 得到朗读声音的音速。. A( B- a6 v! F- h$ T! j$ u
//参数: 无。& q: M& p! [. F: Q9 {$ a4 [- O
//返回值: 音速,参数范围从-10到10。9 L, ?1 Y! D9 v+ I
////////////////////////////////////////////////////////////////////
( D$ c$ ~* m9 L$ L5 p- vLONG GetRate ( );
/ O: T7 j, o+ \, R# r  ~2 H* T
9 Z- G. f# W# ~////////////////////////////////////////////////////////////////////1 L2 T/ }9 z; D6 {' X: a! w8 Q
//功能: 设置朗读的声音流到.wav文件,如果不调用此函数则默认从音箱输出。
$ m2 A3 a* f1 O0 _* T6 i' X//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。  T: a9 T% h1 _! D, B# N8 ~2 a
//返回值: HRESULT。. f  z9 A' }4 v3 L7 p
////////////////////////////////////////////////////////////////////( N6 l, I: Z" n
HRESULT SetOutputWithWav ( const WCHAR *pszFileName = L"TtsOut.wav");
# ~; |/ z, _' Z- t" w  [1 P% N# b$ i& q( ?
////////////////////////////////////////////////////////////////////7 c! H9 F3 o) P, a; Y. e. P
//功能: 设置朗读的声音从音箱输出。
; v( l0 u8 [( w" g9 a* [4 b//参数: 无。5 Z; M; d- @, J. ?3 Z
//返回值: HRESULT。
+ Q1 h4 {, }2 V4 b" s1 p4 o" a////////////////////////////////////////////////////////////////////
( u* W' N- O0 tHRESULT UnSetOutputWithWav ();
- N9 [6 B- ^; d$ K
) j# ~# w- F( Q- Z. q
* U" n8 Q1 m. n- m; \8 ]# V//**********************播放语音,文本到语音转换部分*****************************
# d  u. l  q) R3 Z8 d$ x+ S
! X/ f7 ]. F0 K2 e2 r. M  y////////////////////////////////////////////////////////////////////
- Z0 {2 N; M% _7 j3 T//功能: 停止朗读。如果朗读为同步方式,则不能停止。
8 C; ^8 s! x5 T0 _/ q: M! y//参数: pwcs:要朗读的字符串,需用" L"" "转换,可以是包含xml标记2 r9 G! n. z5 g
//    的字符串。dwFlags:朗读方式。SPF_ASYNC为异步,SVSFDefault为同步,
; l: A7 `5 X$ K& c3 K! c) \//    SVSFIsXML为朗读带xml标记的文本。, g4 M9 g* n) j& \4 F3 V
//返回值: HRESULT。
8 _8 E* @# h! V% o- `5 M7 U////////////////////////////////////////////////////////////////////
5 N& A+ h  X2 D0 B* HHRESULT Speak ( const WCHAR *pwcs, const DWORD dwFlags = SPF_ASYNC );
) l3 ~4 B; B, q! G  q3 h" B9 E6 `; B7 \8 ~% f6 J
////////////////////////////////////////////////////////////////////
& ~! ]- T3 _! x- C# }6 N, ^: ~/ ^! @//功能: 停止朗读。如果朗读为同步方式,则不能停止。
4 n2 a) `9 g3 {- B; W//参数: 无。+ y* u" O  B. R1 I. B/ f
//返回值: 无。8 Z4 @. j) U: _) M& k
////////////////////////////////////////////////////////////////////2 n( m7 y2 K. e; U+ o
void Stop ( );9 x6 k; p" r# v

1 F( L9 u$ H4 t0 A* z5 F////////////////////////////////////////////////////////////////////7 f1 |; Z% x* V
//功能: 暂停朗读。如果朗读为同步方式,则不能暂停。
1 b* X2 {% C+ @//参数: 无。4 Z  i0 O5 K, O4 d' \2 w
//返回值: 无。
3 R% k6 F6 K9 A8 k, D# T////////////////////////////////////////////////////////////////////
/ Z: v* ], S4 N9 }7 B' D: Uvoid Pause ();$ l7 w% h% R6 ~% O4 L& ?. J

9 H0 U# P$ r: {0 \////////////////////////////////////////////////////////////////////
" J4 R$ ~; ~& u& i7 M* d5 O" W! S//功能: 从暂停的地方继续朗读。
& V' [! \& Q' U3 B* T' D7 O3 t  h& n//参数: 无。. F6 \+ d5 J1 J
//返回值: 无。$ K" A. d+ j& g/ U! E+ i
////////////////////////////////////////////////////////////////////1 T7 C+ r. _, U/ E: K- }
void Resume ();+ o- }6 y; }5 d( g1 V. @8 M8 b% [

# U6 a: C$ Y2 c1 e: Q: A4 B1 I% f0 c  D4 C2 g' f
//********************************处理事件部分***********************************
  W& u8 R3 N: Y5 ]( X5 S
8 P% W$ ~$ l" T  Rpublic:
( @% ^5 p1 H, u) T+ _////////////////////////////////////////////////////////////////////
2 a5 }% B! n+ F+ {2 x7 z/ x//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。' e4 J3 o- ~, R* c: {, F" _) A% P
//参数: 无。. N' v* I6 e7 S$ i0 a/ m/ m
//返回值: 无。
/ h5 F2 ?' q4 J% p6 j; E/ _////////////////////////////////////////////////////////////////////
6 x& ?! J0 B' Z9 t% e+ g9 ]void ProcessTTSEvent ();
( `8 J8 Y  G, k$ d8 C9 x
6 S  ]8 b/ F. l2 X3 N6 W3 N, ~  x' j6 M& f
////////////////////////////////////////////////////////////////////5 L! S. {5 N9 a
//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。' O$ l, u  M6 l' H6 a$ {5 t
//参数: 无。; }. f. \, B7 O! X0 w% O9 T. n" x
//返回值: 无。  y) L2 E, @3 k  |9 O# _* S. p
////////////////////////////////////////////////////////////////////
5 h; [1 P7 P/ N/ H& s  q  C$ ivirtual void OnStreamStart ();( }3 X. \! ?0 P/ i, {* Z/ X8 ~

4 `: T0 p- z, z0 v" Y3 `% c/ L////////////////////////////////////////////////////////////////////
! d5 G  t) C4 A$ B* E//功能: 为虚函数。当输出流结束时要触发的动作,需要在派生类重载。
& @( ]0 M( b! m- j0 H( ?//参数: 无。
, o5 D" p# s  C//返回值: 无。  y* {, {8 ^# [4 x" i* K' M/ [& w- _
////////////////////////////////////////////////////////////////////. E- j8 d! k; d2 @, J$ h8 Q$ ^1 e3 M
virtual void OnStreamEnd ();
) O/ v) D5 V0 `; n( E};
2 S7 P  ~; g5 j2 Y: m
' h7 u% K' `! p' B# J" |7 T* M' a* R, ~. c1 t
///////////////////////////////////////////////////////////////////////
) {5 ]! B  d1 g( q9 |///////////////////////////////////////////////////////////////////////. |! b/ d* P& b& W
//         CSR( j" n$ }* ?+ @4 w6 I9 \1 q! T" |
//
( G1 C, s8 v9 p///////////////////////////////////////////////////////////////////////
2 j  N0 u6 Q" c3 `//////////////////////////////////////////////////////////////////////// n; y& R$ }% F- |5 R+ V
9 Q  j, O9 W8 v
class LANE_SPEECH_DLL   CSR7 t- d  t# [8 \* `
{
! [  @9 n& [* K& p
7 d4 k% l: f) I9 c- sprotected:
. Q$ r8 o2 P4 }4 ]. p4 BHWND m_hWnd;
, V6 o& m/ t' I- {& T
, O9 m  Z) u5 F! [# F7 D$ c4 wpublic:
* Q% j0 `, b; B' ICComPtr<ISpRecognizer>   m_pSREngine; // 语音识别引擎(recognition)的接口。
& y6 O+ |, g3 {5 J2 ^! g2 zCComPtr<ISpRecoContext>   m_pSRContext; // 识别引擎上下文(context)的接口。
- `0 p' d3 ?/ aCComPtr<ISpRecoGrammar>   m_pSRGrammar; // 识别文法(grammar)的接口。- A! ~# ~7 v" H' E
CComPtr<ISpStream>    m_pInputStream; // 流()的接口。
8 k& u6 s) H! M+ r# ^9 U4 \) VCComPtr<ISpObjectToken>   m_pToken;   // 语音特征的(token)接口。. y# w; U3 c8 v1 n
CComPtr<ISpAudio>    m_pAudio;   // 音频(Audio)的接口。(用来保存原来默认的输入流)
/ `: N6 j2 d( M0 }public:5 I$ q- R6 n6 Q6 G7 A+ i3 H
static ULONGLONG    ullGrammerID; // Grammer的标识符, 64位无符号整型 每建立一个Grammar,加一。+ ^# n) w5 f7 b; L0 S
  C" R' M3 v, O+ s5 s) d# `
, w  T8 {% B2 ~, t3 @  T
protected:
; a$ z4 K$ `4 o  v) B//***************************辅助功能部分****************************************. z# S: p% M; ~7 o

5 r- Y2 ?0 W) a0 e$ _3 \) {////////////////////////////////////////////////////////////////////( E) _1 M! C% b' w! c
//GrammarID加一,每个GrammerID必须不同。
7 L6 ~* D, X; X! ~. s$ A////////////////////////////////////////////////////////////////////
0 M0 U- O8 b+ ]$ ]7 ^static void UpdateGrammerID ( );
' F9 V5 t( G% u& u# I: p3 |' t: e6 S& B

  V4 M+ f- N' Lpublic:
" {2 m8 B, J$ O8 H////////////////////////////////////////////////////////////////////; W; o' C0 k  v. ?0 `
//功能: 友员。TTS中的从SR引擎中建立voice对象。
! }0 E6 O1 m3 W# k//参数: pSRContext:SR上下文对象的指针。
: s, i& l9 _' h4 |6 S//返回值: HRESULT类型。* g! E* F" A6 j9 T* V" z
////////////////////////////////////////////////////////////////////5 H/ N" O& m& ?4 V
friend HRESULT CTTS::Create ( const CSR * pSR,
) l3 W9 c2 H+ j: J& t$ m          const DWORD dwLanguage );
: p% U7 {$ t8 c& S6 D" L! @' ]5 {
. v) u1 d8 Q5 K
0 Y3 |) m( I) k* [% K5 i/ ~0 |5 u//****************************初始化部分*****************************************
+ V, _: K1 o# S1 n) p; q9 E) ?  w/ ^8 u! ~
////////////////////////////////////////////////////////////////////
' ]. \- E% z& y//功能: 保存与识别引擎关联的窗口句柄,更新GrammarID。6 B; m3 B" |+ S
//参数: hWnd:要关联的窗口句柄。
" P8 ^& n$ B/ `! E1 H//返回值: 无。7 v" Q% F9 C2 k, X) y5 M; f( p
////////////////////////////////////////////////////////////////////+ y1 ~) }- V& w' }! J
CSR ( HWND hWnd );
, g' ?8 U/ R! y6 _2 X, T4 N2 h& \. \0 `: a
////////////////////////////////////////////////////////////////////
! }% ]: c% @' d/ @" S  N! I/ V//功能: 释放所有的对象。6 n) p3 }. P  F- G
//参数: 无。
: A( c7 w4 n! v% v& v# F//返回值: 无。  h0 h. x- Q8 Z( l; y& l) Q/ N
////////////////////////////////////////////////////////////////////2 s8 A! \& |/ W# u! [6 C
~CSR ( );% [2 H: K3 p) F5 G" Q6 K) Q

- F4 }" Z0 D% ~/ p0 Q9 \( }$ e////////////////////////////////////////////////////////////////////
8 h8 p0 ^4 o- z& [$ Q" p% F) l//功能: 建立各个接口的对象。设置要是别的语言种类,消息,通知事件,% ~  p6 _& \9 P  |8 a+ g; J: \
//    加载文法文件。8 f3 ^8 f! P, c1 S, B
//参数: SRType:识别引擎的类型,SR_INPROC为独享类型,SR_SHARE共享类型。" C/ T& R  r' |+ f
//    pwcGramFileName:文法文件的文件名,要用" L"" "转换为WCHAR型。
& g' `1 I5 e" u( m8 |//    dwLanguage:要是别的语言种类,SP_CHINESE为中文,SP_ENGLISH为英文。
' e( M( [& n3 T2 z2 M//返回值: HRESULT类型。
# q( Q! m% A2 O% b4 t////////////////////////////////////////////////////////////////////
7 ]6 J3 m1 |3 z, c0 lHRESULT Create (const DWORD   SRType,
) K4 O8 j' [$ G. x9 ?, q      const WCHAR   *pwcGramFileName = L"grammar.xml",
0 C  q) q/ \; Q5 ^- [      const DWORD   dwLanguage = SP_CHINESE );7 _1 X. d" L" }/ {; f2 B0 t

4 C# D0 P7 C* M1 I5 `" A9 D' f! Z4 G. z/ w8 d0 g
//**********************************设置部分*************************************, l) m6 c( H$ M1 v

% M# m. a+ e- U////////////////////////////////////////////////////////////////////! }1 J7 M4 d  x+ f) ^4 F
//功能: 设置要处理的上下文接受的事件。
1 m9 B! L3 \* w) q% Q& W. U4 Q//参数: ullInterest:来自enum SPEVENTENUM,要用SPFEI()转化为64bit的,; D, I7 Y! H' y8 C7 e/ ?( h
//    设置多个事件用运算符" | "。 用SPFEI_ALL_SR_EVENTS表示全部事
, ?3 y: r- b3 i6 S//    件都会收到通知。
; q0 E7 x! E$ p! y, r7 I& p//返回值: HRESULT。& e( m$ E7 P! u5 n
////////////////////////////////////////////////////////////////////
9 P+ J9 k  l1 EHRESULT SetInterest ( const ULONGLONG   ullInterest );& H& A1 n( I, I( Z) k3 N% Z" U

  `; M9 i7 D3 L- l9 Y% ]9 k////////////////////////////////////////////////////////////////////7 T' ~1 n. e% l  v
//功能: 设置某个规则的状态(激活或者取消激活)。
5 |- @2 R1 o" o. g( ^( F//参数: pszName:规则名,要用" L"" "转换。bFlag:TRUE表示激活,! o. H: i. M. \5 Q
//    FALSE表示取消激活。' `. X  ?8 C; e6 o
//返回值: HRESULT。, G$ N6 c% O' j
////////////////////////////////////////////////////////////////////
2 s, D" b; r4 N6 F# rHRESULT SetRuleState ( const WCHAR   *pszName, const BOOL   bFlag );
* k& \5 h* r& D1 a2 l) d3 l6 H( F) G( `9 p. Q- B* Y, H
( v* f: w7 g9 R
////////////////////////////////////////////////////////////////////7 ?: {1 W$ D8 w* n
//功能: 设置识别引擎从.wav文件识别语音,如果不调用此函数则默认从麦克
3 S" o4 l+ V+ t* \" G; G0 H//    风输入。' t4 e4 j& {; R
//参数: pszFileName:.wav文件的文件名。要用" L"" "转换。
1 y& H- r) J7 J2 T/ k; a//返回值: HRESULT。7 ^  X9 o  N( W  {. I
////////////////////////////////////////////////////////////////////
* j; ?# @  w( r7 L! m! N+ I1 GHRESULT SetInputWithWav ( const WCHAR *pszFileName = L"sr.wav" );
  P- h" N5 H' F( r' s# c/ W
, d% Y7 O' G; O1 Z  p7 o////////////////////////////////////////////////////////////////////3 H  w& J) [* j; a8 L& C  c
//功能: 取消从.wav文件识别。恢复从麦克风识别。3 ^  ^1 ?  }% P' J8 f0 Z6 V9 _" U
//参数: 无。! N& g- u' v# z+ h- v5 s  U) I
//返回值: HRESULT。
- V% S6 V  R( \1 n////////////////////////////////////////////////////////////////////! ^7 g9 Z1 ^/ g, _
HRESULT UnSetInputWithWav ( );; A! y2 o1 C+ _6 X, v6 n

, ~; ]$ E1 c- F: Q) n+ O0 e6 F! o3 }//***********************识别开始,结束,识别结果的处理**************************5 K% X$ q8 `' O/ c
) X: `$ h7 W1 E4 \, q
////////////////////////////////////////////////////////////////////
% N8 v& I4 r- A) K//功能: 识别开始(将所有规则激活)。( E7 H5 q- m9 j+ ^
//参数: 无2 v/ j3 u6 K5 R
//返回值: 无。- @2 W3 d6 |! r( U$ ?
////////////////////////////////////////////////////////////////////# c) ~  K4 j( p' Q
void StartRecognize ( );
- W+ t9 E0 m( |& X: L
0 p+ g. K: `1 C# O7 f* `6 C( p( |////////////////////////////////////////////////////////////////////
: p7 ~: D  v, C! T2 ^//功能: 识别结束(将所有规则取消激活)。# s' O* [+ G% A6 g: M8 h
//参数: 无。
  n! I! E9 p( ^: T//返回值: 无。9 X; {7 y8 b! V, {
////////////////////////////////////////////////////////////////////+ ^: M7 c) ~0 ]+ R# g( B3 y
void EndRecognize ( );; R3 ]5 r# I# O; Q! _2 q& C, l
5 C# G: C' R' r6 x4 {0 O
public:
" j4 R9 q5 X9 U3 r% L2 j$ w; I////////////////////////////////////////////////////////////////////
( m5 N- ?- d6 h. y. p! }* x//功能: 处理发生的事件。系统自动调用,不需要用户自己处理。9 c, N0 O5 c& W" c2 O7 k
//参数: 无。
4 c% a, }" A8 n$ X  z# M//返回值: 无。
3 U) ~! l6 Y, [  f# e% a2 a////////////////////////////////////////////////////////////////////
' E7 r( l, h7 ^: R! {void ProcessRecoEvent ( );# r1 g$ N+ p& r- N% t: s, \9 H

. `# `, N1 E7 M4 R, M4 w: W9 Gprotected:  V: {/ I+ Q+ L! f* ~) p3 G7 N
////////////////////////////////////////////////////////////////////: w  S+ T* c* v5 m
//功能: 识别成功时要调用的函数。系统自动调用,不需要用户自己处理。
, f3 z: q$ Y1 @& a8 F+ f//参数: pPhrase:ISpPhrase类型。
1 C! H6 f& ]5 C& e5 N; l/ m( E. N( i//返回值: 无。
* k  G, X4 }3 {////////////////////////////////////////////////////////////////////
5 E' p1 O( @6 \6 bvoid OnRecoSuccess ( ISpPhrase *pPhrase );
& F: V. n" p' ?1 o# U* j8 T& o; z2 V, L3 J* U4 N
public:, F) [: p2 i! ]1 _- ]: o
////////////////////////////////////////////////////////////////////
/ ]5 m, ^! }9 B' O//功能: 识别成功后,根据规则的ID决定动作。系统自动调用。虚函数,1 H* q" K* a3 h
//    需要在派生类重载。规则ID必须以常量形式预先定义。8 g; ?6 a: c- ]- X8 Q% T
//参数: ulRuleID:顶级规则的ID。ulVal:子规则的ID。
0 [' B7 {- f4 \& u5 c. L& \//返回值: 无。
$ p; e$ q" b4 N////////////////////////////////////////////////////////////////////$ x, S+ R# R8 O4 X2 l, K
virtual void ExecuteCommand ( const ULONG ulRuleID,
) ]# O# Y$ R2 k/ _2 Z) E          const ULONG ulVal );4 d' h8 F; Q# I$ {9 K5 a9 }+ f+ V
) l- t& _4 }0 ^6 g' Q# ^" j0 S
////////////////////////////////////////////////////////////////////
' v2 ~% G! {" `! a0 q3 `//功能: 识别失败时的动作,系统自动调用。虚函数,需要在派生类重载。4 o' r3 s  d0 N& B
//参数: 无。# m2 s4 [6 U! ?8 S: z  s
//返回值: 无。% a$ z: q9 p# l( V; a) L# Y
////////////////////////////////////////////////////////////////////. z% I. L/ Q# c$ M# X
virtual void OnRecoFail ();
0 t5 Q  a" l7 K
4 v1 m% i- g  G7 O////////////////////////////////////////////////////////////////////
# h3 _" g- |# Y//功能: 为虚函数。当输入流开始时要触发的动作,需要在派生类重载。
8 A  ~, [0 A; u9 R, c//参数: 无。5 O" `- C- f4 _' C8 u; e0 E6 E
//返回值: 无。
& Y6 d. o- v: w7 s) e////////////////////////////////////////////////////////////////////
; L7 ~" _, y9 z9 R# E+ M/ J6 qvirtual void OnStreamStart ();5 A9 a, d) p1 y6 L% Z& \" N; G6 s: b
, D9 b( f8 i2 K* f
////////////////////////////////////////////////////////////////////
7 X) P2 o# Z! ~//功能: 为虚函数。当输入流结束时要触发的动作,需要在派生类重载。
5 K: [6 A5 J1 F7 z8 n9 z7 V- w//参数: 无。% @- p% {0 o, M# I* ~# X
//返回值: 无。
7 x4 @' `2 Z" \4 x0 O) Q  u" |////////////////////////////////////////////////////////////////////
4 `8 c$ V( C$ vvirtual void OnStreamEnd ();% K/ D: s7 P7 _4 G4 X2 t3 e
, q0 z' D; I3 ]5 z, j& j
};
, g, }/ ^: ~2 A( J( v
$ p: @' R( f0 T3 @  x( p! m" c2 I8 ?& d* [
( n$ j2 T  \* p$ h' W6 }* l
#endif    //LANE_SPEECH_DLL_H  t! t) [" R* Q7 u9 s2 p1 A
2 }" E/ ?* |" P# ^  K
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+ {$ @: J8 A4 A/ J! Z4 A
$ d" \' E( H. }- b3 Q+ V" h. A
////////////////////////////////////////////////////////, t+ H' o6 |; G
//
9 Z0 s1 p4 z: I: z4 F// 文件:LaneSpeech.cpp
9 K  w" F/ P# w! I7 s2 r// 功能:封装的speech sdk5.1 的文本语音合成(TTS)和语音识别(SR)功能1 F( ~( p! T5 y
//    语音识别只支持命令模式,不支持连续模式
5 h1 P/ Z6 O) o% o/ m// 作者:吕宝虹(Lane), msn: lkjx82@msn.com, qq: 3619908
5 ]. c! X; p* G3 F// 日期: 2004.10
( g2 a2 J  k- J! w! j// 版本:1.2
& ~- C5 Z8 o0 K" t. i& y//
0 d3 q. k0 n8 q5 M) _- V( X//# {; l* X: N! {
////////////////////////////////////////////////////////8 R$ N6 C) ~- v8 Z

: _- a" T  f* J- V3 B8 p2 B) a, f* }8 a
, J9 _% J/ M  e5 g5 e  t& S3 Z
#include "LaneSpeech.h"/ X2 F# f; F% M9 u7 f% K

. ]4 l4 ]* ], C) i! \0 h( n5 a//-----生成动态连接库和静态库的处理----------------
. I% s0 {: }/ x3 }9 z3 d) |#ifdef USE_SPEECH_DLL //定义了USE_SPEECH_DLL,就按生成DLL,声明导出导入类5 @$ p& G. E, p% }$ G% l  G

0 ?. [) c4 M# K+ @BOOL APIENTRY DllMain( HANDLE hModule,
/ d( Y& @6 I0 u' y( d2 I+ t                       DWORD ul_reason_for_call,
* t! f! M6 [( b" V, i. O; F                       LPVOID lpReserved8 m! ?4 B6 A: @7 L
      )' H$ M) E4 s  ?& o4 \
{
9 |9 O+ Z; F% j! i; j& w, @    switch (ul_reason_for_call)! p& S& @/ `1 ~* m
{
! b4 e  n# d: s, K8 v9 ~: Q: Z   case DLL_PROCESS_ATTACH:' {3 z3 z. I+ T  @$ g! ~
    CoInitialize(NULL);8 Y0 z+ a8 D) f6 Y
    break;# B/ n- W5 c2 x1 M: R9 \  W
  9 p. \1 _1 u6 T' ^- f
   case DLL_THREAD_ATTACH:! i  |% B5 \# j/ @. e5 D6 j
    break;6 N- c1 _6 H$ o5 T
  
2 B( ], _1 f5 r2 O   case DLL_THREAD_DETACH:
; z4 Z3 G+ d' Z& F' q9 o, ^    break;
# \5 o9 F  r9 o( P7 x; B  ! F" x# b- ~- {7 r# f4 d
   case DLL_PROCESS_DETACH:
8 C# m' j" F  A8 n0 N5 @3 }, T    CoUninitialize();; p! u% @. v3 B2 O5 N$ L
    break;% ?8 R/ H( _& V
    }5 n# G0 _- b4 S
    return TRUE;
0 u+ d. ^2 T6 d% ], {! V- V1 J# P}
2 _- r0 e% C3 Z% \% k( ~
$ x& x1 R* E# M: e* T- h$ K#endif //USE_SPEECH_DLL
7 d7 U* L( Z3 e5 r- g! Q8 s  e" g* P' k: W8 J# ^

& `- P( g8 u7 G; p/ l+ Q, r2 ^+ _
: G4 M6 G- R+ V+ {( d///////////////////////////////////////////////////////////////  d' A8 D$ L  G$ g

+ `* _1 V$ l) Q+ l6 g8 W8 `////////////////////////////////////////////////////////////////////
8 V% W/ |& ?* S2 B//功能: 弹出一个信息框。
1 G. `" Z: ^/ x" f8 _//参数: lpText:是对话框信息。lpCaption:对话框标题。
# o4 @5 f& l+ g/ x9 O9 C! R7 J//返回值: 无。
- \, f0 z7 h( Q////////////////////////////////////////////////////////////////////
- \. w5 ], M% D# W: J# ainline void ShowError ( const LPCTSTR lpText = "ERROR",. h9 b9 f1 o' i
        const LPCTSTR lpCaption = "ERROR" )
" f, r/ m  n8 K{7 x5 ?$ J6 @. T) e# u) \  Q
   ::MessageBox( NULL, lpText, lpCaption, MB_OK | MB_ICONERROR );
; F$ F. ^0 X& S+ K+ f% `  l# {}! Y/ @- h& ~6 ?0 A
0 y+ X' ~' h4 `! E  t# M& [
////////////////////////////////////////////////////////////////////
% n2 Q" Z0 }4 y//功能: 检查一个HRESULT类型的值,如果是错误的值则,弹出信息框提示错误。( A1 h' {/ U+ h9 q6 D& T
//参数: hr:要检查的HRESULT的引用。 lpText:是对话框信息。0 G8 J- E, r  K/ T6 m$ V/ E4 J. M4 G3 w
//    lpCaption:对话框标题。
0 k$ E( A$ ?8 ]) m# m' I$ T% s//返回值: 有错则为FALSE,没错则返回TRUE。
: z. U" r2 P8 ^1 }- Z////////////////////////////////////////////////////////////////////8 f0 v. z4 e* f7 C0 `
inline BOOL CheckHr ( const HRESULT &hr,8 y' H4 J: X& ~0 B5 z# e/ t1 f6 ~
        const LPCTSTR lpText = "ERROR",
$ a+ J' k! T  h5 ?9 L: b7 ?1 X; m        const LPCTSTR   lpCaption = "ERROR" ), l& _) N6 r( B2 \: L) E, H+ ?1 {
{, o# q) b* d% R/ u) I- ^
   if ( FAILED( hr ) ) {
9 \, v3 ?$ T3 `) y: U# }    ShowError ( lpText, lpCaption );" b% V/ m  M7 J! H
    return FALSE;
9 q2 m5 c3 t7 f3 W# y6 c   }- z$ K2 q6 O+ P# Q4 V; _! N
   return TRUE;. O$ \$ L; P9 u+ S# D2 P* A& D
}2 F" A. d% O  q3 r$ }- t; V/ A$ G

) f, A: x" x7 b
. _) O5 C8 s; d) `! E2 j///////////////////////////////////////////////////////////////////////6 Q' C' P0 Y8 n) H1 B1 F
///////////////////////////////////////////////////////////////////////: q0 [  \8 ~% P9 |
//
, {5 m7 D! _6 m* i1 C0 O2 f9 d3 ]//         CTTS2 y& C7 }& Q% c
//9 J0 V+ M2 o7 L1 [
///////////////////////////////////////////////////////////////////////
- f) K) Y5 A, o( D+ F6 D% {//////////////////////////////////////////////////////////////////////// K& {# R8 R' H! r  B2 l+ d
+ d- q: k/ L* V& w1 ~6 r5 |6 j3 n
////////////////////////////////////////////////////////////////////
: }5 q' I4 p. t' g6 y# U$ H//保存关联窗口句柄。初始化COM。; b) d2 A0 j9 Y# M7 p# y
////////////////////////////////////////////////////////////////////
$ Z4 A9 a% A0 o5 j" ^4 b9 }2 R( PCTTS::CTTS ( const HWND hWnd )
" V. j- t! t8 A{# U# [, e/ Y3 U1 r0 T8 b
m_hWnd    = hWnd;
2 R: \- H: T% ?4 m  b2 {m_pVoice   = NULL;
2 h. L% w" s- D- {( C; K" Hm_pToken   = NULL;( Q1 j+ {0 y/ J3 R3 _
m_pOutputStream = NULL;$ I( M$ m& p; A0 D4 S
m_pAudio   = NULL;) ]5 H# {- [/ l4 C8 z
}7 c. J. p+ q* U* F$ o
; b  S& H8 m5 P5 @' I3 z% t& H0 m
////////////////////////////////////////////////////////////////////: {% y  K2 y; q# s
//释放所有对象。0 h7 X: B0 ?3 k  p: p2 j3 ~
////////////////////////////////////////////////////////////////////
+ B% H: {3 i5 ]CTTS::~CTTS ()# s3 `: v8 F1 O& H! S- ]( L
{
( X' V, n- B; m& i, zif( m_pToken) {
4 C1 w( w. r' U" O( ^8 A& @   m_pToken.Release();
! P" I5 {4 i% E* S   m_pToken = NULL;' Q* z# o  n, }# l' @! c! Q
}2 W4 E% U# Y0 F! M
if( m_pAudio ) {) K6 h0 J4 M2 k# d% E  o9 M
   m_pAudio.Release();) e3 Z. `, [  [: ~+ s+ m8 R1 a
   m_pAudio = NULL;
% g5 a0 y( P0 ]* g" i( y}! Z' x# ]; S, p) D& ?
if ( m_pOutputStream ) {7 l$ e8 g4 V# O# D
   m_pOutputStream.Release();
% A" v. r# S. i   m_pOutputStream = NULL;4 T7 B2 C2 _5 o: D( \1 a
}. B, Y7 i( k: e2 E+ e
if( m_pVoice ) {
# C3 h9 ?2 X9 ^9 E( e2 y8 B   m_pVoice.Release();
; ^0 h% z% f4 r4 z, @   m_pVoice = NULL;
/ E7 O/ a& m7 `+ X}
; D0 z" ?4 L/ B  ~}2 g1 ^, o- z- F8 L( n7 O8 B

+ B- U7 W/ S3 S) h1 a! h2 O////////////////////////////////////////////////////////////////////
7 ^1 A2 d2 j8 K+ M, f5 j//从SR的上下文中得到voice对象。此函数在CSR中被声明一个友员。: B0 m- Z; g( [) q% @3 u
////////////////////////////////////////////////////////////////////
% \7 ?/ v0 B$ S' THRESULT CTTS::Create( const CSR * pSR,
0 T3 ]4 ?6 P, H: H2 h8 ]& o  _       const DWORD dwLanguage )
) H. I' @; R  T{
9 Z' F, z9 Q# m1 [- z' `( U& vHRESULT hr;' H2 I5 h7 `+ S- j
hr = pSR->m_pSRContext->GetVoice ( &m_pVoice );
$ T: }3 {0 ~: ]2 {if ( !::CheckHr ( hr, "pSRContext->GetVoice()" ) ) {. B8 g1 G! Z! G7 e0 T& a0 C/ ?
   return hr;
% d1 ^, t" `* d7 L) J- w2 m1 f! W0 N4 r8 J}" _+ A- z; F6 K  w4 }( x7 [
- P# f4 u# W9 w: O) G& L; ?
SetLanguage ( dwLanguage );
6 v( N# x6 N4 z3 W. q9 x4 T7 T
- p/ J$ Z6 Y# f1 U0 mhr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );//建立一个默认音频流
7 w% s0 X" V! Q; f6 sif ( !::CheckHr ( hr, "CreateDefaultObjectFodd()" ) ) {8 n" r6 D# T+ T; ?, y
    return hr;
/ r9 V8 w/ l) }% }3 c}' o2 O. D/ w5 J3 K' ^1 e3 A

% ~5 _" \% w/ g' Z0 l- v//SPEI_START_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM% K" A( y& I3 @) R+ x. A# O
//SPEI_END_INPUT_STREAM 表示完成流输出。/ z3 a8 H9 ?+ p4 a6 b
hr = m_pVoice->SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) |
) v+ \1 u5 d2 g3 J  `5 E         SPFEI( SPEI_END_INPUT_STREAM ),
: v* w9 [- y. X  z2 Z            SPFEI( SPEI_START_INPUT_STREAM ) |
: G$ f4 Y! B; c! I6 d            SPFEI( SPEI_END_INPUT_STREAM ) );* {% D/ b3 t0 Y% C: R) \
if ( !::CheckHr ( hr, "m_pVoice->SetInterest()" ) ) {) @6 N) k3 y; B) i6 M! F% T" V
    return hr;" R8 `+ J) o/ z
}
3 b+ v& D3 x$ @- _* l
9 `: M3 ]2 G9 f9 V0 }" K& f//设置通知消息
2 T( B! H& P' E; i3 [hr = m_pVoice->SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 );
' N3 r. u+ E; e- T. hif ( !::CheckHr ( hr, "m_pVoice->SetNotifyWindowMessage()" ) ) {: M. D3 i+ U1 I0 j, S5 e( W  |
    return hr;
- J. N2 I2 ~- \( k! L; R& Q}
8 k8 {# O5 q" t0 _$ x8 s4 D" v8 `3 `5 [( _5 s) R% {( u" W; M
return hr;& u) r# \# ~6 I6 c) h/ m, ^0 q
}
" |* G- k; w/ N9 R' x. [* N, N: y3 X. ]4 W1 S5 j4 n& v: p+ X
////////////////////////////////////////////////////////////////////
3 T5 Z9 Q3 H* a+ \' G$ p//单独(相对于从SR的上下文中得到voice对象)建立一个voice对象。
$ a1 I. t& i8 B9 L# r# b7 v//并设置兴趣,设置通知事件。
: J. j( p* r' i6 a5 {- v( t6 Y% W////////////////////////////////////////////////////////////////////
& U+ O/ ~6 V+ B+ W0 \) I; L% MHRESULT CTTS::Create( const DWORD dwLanguage )+ o: V/ F+ _- ]$ w) \4 g; ]
{( A. G; v7 h/ X$ A3 q! R$ q$ _5 e
HRESULT hr;
: c; U+ i8 b$ R  x$ e( m  k- t4 Thr = m_pVoice.CoCreateInstance ( CLSID_SpVoice );
& T$ ~3 y: N0 R) C/ gif ( !::CheckHr ( hr, "m_pVoice.CoCreateInstance()" ) ) {3 u3 P; s0 j  |2 T& f& z. l* u4 }0 }
   return hr;) l! O; [4 M6 d& \% [6 |, l) Q
}3 o8 m* j: _: o- ?& u: s! b

. P; a: w3 f, |# E, J3 o  [( hSetLanguage ( dwLanguage );
% ^7 A7 y+ Q* V. r# u. b
/ B( l& j3 T! b9 z, s1 G8 O9 h. Khr = SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN, &m_pAudio );//建立一个默认音频流* `0 z. L2 D6 j4 A5 w
if ( !::CheckHr ( hr, "CreateDefaultObjectFodd()" ) ) {
# Y4 }0 ]" }1 u' g8 |# {    return hr;9 d% B; N3 `' f0 N
}
" ?1 @6 f- g5 `. n! n; a5 d
5 c4 Q7 T2 K+ n, l' {: b7 u//SPEI_START_INPUT_STREAM表示输出对象开始接受流输出SPEI_START_INPUT_STREAM
  a* {" w/ ]* I: u& x//SPEI_END_INPUT_STREAM 表示完成流输出。9 ~7 ]7 j% N) Z7 _
hr = m_pVoice->SetInterest( SPFEI( SPEI_START_INPUT_STREAM ) |' p4 A  x3 \  y$ ~6 m' M
         SPFEI( SPEI_END_INPUT_STREAM ),+ [. A' R2 e* \+ W
            SPFEI( SPEI_START_INPUT_STREAM ) |  \+ T* M; [3 g
            SPFEI( SPEI_END_INPUT_STREAM ) );& r7 r% K! P5 o4 k. a  u4 a& m
if ( !::CheckHr ( hr, "m_pVoice->SetInterest()" ) ) {: K# L/ O  R  t2 o- g% L, _0 ]
    return hr;
7 c) ~7 \/ F3 E; ]2 k1 E1 g6 ]}- c8 w$ q* |, `$ ~* l/ I
; j& w& ?% ^2 J! |! E1 L( r& V
//设置通知消息
+ `+ i: y& E7 e+ }" V% X9 c6 w" S8 thr = m_pVoice->SetNotifyWindowMessage( m_hWnd, WM_SPEAK, 0, 0 );
( z0 M3 Q! I, `3 \1 Oif ( !::CheckHr ( hr, "m_pVoice->SetNotifyWindowMessage()" ) ) {
" T. r) K) g, K( @    return hr;& U9 y: W6 [3 W' \) z+ n2 F
}6 D* z9 y# n! n. f: i: y9 r2 Y1 U
" b3 _% X5 r2 Y* B
return hr;, M# W. R& b% J. ?0 n
}
0 Y" e3 z- M0 f2 e; A
 楼主| 发表于 2011-5-23 17:06:27 | 显示全部楼层

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

第一个小程序
装好SDK后,我们当然要运用了,要不然我们装它干什么呢。我觉得写程序的乐趣就在于自己写出了一个能运行的程序,那种成功的感觉很好。好了废话不多说了,接下去就来写第一个能运行的程序吧。
1、新建一个Win32 Console Application空工程,在工程里面新建一个C++ Source File。
2、首先当然是包含头文件
#include <sphelper.h>//语音头文件
: Z9 f  a: E" o#include <iostream.h>//C++头文件,用来提示错误信息
3、然后是主函数
int main()
% w# l5 b2 i6 _" X# S/ _% U. ~, @{
6 N; W/ s5 ~; p  n. M9 D; ^    ::CoInitialize(NULL);//初始化语音环境
1 S- \' @! S( C- @0 z6 e    ISpVoice * pSpVoice = NULL;//初始化语音变量
) x' X' N% v, a, z/ v: l    if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL,CLSCTX_INPROC_SERVER, IID_ISpVoice, (void **)&pSpVoice)))  
    //给语音变量创建环境,相当于创建语音变量,FAILED是个宏定义,就是来判断CoCreateInstance这个函数又没有成功创建语音变量,下面是不成功的提示信息。
    {
1 p( ?0 a( s( z% S9 T        cout << "Failed to create instance of ISpVoice!" << endl; 3 g* Z/ u0 ^" c( Q
        return -1;
8 V; B7 T$ h0 h  s1 c3 H. X    }
; s; l4 s$ j0 I% [2 x
    pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);//执行语音变量的Speek函数,这个函数用来读文字。
    pSpVoice->Release(); //释放语音变量' @6 E" u5 R0 {8 D
    ::CoUninitialize();//释放语音环境

& O6 @  X8 x6 r    return 0;; v0 o* e( M0 V2 R$ P
}
4、第一个程序就这样写完了,运行读出了Hello World,是不是觉得很神奇呢,呵呵~~~~~
回复

使用道具 举报

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

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

VC6.0下开发Speech SDK5.1程序: o* g8 K) {( K, V& k

1 ^7 W  N% [2 n% j+ e1.首先开发得需要Microsoft Speech SDK的支持,以下是下载地0 `8 h! G4 j+ }
8 |: P1 y2 C5 b0 P2 _4 s
http://download.microsoft.com/do ... -US/speechsdk51.exe   3 c' C6 z" E4 X8 C# o
Speech SDK 5.1安装包 (68   MB)     
0 e+ M& |* u9 ~$ P3 L- Lhttp://download.microsoft.com/do ... chsdk51LangPack.exe      8 b* @! N( X* W" B! J% G: w
中文和日文语言包(上面的安装包只支持英文,如果要你的程序支持中文则下载此包)(81.5   MB)  
. U$ r7 N) d3 u/ r2 _# z+ Y" Z: o1 ^
2.下载后,执行安装
0 W/ f# i* j) Z# j- J1 E  Q" G$ c
下载完毕后首先运行SpeechSDK51.exe,它其实是个压缩包,不是可执行文件,解压时选择解压到的路径,然后,运行解压出来的可执行文件,默认安装路径为C:\Program Files\Microsoft Speech SDK 5.1。运行那个中文语言补丁包SpeechSDK51LangPack.exe,和上面的一样过程,这也是个自解压文件,不过这个第二步不需要选择安装路径,运行一下就行。
' L6 k0 S+ D' }; A8 @! n
# o: i5 g. D" k* @3.VC的环境配置
- k3 G" i2 v2 G" c& w5 K1 w# X; Y7 m% A5 A$ T
在应用SDK的开发前当然得需要对工程环境进行配置,我用的是VC6.0(其他情况类似),配置的过程如下:! P5 S: j  {6 k" G' \. F

- f8 L! R9 h  f* |6 S工具->选项->项目->VC++目录,在"显示以下内容的目录"下拉框中选择"包含目录"项,添加一项C:\Program   Files\Microsoft   Speech   SDK   5.1\Include到目录中去。再选择"库文件"项,添加一项C:\Program   Files\Microsoft   Speech   SDK   5.1\Lib\i386到目录中去.
' L* Q; p! e4 u
. q+ }+ v# k6 b, X好到这里为止Speech SDK5.1的配置算是完成了,接下去就可以写程序了。呵呵~~~~~~~
! H7 p  p/ _- k. ?* g0 g
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-14 00:58 , Processed in 0.021179 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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