QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

' w% j6 y. D1 v" n/ j* [5 v# Y* @ 华 中 师 范 大 学 卢 小 海(flier@126.com)

. ^! o' o3 ]8 L0 L3 C7 D

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

4 ]& V% \ |, u- ?& _. a

: `6 Z0 a5 h1 A- R S8 x$ n ---- 金 山 词 霸2000 的 英 文 全 文 朗 读 功 能 相 信 一 定 给 尝 试 过 的 用 户 留 下 了 很 深 刻 的 印 象, 而 作 为 一 个 程 序 设 计 者, 你 一 定 也 想 在 自 己 的 程 序 中 加 入 类 似 的 功 能 吧, 因 为 那 将 让 自 己 的 程 序 增 色 不 少。 & l0 O- `2 F/ h0 {4 V c' L3 h----其 实 这 并 不 是 一 件 困 难 的 事, 因 为 金 山 词 霸 实 际 上 也 只 是 直 接 使 用 了MS 的TTS(Text -to -Speech) 技 术 而 已, 通 过 对MS Speech API 的 编 程, 我 们 完 全 可 以 实 现 比 其 更 强 大 的 功 能。 下 面, 让 我 们 在Delphi 环 境 下 实 际 尝 试 一 下。

* w) \2 ]3 X8 b! C) H6 H: b! j

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

! d6 F4 z8 E* E- {4 }/ y

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

@& _$ S6 R% ^! h9 b y- ?1 E

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

! ~" r5 D5 ~; U( q7 o) N' A

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

. H, r6 l' z, ~

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

; T8 k' |) f. S& m) t/ E

... 1 o/ `( ~( h! B procedure TfrmMain.FormCreate(Sender: TObject); & ?- }" k9 S6 h+ w: q' z+ o9 B begin8 D4 G1 ^: O: B5 f. m FISpeech := CoVTxtAuto_.Create;' p2 H, C+ T) E. i4 v/ F- c8 Q" ~ FISpeech.Register(‘Demo Site', ‘Demo App');, L! H6 {- _2 T4 j end;9 U2 L$ X/ m3 ] ...

% h5 E: }1 V3 f- u

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

3 s+ ~4 E, t/ ?7 V

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

7 G5 f" L2 @/ q8 {" \, M2 g1 W4 T: z

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

- t) M- V( i" r- S, v* s

Form 定 义 如 下:

9 S3 x+ ?4 n' G7 `0 t. g2 Y: y0 N2 j

