QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

8 E. U2 R! y* s6 [6 H6 N 华 中 师 范 大 学 卢 小 海(flier@126.com)

* I3 F3 n; e% u

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

# F; B3 k: |* L l6 J" B" D7 W

" I0 I/ K1 Y4 |/ r ---- 金 山 词 霸2000 的 英 文 全 文 朗 读 功 能 相 信 一 定 给 尝 试 过 的 用 户 留 下 了 很 深 刻 的 印 象, 而 作 为 一 个 程 序 设 计 者, 你 一 定 也 想 在 自 己 的 程 序 中 加 入 类 似 的 功 能 吧, 因 为 那 将 让 自 己 的 程 序 增 色 不 少。 2 A7 e. C1 t3 d5 @ q+ d, X& D% j----其 实 这 并 不 是 一 件 困 难 的 事, 因 为 金 山 词 霸 实 际 上 也 只 是 直 接 使 用 了MS 的TTS(Text -to -Speech) 技 术 而 已, 通 过 对MS Speech API 的 编 程, 我 们 完 全 可 以 实 现 比 其 更 强 大 的 功 能。 下 面, 让 我 们 在Delphi 环 境 下 实 际 尝 试 一 下。

' f% \/ n+ n# c- ?' I7 @% Y

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

* M3 t# ^, t, q6 o) v$ _

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

5 Y- S a/ S7 o& I- X/ h0 r9 P

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

. A' a0 o; ^7 n3 J" V; [0 x4 g6 v

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

% I* h' g4 B* u3 g, d% T8 B x* J

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

: {# }1 r7 A% H* d% X( r

... % s7 G4 N N0 ~' G; c% Q* k procedure TfrmMain.FormCreate(Sender: TObject); % }/ @" w& ]. s# {7 w5 W begin , P; Q6 A5 q& U FISpeech := CoVTxtAuto_.Create; 4 Z8 V2 A* [9 d2 s Y: N u0 C" y FISpeech.Register(‘Demo Site', ‘Demo App');/ r( n4 |/ x1 j. R- i D end; ! P8 z+ |( o8 Q# X, C...

3 W2 s, p M/ L% y4 J

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

) z# y- A/ G5 ]& e

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

4 V8 d, l5 @* Z) H+ Q0 ^+ p

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

, h- l1 H" p) i! j1 B3 L: O

Form 定 义 如 下:

; ]8 ^3 R9 |. F3 ?

