QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2831|回复: 0
打印 上一主题 下一主题

在程序中加入英文朗读功能

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 12:57 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

. q; i+ n7 d! h6 } 华 中 师 范 大 学 卢 小 海(flier@126.com)

+ z! F ?4 |/ N6 i& h

各位朋友,请加入本站邮件列表,你将得到本站最新更新及动态。

, s& W( s9 X0 b3 s9 B) \, X

" H5 W c) \# N2 _ ---- 金 山 词 霸2000 的 英 文 全 文 朗 读 功 能 相 信 一 定 给 尝 试 过 的 用 户 留 下 了 很 深 刻 的 印 象, 而 作 为 一 个 程 序 设 计 者, 你 一 定 也 想 在 自 己 的 程 序 中 加 入 类 似 的 功 能 吧, 因 为 那 将 让 自 己 的 程 序 增 色 不 少。 * T& v* P' A, W! D3 }1 C4 ` ----其 实 这 并 不 是 一 件 困 难 的 事, 因 为 金 山 词 霸 实 际 上 也 只 是 直 接 使 用 了MS 的TTS(Text -to -Speech) 技 术 而 已, 通 过 对MS Speech API 的 编 程, 我 们 完 全 可 以 实 现 比 其 更 强 大 的 功 能。 下 面, 让 我 们 在Delphi 环 境 下 实 际 尝 试 一 下。

1 ~3 c I9 ]/ Z; S- r/ O

----首 先 从 金 山 词 霸 的 光 盘 上\ciba 目 录 下 运 行 并 安 装mstts.exe(MS TTS engine) 和spchapi.exe(MS Speech API)。

! k5 a# ]- ]3 W$ l. l8 X

----再 在Delphi 里 新 建 一 个Application。

: n* m' C" ~2 b/ a/ @$ m0 n

----然 后 从Delphi 的 菜 单Project/Import Type Library... 中 选 击Add..., 浏 览 到Windows 目 录 下 的Speech 子 目 录 里, 打 开vtxtauto.tlb, 可 以 看 到 下 面Class names 中 会 出 现 我 们 需 要 的 接 口 的 包 装 类 的 名 字TVTxtAuto, 注 意 对 话 框 底 部 的Generate Component Wrapper 需 要 被 选 中, 点 击Create Unit 就 可 以 打 开 一 个 名 为VTxtAuto_TLB 的Unit。

. e# ]) r/ y) |- c2 |5 B

----至 此, 我 们 就 可 以 开 始 实 际 编 程 了。

]* M& t4 g1 E

----首 先 在Form 的OnCreate 中 对 需 要 使 用 接 口 初 始 化 并 进 行 注 册:

4 x1 r/ u8 [8 R1 K

...# X$ d+ t. g. q procedure TfrmMain.FormCreate(Sender: TObject);3 V9 {3 W/ n! V1 U; y- ` begin! ]1 A% v# h' g1 n" P* @9 `7 e2 y FISpeech := CoVTxtAuto_.Create;. l/ v+ \, `, J' c) `# R; |/ ^ FISpeech.Register(‘Demo Site', ‘Demo App'); , ~3 r0 P# g' U- n end;- o4 K; c1 l p2 _1 ^ ...

% Z* I) }7 ]! T- l

----由 于Delphi 对 接 口 进 行 了 良 好 的 包 装, 因 此 只 需 直 接 建 立 包 装 类, 其 他 后 台 的 操 作 如 接 口 的 查 询、 释 放 等 交 给Delphi 在 后 台 自 动 完 成。

2 p- K! ~! \5 b+ M% N

----注 意 这 里 的Register 操 作 是 必 不 可 少 的, 因 为 可 能 有 多 个 程 序 不 同 设 置 使 用TTS 引 擎。

