QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

! ~( U3 I) z: j* b华 中 师 范 大 学 卢 小 海(flier@126.com)

4 S" ^0 i0 s/ e; R& R# Z; N" @! s

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

; \/ i6 Y/ J, ?0 B

4 @4 e2 t a% s( B ---- 金 山 词 霸2000 的 英 文 全 文 朗 读 功 能 相 信 一 定 给 尝 试 过 的 用 户 留 下 了 很 深 刻 的 印 象, 而 作 为 一 个 程 序 设 计 者, 你 一 定 也 想 在 自 己 的 程 序 中 加 入 类 似 的 功 能 吧, 因 为 那 将 让 自 己 的 程 序 增 色 不 少。 6 H/ N1 q! x' c4 c# y1 Z9 Z4 } ----其 实 这 并 不 是 一 件 困 难 的 事, 因 为 金 山 词 霸 实 际 上 也 只 是 直 接 使 用 了MS 的TTS(Text -to -Speech) 技 术 而 已, 通 过 对MS Speech API 的 编 程, 我 们 完 全 可 以 实 现 比 其 更 强 大 的 功 能。 下 面, 让 我 们 在Delphi 环 境 下 实 际 尝 试 一 下。

4 h [8 C( l& G* s

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

; J' b" f3 C+ [

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

' n8 N2 }" ]* n1 i

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

- ?8 l0 u7 K! v8 |) M

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

( W4 R+ |( f2 `* a

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

$ A9 g3 d; h; S. C+ [! [9 R9 g

..., S) W: r9 k8 w' J& b procedure TfrmMain.FormCreate(Sender: TObject); 8 T, x$ K$ T& ?- v' n* w begin 2 k7 |, V; K8 |3 q FISpeech := CoVTxtAuto_.Create; : e7 G: S; {8 g8 v) j3 l FISpeech.Register(‘Demo Site', ‘Demo App'); ) ]+ I4 ~$ k4 G+ d' [ I4 m/ u end; : j7 c! O# [0 O5 `...

: |! \. q; L6 w0 |9 |, V

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

9 ~; N P( I% P

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

" D# I6 e8 Y2 D. T" ~! H

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

$ Z2 u4 `7 u J1 X2 L6 o

Form 定 义 如 下:

1 v+ R: {# M P3 R9 I

object frmMain: TfrmMain, [4 F/ F+ ~5 F Left = 296 1 W/ c2 \" `; I( |( c Top = 187 6 s! A7 Z8 ^. b0 f5 T, G) i BorderStyle = bsDialog & [5 I9 j, b2 i+ W+ r Caption = ‘ 英 文 全 文 朗 读 演 示'9 }- o4 i" F+ z* P ClientHeight = 185$ E5 B9 i9 o" a: k; X ClientWidth = 456, M4 |. j: ~& R- ^5 U. x Color = clBtnFace a( V; @7 B$ x$ n" i Font.Charset = GB2312_CHARSET' S w) ~8 H; q1 H Font.Color = clWindowText$ X! N6 ^$ t5 g- ?: R- ~ Font.Height = -12 9 j4 H& {, e1 n! p1 ~6 L: o Font.Name = ‘ 宋 体'2 [9 A ?$ X2 P* `; H% P- @ r( C Font.Style = []0 p' g0 J" }9 N* ^) W. D$ s OldCreateOrder = False- k) P% D8 a5 u. P& d/ I5 `' f Position = poDesktopCenter. p) b ^- U: P3 O6 B- U' |$ m OnCreate = FormCreate $ }* [& ^8 V& p/ i( K2 V PixelsPerInch = 964 R. L9 S. V& M% z, m$ p0 H TextHeight = 123 P) p0 k7 s% r: B- M: Z object memText: TMemo$ W' H4 L% ]% ~2 g, P' s Left = 8 9 n& a1 Y: e! U0 @; Q Top = 85 i1 ?3 F( p7 k- J Width = 361 % W/ ?5 j# E# q* X% t$ d1 ^3 v$ t Height = 169! M. c w5 n" ? a ScrollBars = ssVertical - s& R. g+ Q9 `' Y7 c d0 Y0 P TabOrder = 0 ( |, D' |' E/ }6 }* W. _' H" g/ w end/ C. d6 |- c% s6 G4 k$ A: T0 E object btnRead: TButton' P' v, j, f- b+ t+ z Left = 3764 C& W' \% D8 O; f& `5 V Top = 8# {! j, } X3 ], ? Width = 75' _+ Z9 i9 p& u- C1 T( k. U+ E/ v. @ Height = 25 ]: v* b+ \+ o" q Caption = ‘ 朗 读( &R)'# \3 t* v& B% s8 A5 s( x TabOrder = 1/ J- f2 N# e- L# A& T OnClick = btnReadClick - w# j7 g' C+ t' o4 C7 r: { end ; L6 @7 K4 h' G6 U/ j object btnPause: TButton M% ?+ J5 z |1 U t( I- p9 G Left = 3765 g) @8 H& n- Y, S/ A Top = 40 9 i& v2 u3 x: X- {3 { Width = 75! ^, T6 f1 q5 m Height = 25) X( M: u- K( m3 e7 {) ^2 d5 Z d Caption = ‘ 暂 停( &P)' / X* J- j& p1 I1 A/ i Enabled = False) r! b. u; r7 m TabOrder = 22 E, M- T8 f8 D6 P$ u/ ` OnClick = btnPauseClick7 J7 J* ^3 N' h e: ] end0 u: {- E& C5 S8 z9 |3 x object btnStop: TButton : Q1 x/ Z) v. A* I7 S7 e' [ Left = 376$ Y# \1 ~, E( z, c( W- Q Top = 72 / N$ Q9 W2 ?( Q" S0 } Width = 75 9 Y9 @. q; |% T& L7 X Height = 25 # [0 V2 q4 v9 L) t# I" } Caption = ‘ 停 止( &S)'! j' [* }$ e9 ]- w Enabled = False3 q1 G# i6 o! _ TabOrder = 3+ e* c0 s, B, R: j. d OnClick = btnStopClick 5 f a4 |: h& ~' x end 6 {% F! D5 n1 u4 S' E1 X! k; S3 O object btnForward: TButton5 L# n j4 y6 D6 r Left = 3768 p I- O/ e$ z; H0 {/ [- Y2 ]6 C% a Top = 120 $ T/ N( R. z% W1 I# F9 _4 w3 S) n | Width = 75 $ }% _/ D$ j: j' i Height = 25 9 q+ D& `7 g' V5 B- h2 v Caption = ‘ 下 一 句( &N)' 6 N, C" g; a. F8 y- N Enabled = False 4 p, M$ z) F0 g TabOrder = 4 8 ^% A6 u% J4 f OnClick = btnForwardClick* @; v. b" n/ X end, ?! H7 I* Y' Q% c( L$ W" N object btnRewind: TButton) Y) |: i5 d1 q& Y3 F Left = 376! J9 l1 h( ~# I/ k: ?" A, V Top = 1526 W! j1 ^* b3 j: S( r Width = 75 ) e5 o! S$ R& u6 i) v/ p Height = 25 8 F8 \9 U& k2 K: N; y" t Caption = ‘ 上 一 句( &W)'2 I5 i& \; g' Y9 K Enabled = False 5 p$ W1 R( M6 _6 `2 V! m TabOrder = 5 - I7 o* |( _# F$ K [$ W9 k OnClick = btnRewindClick 7 ]% i/ B$ H: c3 A end4 N9 u5 W, b' p0 Z! s. t3 U end

; M/ _, f8 A! [- |

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

) K- E, I* v# T4 R' `" s0 V

---- 1. 朗 读 与 停 止

; v6 z u5 }) i9 c

...* E7 V; W$ j# g ^9 y; b! ^8 X, H( C procedure TfrmMain.btnReadClick(Sender: TObject);9 F, K: O$ b5 Q, K: |8 w: B( y begin : v- s5 i2 n% q3 ?! Y: C FISpeech.Speak(memText.Lines.Text, vtxtst_ # T+ m+ V. G2 d2 n8 Z5 u: I3 R READING); K0 h# f* I4 G8 }& A5 ^: d; l: b btnPause.Enabled := True; 0 M: M8 u' r$ D btnStop.Enabled := True;5 X8 N; A, f$ ] L) f# J; w8 n end;4 e$ T# o3 O6 k 8 [$ V% L7 L6 f( a) g' b6 Qprocedure TfrmMain.btnStopClick(Sender: TObject);0 i' a( o# X4 l+ e/ u8 S begin Q* K- K4 c. F. G" O9 q- | FISpeech.StopSpeaking; $ I* d% E# z( j1 T4 F4 y btnPause.Enabled := False; ; b$ [( s, w7 C6 i) Y4 ] btnStop.Enabled := False;9 K( ?' x: I; t, U9 F4 X btnPause.Caption := ‘ 暂 停( &P)'; ( M( e6 `2 s3 O' U1 B+ x- k1 I+ ~& c/ k end;& k# E2 |6 H* f* l1 L. k# X ...

: ?# W2 J3 o9 F, M4 s3 L+ s R, Z

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

9 J4 \) X% c; p- E5 @+ z) @6 _ 2 b+ z: }& ?. f1 D

---- 2. 暂 停 与 恢 复

. V+ a5 |' r2 \" O7 E

...7 h, w! z' @' H: f& B A procedure TfrmMain.btnPauseClick(Sender: TObject);# O1 J# m$ _# ~8 f6 T; D9 N7 z begin4 D: s! P5 y3 m; A" @2 g with FISpeech do 2 g) q, x( o) w& v" y, W i( C* C if IsSpeaking then* Y# `6 Z7 D# ^3 G begin* \* F: g2 R/ a5 q AudioPause; ; i0 H- P; j" F& S btnPause.Caption := ‘ 恢 复( &R)'; - {8 N* P+ d/ g8 l2 u, Y end + ~: S' i, H( Y5 E+ B' S- Q5 q else( m1 N& F7 q1 K8 W7 { begin 2 v5 C- t% d1 {' Q1 C4 @ AudioResume;/ C" W B n u+ a) Q% d# e- Z btnPause.Caption := ‘ 暂 停( &P)'; * B2 R# a7 C) W" \- g end; : D1 w! `& o$ S0 zend;: ^, m C# K4 Y g8 I" H9 S/ M$ v ...

' q; Y, H+ A- X( X% z

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

+ y3 q$ B2 }% @4 W

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

: C; q# w* \' x8 W; m2 G4 i- Y

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

* }9 o. Y" E' U) S0 ^

... 6 V! c$ H8 I& A/ C6 c4 xIVTxtAuto = interface(IDispatch) * x6 `7 Q0 L( y: R. `! y ...$ h" j ~- Y4 [( T& N; _: u/ j property Speed: Integer read Get_Speed write Set_Speed; " J' b! g/ ?# e' I1 J property Enabled: Integer read Get_Enabled write Set_Enabled;2 ?) E; ~ o9 w* F' f% Z) c1 L .... u* ] N& ]+ g" h* b end;9 ^7 }8 ]/ C/ O7 q ...

0 l( Y: i% N" Y

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

! j2 e' p+ B9 L! Q- [" \: l

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

" I' g7 d4 ^# Z: _$ }1 E- ]

----本 文 程 序 在Win NT/98 + Delphi 4/5 环 境 下 调 试 通 过。 + c) d$ }1 c5 S# W6 f! b - U$ P1 J+ X8 [. b: U: M

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-8-9 19:43 , Processed in 0.405773 second(s), 52 queries .

回顶部