object frmMain: TfrmMain. q- X7 |* R6 c' H3 f Left = 2969 H @: V4 c6 @5 c4 F. ~+ b1 O Top = 187 3 @* G+ t1 n6 t) y6 y% n* L BorderStyle = bsDialog - {& k3 G* h, u. Y) H/ R& I Caption = ‘ 英 文 全 文 朗 读 演 示' # ~5 a) H6 a3 S0 L3 k# h) w ClientHeight = 1850 h0 Z4 H+ L' p2 A8 k* z ClientWidth = 456 ) B$ {& i" a8 H, l Color = clBtnFace , o( N" t' }% a, b+ E* z# m% l Font.Charset = GB2312_CHARSET 7 p6 k" Y2 J: H% x$ _ Font.Color = clWindowText ) H& Q! H* q9 |: ` F! k" k6 \; p' }9 l Font.Height = -12+ x* m- a5 ^$ Y! y$ b; n Font.Name = ‘ 宋 体'& g1 l8 S1 _" b; K( [ Font.Style = [] 5 D( t7 O2 U+ \* r; L: Y OldCreateOrder = False4 D& d9 ^/ l6 U Position = poDesktopCenter ; K& H# M; S4 x0 W1 ^9 k OnCreate = FormCreate 4 ~7 e2 F( V0 n. W p6 N9 C& R PixelsPerInch = 964 g* h1 H: v$ T* f9 l: H TextHeight = 12 : b# e L. \: K, ~0 B, T, u object memText: TMemo 1 b: x4 H4 i: u7 ^- l Left = 8 r9 B" y/ h4 V! B, k Top = 8- R, R3 ?$ J* [7 ~8 `. E Width = 3614 f$ R, `* I6 M; M Height = 169$ n# m) R3 ?, X- G ScrollBars = ssVertical ( }1 z8 c& v. u8 G; a9 M TabOrder = 0 1 T( V9 _/ q2 k/ ? W9 u end$ x: T3 N4 z9 \ object btnRead: TButton 8 v' J( |7 }5 x9 _ Left = 376 L& m4 o) d3 u: j Top = 81 a- | I! [$ m Width = 75 7 u E1 n5 z3 O R# X Height = 25 3 y* w6 D" g& m2 I* w Caption = ‘ 朗 读( &R)' 8 v5 F4 F# I( }2 e9 K4 b! v TabOrder = 12 R0 B7 B' H) _1 p" P; k _7 ?2 o OnClick = btnReadClick' ]9 F, C0 R& _- W2 Q$ i end 0 G: S8 V$ P- T: D object btnPause: TButton ) K4 }! f$ k( Z0 I: r Left = 3768 Z' c8 R! ]5 W Top = 40 3 h/ a% p% I9 v& Y# `( e Width = 75 . v; n" a. x+ S) u! Q- g4 r Height = 25* D# f9 b. ~$ K* b; n( C/ { Caption = ‘ 暂 停( &P)' + S" r9 u% N, k1 } `5 i Enabled = False . O9 o, ?: X& D U+ M- }- o TabOrder = 2 1 Q7 P, r- G/ ~% c$ x! Y OnClick = btnPauseClick2 J# o# _6 @/ ]/ J- v end . t8 N1 e' A1 t/ h$ ^0 n object btnStop: TButton, o8 {5 O$ ~2 S! q" _4 D Left = 376 8 _ e/ U' _% L( W2 A Top = 72 ' a. _* t9 l( x# v Width = 759 X8 X7 J+ K$ e Height = 259 w+ ~: s* g& x; A) ~* E# A Caption = ‘ 停 止( &S)' 0 ]+ o% Y' d; P1 J0 N# K Enabled = False 4 o B1 L" r; \6 k* T4 ^2 p7 i TabOrder = 36 a# G7 h8 j+ S. G) Z: G OnClick = btnStopClick5 z4 C+ T! C' e2 e7 ]8 M9 t& F end5 v8 g9 g$ q7 P- c object btnForward: TButton0 f3 e) }) y8 B6 [/ C! O Left = 376 1 h( {; p. A4 y Top = 120/ P& _, U0 p# ~: X Width = 754 k9 u' I2 v+ U Height = 258 X) h1 q8 ?% u Caption = ‘ 下 一 句( &N)'. R+ d$ x0 [# u3 w9 \ Enabled = False * O) C6 S5 _$ G2 m TabOrder = 4 1 [; u3 q$ V1 R, o. [9 \) S OnClick = btnForwardClick 0 ^$ m8 O8 c* q$ i9 m! Z end . O" t- j* s$ ~& O8 e3 r object btnRewind: TButton1 E; u6 {2 Q% @- q Left = 376% [1 u0 v3 E2 [7 Z! _ Top = 152' t/ z: y: s/ B% R& X# M) V Width = 75 ( u j/ v. W1 P% D" g! ? F Height = 25% x- s3 F) D' @# E; Q7 C% C8 W# `8 |8 a Caption = ‘ 上 一 句( &W)' 5 p9 L0 l# D H: M5 J$ i Enabled = False ) D+ K# v1 g" C. T1 Q# P$ }6 _" }, ` TabOrder = 5 6 H$ E$ y% u! M# I OnClick = btnRewindClick& f8 q' T, X. P6 Q3 F/ x4 y end }2 j) ?+ W5 B! z. O end

/ p1 p: J4 N' B; D7 O \

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

+ f+ s$ z" P9 F

---- 1. 朗 读 与 停 止