! r9 A( G/ p* ?0 V1 J3 R

----然 后 在MainForm 上 放 一 个TMemo 和 若 干 个 TButton, 并 在 其OnClick 中 加 入 对 应 的 代 码。

( a( A" X% _! m( m

Form 定 义 如 下:

9 n6 p) i( i, v1 ~% ?

object frmMain: TfrmMain 2 H4 E( d: H. c0 P8 [6 q& `% e+ V) R Left = 2966 H5 k9 J2 q0 w+ O! W Top = 187 * g3 Y4 \$ O, n! A$ K T" ?2 ^8 I; r9 e BorderStyle = bsDialog . e& v: B; `8 x9 P9 {% J+ @5 k# U Caption = ‘ 英 文 全 文 朗 读 演 示' 1 n" @* z) l9 {: @4 _ ClientHeight = 185 ! ]4 ~+ h! ~+ n5 n% z; X ClientWidth = 456& N3 l+ Y, Z. q8 u; l Color = clBtnFace' b5 j& T" i: i, { Font.Charset = GB2312_CHARSET " X, f2 l ^ }: L) A1 H Font.Color = clWindowText 4 @0 Q" U6 R) X/ ~ Font.Height = -123 o& n# h1 \/ g9 u4 B# `. O Font.Name = ‘ 宋 体'+ a' Y. f3 k9 f0 V) N Font.Style = []/ v( i/ \$ F2 ^ k: Q: I& m OldCreateOrder = False8 |9 K, `* w6 R' w/ _ Position = poDesktopCenter) [( M2 o# s( x ]/ } OnCreate = FormCreate- d. O e: e. x. q PixelsPerInch = 96 1 g3 D& T: |) m4 s2 m' U TextHeight = 12 $ B8 h! [. t( a: |0 o object memText: TMemo ( a( M, q+ q2 X Left = 8& h E; h* ], a8 |+ Q Top = 8 4 e4 H2 y2 Y- L" J! k Width = 361' ^7 o* o/ }4 Q. o9 n Height = 1691 ~9 d- F! G2 A9 ]: N( P" Q ScrollBars = ssVertical , F8 g+ z. G8 y, R% l4 ?! a TabOrder = 0 f0 J) r8 M- }7 q2 S$ k7 V end 3 ?/ m0 r! N& {, D8 G- b! D6 v- a object btnRead: TButton+ f. ^1 [& ?4 B2 c; o, Z Left = 376 3 H5 e5 h8 I( g Top = 81 [9 k# l3 |* [5 c3 T1 {+ V) ] Width = 75 3 M0 e- e m8 D Height = 25 5 y2 H0 W* d, K% a, E$ w7 H2 Z Caption = ‘ 朗 读( &R)' k, l7 h2 q/ w! s* L TabOrder = 1* p9 w# ~6 a! A, {; f( L OnClick = btnReadClick ' j: L9 ]& [! D5 b; l% x end3 e3 I# }% _% X object btnPause: TButton - O5 q& m2 j$ q0 ^! s9 u6 I# |2 Z Left = 376 5 H1 c6 \0 v7 J( q$ R( I" r( L8 c, P H: m8 x Top = 407 e3 K. n+ V% e6 Q$ n Width = 75! H4 l' ?( N: { Height = 25; D* y- E; h' m$ W Caption = ‘ 暂 停( &P)'5 J: L' G8 p, }# e Enabled = False , K, y3 ~* @( ?0 T5 E TabOrder = 23 {+ o: J: U# b* [5 V( M/ R OnClick = btnPauseClick% r+ S; ]/ C R9 \0 {, q) ? end " S1 |- D* r# ^. {: I8 d object btnStop: TButton3 U' \5 _( l; R6 L0 a% c. E+ S Left = 376 . i3 _" T$ w# ~! H Top = 72 ' o8 U$ c( @- U) A Width = 75. t. T! L4 U' N3 o6 h Height = 250 F8 h0 H5 s4 [4 P Caption = ‘ 停 止( &S)' " z5 N/ p4 g# V4 T, P, k( \ Enabled = False 1 o6 {: e% J$ Z8 g' [ TabOrder = 33 |( n. Z( d5 Z5 J; O OnClick = btnStopClick2 j& z, E( p! j end : z% Y4 p6 A: e# s object btnForward: TButton, A/ z _6 P, T4 B9 x Left = 376' K C6 G7 U9 z0 [& N Top = 120" f- {/ ~, e& b8 {; v0 @" H Width = 75 4 O4 `' p6 n6 G, e8 b& a4 l3 Z Height = 25 % d/ \6 m* W2 x" X4 f Caption = ‘ 下 一 句( &N)' 2 J2 [8 K. d! t: Q Enabled = False 8 ^* q n3 e* z2 l TabOrder = 4 0 r# w- p0 ]" y) ] OnClick = btnForwardClick2 S a& E. R8 s0 U( I2 L end" G+ H Q1 Z: z2 y$ p3 W object btnRewind: TButton ! S7 j: f) b0 J Left = 376 $ l. X. W) W) Y( O% A$ D Top = 152 7 ^4 m. H5 T' J3 V3 H Width = 754 g& b6 H8 p7 x U Height = 25& g6 P! C, r. x# {: o9 a3 s Caption = ‘ 上 一 句( &W)' 4 Z+ R9 `' X5 W, p Enabled = False U4 _: N4 H. \; D TabOrder = 5 , m5 o) w) }# [5 y4 d; P) R/ p OnClick = btnRewindClick3 l6 k8 k' _' \$ A" {) l9 { end, A7 m. N; N l" y8 H end

z! M* G7 z1 j8 @, D

----关 键 代 码 段 如 下:

' x* {6 z3 L, i6 ?, E' I

---- 1. 朗 读 与 停 止

( Z8 O2 Y* `; a

...; V7 C5 H, q' M6 s procedure TfrmMain.btnReadClick(Sender: TObject);( V' P% J+ z/ V begin ( U1 ?1 k" {+ A0 u( Y) \6 e FISpeech.Speak(memText.Lines.Text, vtxtst_ 3 Y: m& ]3 W1 G READING);' X+ h' e* M# R7 K4 ^ btnPause.Enabled := True; 3 l8 S% \) O. o' e btnStop.Enabled := True;5 q K/ z5 `% A, h' v% r' ~6 Y end;$ |/ @2 X) O, P" r- M* L - ?' @2 a# X1 ~8 X: n2 D0 n4 zprocedure TfrmMain.btnStopClick(Sender: TObject);" h- z$ p( L& P+ X0 m begin8 g X" S0 r0 N: k7 r FISpeech.StopSpeaking;4 y' T7 C9 x9 J6 g& Q btnPause.Enabled := False;5 o: p# Z1 M9 y# v btnStop.Enabled := False; 0 R5 E- S* j/ s" D$ @) l3 | btnPause.Caption := ‘ 暂 停( &P)'; . X9 }! y1 n. {4 H& r/ z3 D end; " {! W5 d. H9 U9 g0 a L ...

" ~9 v- I v3 ^

----Speak 成 员 函 数 的 第 一 个 参 数 向TTS 引 擎 传 递 需 要 朗 读 的 文 字, 第 二 个 参 数 由 指 定 朗 读 时 使 用 的 语 气 和 优 先 级 的 两 个 符 号 合 并 而 成。

$ y, p$ L7 m! }( f" D0 x( F I+ n! Z* k3 I% z

---- 2. 暂 停 与 恢 复

* l- i! h4 P+ e6 Q% u5 i

...0 }# A/ K; e: h& a' C4 J procedure TfrmMain.btnPauseClick(Sender: TObject); ; l! m+ \. |' |% [* N! [& `5 Q: j begin) I a5 @$ W+ H1 e5 Q- `' v with FISpeech do 9 Z: f- i2 ^" s1 R+ c$ j) D; L if IsSpeaking then: z! e- f9 n% T1 P# ^ begin0 ~0 S- s' X- M# b' D AudioPause;' j: A8 _ _6 B# P btnPause.Caption := ‘ 恢 复( &R)';$ A; [6 F5 B6 n; T end / Y3 J. S% \( D! v% ^4 v0 E else & y4 n4 [, ]+ c begin S3 K9 _$ x% j0 D1 | AudioResume; 4 @" [( H. Q( {( M! ~* I1 ~ btnPause.Caption := ‘ 暂 停( &P)'; * |1 E2 A, C& |1 m/ X# D" _ end;5 K9 D- y/ o E8 a7 m' t8 g end;- c# B$ {& g* p8 m ...

0 }" v; U! b7 p+ }

----这 里 通 过IsSpeaking 属 性 可 以 取 得 当 前 状 态, 然 后 通 过AudioPause 和AudioResume 暂 停 和 恢 复 朗 读。

8 ]9 @ u8 p7 A( |

----另 外 用 成 员 函 数AudioFastForward 和AudioRewind 可 以 向 前 和 后 跳 过 一 句 朗 读, 通 过 读 写Speed 属 性 还 可 以 取 得 或 设 置 朗 读 的 语 速, 单 位 是 字/ 分, 缺 省 值 为170。

: s2 @ M. W+ u) @

----注 意Speed 和Enabled 属 性 缺 省 设 置 是 只 写 的, 但 实 际 上IVTxtAuto 提 供 了Get_Speed 和Get_Enabled 函 数, 所 以 我 们 只 要 把VTxtAuto_TLB 单 元 中 的 声 明 修 改 一 下, 如:

$ c) O; r! C' B

... E9 K6 w" t" U. `% o* ]4 e IVTxtAuto = interface(IDispatch)3 i+ Q) r) q& ]' \5 ?7 d ... Z# y4 y) B1 Z: s property Speed: Integer read Get_Speed write Set_Speed; / S2 G6 \# g$ F: A6 b4 o8 L property Enabled: Integer read Get_Enabled write Set_Enabled;7 s& }- [2 M8 |5 a6 q; y ...( q; }: K, X8 P( q1 c end;! _2 d3 x& l/ i4 I0 d" ^ ...

9 \. Y+ D" b: D- ?

----即 可 正 常 使 用Speed 和Enabled 属 性 了。

$ K4 P6 ^) c1 N; t3 j/ M! o

----至 此, 一 个 简 单 的 英 文 全 文 朗 读 器 就 完 成 了, 有 兴 趣 的 朋 友 可 以 为 其 加 入 监 视 剪 贴 板, 热 键 激 活 等 功 能。

) H% _; W1 Z, ~( l+ N( I0 O! D

----本 文 程 序 在Win NT/98 + Delphi 4/5 环 境 下 调 试 通 过。 4 V* N( o+ C. d3 F6 j6 V. m 9 T. F' v }9 W5 O9 x4 N% U0 ?

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-19 06:57 , Processed in 0.293977 second(s), 52 queries .

回顶部