object frmMain: TfrmMain 4 l- I0 X6 f$ j! o/ X Left = 2967 B3 r0 `- D+ l7 E; z Top = 187 ; Y c' T& ], A! v7 @; s$ v BorderStyle = bsDialog! Y5 N$ c( B4 p+ @9 n Caption = ‘ 英 文 全 文 朗 读 演 示' : L. y Y: X' z. G2 T1 B, N& m4 \: l7 A ClientHeight = 185 - r+ f, l6 h3 A- ?" L2 K ClientWidth = 456 3 d* t% ]0 S, u4 v2 _. O7 _& c Color = clBtnFace + @* J' B, Q% H G& z3 D7 V- { Font.Charset = GB2312_CHARSET ! e. C- r- A5 m+ M2 x Font.Color = clWindowText. f( `0 R$ k/ |: q1 S8 }1 k J Font.Height = -12& ~" C# } @8 X# P- G. | Font.Name = ‘ 宋 体' " G8 [! s0 h+ c7 Y Font.Style = [] " k8 S: {: [/ K5 u' ~2 B OldCreateOrder = False 2 I5 v$ X! e+ r) G% @, L2 O- n) g! ^ Position = poDesktopCenter / a: v3 J/ F# m! y OnCreate = FormCreate 1 J, ^' J m9 a( F% k+ x2 M PixelsPerInch = 96& y" o- T* A% ]' T% X$ R9 { TextHeight = 12 9 d2 R& t6 a" q object memText: TMemo ) |7 B& y! ^+ {; b/ }, ] Left = 8 . F. E3 r; z* g5 s- w Top = 8 7 d1 w/ E& {; o1 M% d- Y Width = 3613 p3 s: }7 x3 O i8 ]' f3 y/ g: z7 B Height = 1691 S. O- g/ g) z% ? ScrollBars = ssVertical8 p; W+ ^8 N$ r; Z* b3 N TabOrder = 00 P& Q5 ]5 w8 z8 b; J end) t5 k; M9 |1 C1 v object btnRead: TButton0 A/ a! W! M2 C9 I( X8 H1 }% ` Left = 376 2 N4 D, U& u- L) K6 u& {( f Top = 8 , N" m5 L1 L: V8 E) s$ i Width = 75! u6 p( D0 M: _! `4 j4 R' X Height = 25- a: W+ \- E; R+ a; ^) U Caption = ‘ 朗 读( &R)'" M3 O! t; L" o% {6 S0 [# p1 f TabOrder = 1/ h, i4 r4 G, j3 z OnClick = btnReadClick 4 I; a* f! a6 r, P* w end . P( ]4 v' C/ T. }9 e object btnPause: TButton! S @- K6 X* r! a# c% l Left = 376* v- d4 D/ `3 ^# L. o' x) I; d+ T Top = 40 9 A7 O9 ]7 [- V9 G: ?8 @; o/ C Width = 75 ; g- I. {. m h- t Height = 25; ?* h2 u2 A& G( i Caption = ‘ 暂 停( &P)' - U$ k9 V$ f0 g! m Enabled = False L$ [" ] V+ P TabOrder = 2 % t# _1 {9 f& x5 c: ?5 m OnClick = btnPauseClick ! }+ m1 m1 _7 [- ~* \ end7 l8 _; C- O" c( U/ f& H' F object btnStop: TButton2 H# [6 \# T, ~* X Left = 376& w G$ M& `: K% s, v$ K Top = 72' f1 Q E0 x! B3 _! f Width = 75 & o# y' A1 c4 @2 q$ X Height = 258 k8 O1 }: O6 N- d f Caption = ‘ 停 止( &S)'1 i. e0 ?- |, p. ~/ ^6 N Enabled = False/ N6 ~! w- h8 }9 a/ X! e$ { TabOrder = 3) s! g7 g' R$ O$ L9 v OnClick = btnStopClick, ^/ I6 {3 _2 s end! z! C& g$ S0 h object btnForward: TButton $ m: p" O2 h/ @; w5 X2 O; | Left = 3768 D. j, Y- N, N/ i Top = 120 4 [& R) R* s3 a Width = 75 5 P+ K" y% z9 b Height = 25 6 g( H1 _3 z; x: [$ E7 U/ P Caption = ‘ 下 一 句( &N)' * o; B$ s( b$ Z; u4 O& R- s3 { Enabled = False , Q- M, H5 R: c8 f TabOrder = 45 b, U( t1 }8 Q/ r3 D E @5 b, N+ U OnClick = btnForwardClick 7 {5 ]- g3 H' N8 j/ W9 L end( `) Q r/ r0 X. `: ^9 E9 P object btnRewind: TButton# D3 p% d: l& D# u5 [& v Left = 376 & N& i' L {+ g, e* Z T' `+ D! F3 t Top = 152 : Y0 }5 ^% |& m9 _) r! ~ Width = 75 , M$ z4 C3 `0 u! X9 s* }2 g! Y Height = 25 ' Y; i6 K5 q. {! j4 S( U4 y Caption = ‘ 上 一 句( &W)' : h) d. A, T" C Enabled = False 1 j; q3 t: I; d3 A TabOrder = 5 $ r2 H3 l0 A, _: C& Z8 u OnClick = btnRewindClick1 s, x: R2 e& P; k) Q! @ end- f7 j, b) h4 z T F end

8 L% H' o- W! E7 T9 P/ O

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

1 C1 L9 c: K( a0 @6 j2 Q* [. @1 a

---- 1. 朗 读 与 停 止

8 E" i' H- _- U$ W2 ?

.... G0 }- `3 e( N" z procedure TfrmMain.btnReadClick(Sender: TObject); ' U' l: [ j C- Q( N: T- i begin; t- A R2 B* i FISpeech.Speak(memText.Lines.Text, vtxtst_ + K& z+ D5 G/ J# Q: U READING); - A, W4 n) Z' a( G* k0 ~' D' k5 N btnPause.Enabled := True; ; P# y* x: Z. [3 ]7 e; J: \ btnStop.Enabled := True; , ~& M% N+ k. V7 V5 q# c end; : E9 A$ i9 q8 X0 D 1 L& |5 s1 K9 e) _) j+ I procedure TfrmMain.btnStopClick(Sender: TObject); ! o& j1 C ]' P" | begin 9 b. L6 ]: T( [2 J FISpeech.StopSpeaking;2 Q' _: T$ w. L; c3 n btnPause.Enabled := False; 6 F6 E8 G" o/ `7 C% O% b btnStop.Enabled := False;% R' d4 j P% n6 x btnPause.Caption := ‘ 暂 停( &P)'; 6 E, s: X9 x3 ~! S end;+ Q0 T" t3 {6 ^: [9 j3 h( e' Y& T ...

! Q: J3 Y- f6 Y4 C. [

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

2 [+ ` e- ^( X5 b2 L 1 z- R( W5 _8 Z8 ^) E

---- 2. 暂 停 与 恢 复

7 y6 R& ]0 Z( O& r' B! v

...; _ G+ ?! p2 ~( \5 v; x procedure TfrmMain.btnPauseClick(Sender: TObject);7 Z7 W: H/ q& u1 [; `# z begin) P0 E" e; b" I' n7 e5 c7 e with FISpeech do1 X2 L3 n0 ~: E% c7 H/ y! S* n; ~; n* ] if IsSpeaking then 4 d! X/ I7 x+ Z+ X begin $ j& o! Z4 C. n( F/ u) j AudioPause;. R$ v: W; b. u, u btnPause.Caption := ‘ 恢 复( &R)';; E0 u2 L2 d3 e$ \ end 1 S5 C* z& {7 X9 R/ T else' H! a# d7 i; t. P0 m* f) H# ^ begin' { d5 ^# W* s% G9 A; L7 N! f AudioResume; ( l4 y: o2 z" H: N+ b btnPause.Caption := ‘ 暂 停( &P)'; * q9 x4 A. B' u9 Z end; ^* J( D" Q1 ]9 h. s, v$ g end; / O3 Q3 N" _7 `* m...

& z# ^9 K* s- o

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

& y! U- G9 ?0 c) L, Q) s+ m

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

- P& @5 h# ?- }$ K9 t. A' j7 K" r$ v

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

: w2 l G" V3 |3 Q' Y! R6 v" `6 r7 Q

... 4 n! \5 d8 y2 ]4 {$ _IVTxtAuto = interface(IDispatch) 5 b! J8 W% L P: r; k+ \7 z; k ... 9 b+ ?7 n; w/ b) o. F6 G property Speed: Integer read Get_Speed write Set_Speed;+ A, m* i; U# g property Enabled: Integer read Get_Enabled write Set_Enabled; + ~( W3 y7 U6 W: z2 X- ^( ]$ ~ ...! x% C, H# n( Q. ~- D, i end; & {1 { _( s$ w1 E8 H0 \/ n6 f ...

/ T% @ Q+ n& H' _$ m

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

9 f- d) o8 u; i0 E0 l' C2 B O

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

+ s9 ]; q: e2 w; e- A

----本 文 程 序 在Win NT/98 + Delphi 4/5 环 境 下 调 试 通 过。1 Y( w! R2 G3 R) v# H ) Z: D3 B( P+ x

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-18 09:10 , Processed in 0.412304 second(s), 52 queries .

回顶部