" D ]7 X. G# U- `% Y* C

...) o1 e! k- u) k procedure TfrmMain.btnReadClick(Sender: TObject); ! _+ |# V9 v$ K: s6 ?8 M) U begin3 N9 q" L5 D6 u* I$ i& [. S FISpeech.Speak(memText.Lines.Text, vtxtst_ $ x$ T8 ?6 E6 ?7 q$ l. \ READING); 9 A) I. K1 {, F2 ?1 Y, b& F btnPause.Enabled := True;9 U% \6 p' x& L! c: [: M# O btnStop.Enabled := True; ) j2 K' p' L2 `1 M2 L end; ! K: v$ T* p6 K' R! [: e) y" C 3 i9 `/ E G9 ]! @' o" `$ iprocedure TfrmMain.btnStopClick(Sender: TObject); 5 `! X5 V. g: P& h6 J- C+ ` begin 2 O, i5 y& B9 d% B; X: _0 g FISpeech.StopSpeaking;4 u" B8 B( x6 d n: \0 q2 L btnPause.Enabled := False; 1 x2 P6 ^! L& |: B, u/ y. T btnStop.Enabled := False;9 Q Y/ |1 E) O# @( I btnPause.Caption := ‘ 暂 停( &P)'; 9 {1 m) T2 G' | end;6 O1 d, m: p% f$ N9 A! E5 `4 x ...

% ?6 z, E( }5 Y! n T7 y

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

3 ~) h% \- `# e Z0 t2 u ; x0 ~6 Q9 e' t$ j4 w- T

---- 2. 暂 停 与 恢 复

! w1 W; V0 ^% x+ E6 p7 f9 c, q) G

... ; u! D7 p. g% C) g9 Q) Vprocedure TfrmMain.btnPauseClick(Sender: TObject);: v, p7 f* p; N) |$ @" B/ q9 c begin ; t# c! r4 s0 V" ^4 b with FISpeech do 0 A& D: I- F6 b/ _! P( L2 j; t* } if IsSpeaking then 2 Q2 o. c) G/ d/ u begin ) b8 c. M, X4 A# r AudioPause; 1 C7 q( Q' v' `- V$ R. y9 o btnPause.Caption := ‘ 恢 复( &R)'; i; a s+ v. x" M5 b' I+ G2 j end 8 C) a' J4 R* L8 w$ \9 b else* s/ d' H2 c, T+ o p begin' Y$ V! Y% R ? AudioResume;& J0 B& D8 o0 N btnPause.Caption := ‘ 暂 停( &P)';7 x d! H2 u; _ end; " ^1 I! i4 l! I f2 Q; t# Kend;6 s5 Z/ O* ^( |$ L# a" c+ z7 g- S: Q ...

: @; B0 s6 a. d8 o' U3 [+ n

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

9 p' a: l7 \, [, t' Z! A

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

0 w0 ?+ A" x! E9 Q. R7 K- d+ ^* Y

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

+ R' `5 i" R; J" { ~

...* Y* a" r6 {% E: x3 {* B, J IVTxtAuto = interface(IDispatch)! L3 ~8 ?4 B/ ?2 Y/ l ...7 }. W. h1 @+ V: r. T property Speed: Integer read Get_Speed write Set_Speed; ) A3 W0 n9 |% J' i2 J" }# l property Enabled: Integer read Get_Enabled write Set_Enabled;( J; k/ K0 `8 H, F. A% Z, M ...5 d9 e- H* Q: E( D end; : F" }8 M5 R) [ ...

) S/ |7 p; q8 i2 W/ j! k1 T1 b3 J

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

. |* c- y, R( L+ k

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

' E* U5 l" S* a

----本 文 程 序 在Win NT/98 + Delphi 4/5 环 境 下 调 试 通 过。 H3 c1 q2 ]+ k 8 u2 o) y7 t' c3 X! z

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-10-17 09:02 , Processed in 1.631388 second(s), 51 queries .

回顶部