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

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

华 中 师 范 大 学 卢 小 海(flier@126.com)


---- 金 山 词 霸2000 的 英 文 全 文 朗 读 功 能 相 信 一 定 给 尝 试 过 的 用 户 留 下 了 很 深 刻 的 印 象, 而 作 为 一 个 程 序 设 计 者, 你 一 定 也 想 在 自 己 的 程 序 中 加 入 类 似 的 功 能 吧, 因 为 那 将 让 自 己 的 程 序 增 色 不 少。

----其 实 这 并 不 是 一 件 困 难 的 事, 因 为 金 山 词 霸 实 际 上 也 只 是 直 接 使 用 了MS 的TTS(Text -to -Speech) 技 术 而 已, 通 过 对MS Speech API 的 编 程, 我 们 完 全 可 以 实 现 比 其 更 强 大 的 功 能。 下 面, 让 我 们 在Delphi 环 境 下 实 际 尝 试 一 下。

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

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

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

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

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

    ...
    procedure TfrmMain.FormCreate(Sender: TObject);
    begin
    FISpeech := CoVTxtAuto_.Create;
    FISpeech.Register(‘Demo Site', ‘Demo App');
    end;
...

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

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

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

Form 定 义 如 下:

    object frmMain: TfrmMain
      Left = 296
      Top = 187
      BorderStyle = bsDialog
      Caption = ‘ 英 文 全 文 朗 读 演 示'
      ClientHeight = 185
      ClientWidth = 456
      Color = clBtnFace
      Font.Charset = GB2312_CHARSET
      Font.Color = clWindowText
      Font.Height = -12
      Font.Name = ‘ 宋 体'
      Font.Style = []
      OldCreateOrder = False
      Position = poDesktopCenter
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 12
      object memText: TMemo
        Left = 8
        Top = 8
        Width = 361
        Height = 169
        ScrollBars = ssVertical
        TabOrder = 0
      end
      object btnRead: TButton
        Left = 376
        Top = 8
        Width = 75
        Height = 25
        Caption = ‘ 朗 读( &R)'
        TabOrder = 1
        OnClick = btnReadClick
      end
      object btnPause: TButton
        Left = 376
        Top = 40
        Width = 75
        Height = 25
        Caption = ‘ 暂 停( &P)'
        Enabled = False
        TabOrder = 2
        OnClick = btnPauseClick
      end
      object btnStop: TButton
        Left = 376
        Top = 72
        Width = 75
        Height = 25
        Caption = ‘ 停 止( &S)'
        Enabled = False
        TabOrder = 3
        OnClick = btnStopClick
      end
      object btnForward: TButton
        Left = 376
        Top = 120
        Width = 75
        Height = 25
        Caption = ‘ 下 一 句( &N)'
        Enabled = False
        TabOrder = 4
        OnClick = btnForwardClick
      end
      object btnRewind: TButton
        Left = 376
        Top = 152
        Width = 75
        Height = 25
        Caption = ‘ 上 一 句( &W)'
        Enabled = False
        TabOrder = 5
        OnClick = btnRewindClick
      end
    end

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

---- 1. 朗 读 与 停 止

    ...
procedure TfrmMain.btnReadClick(Sender: TObject);
    begin
      FISpeech.Speak(memText.Lines.Text, vtxtst_ 
READING);
      btnPause.Enabled := True;
      btnStop.Enabled  := True;
    end;
    
procedure TfrmMain.btnStopClick(Sender: TObject);
    begin
      FISpeech.StopSpeaking;
      btnPause.Enabled := False;
      btnStop.Enabled  := False;
      btnPause.Caption := ‘ 暂 停( &P)';
    end;
      ...

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

---- 2. 暂 停 与 恢 复

    ...
procedure TfrmMain.btnPauseClick(Sender: TObject);
    begin
      with FISpeech do
      if IsSpeaking then
      begin
        AudioPause;
        btnPause.Caption := ‘ 恢 复( &R)';
      end
      else
      begin
        AudioResume;
        btnPause.Caption := ‘ 暂 停( &P)';
      end;
end;
...

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

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

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

      ...
IVTxtAuto = interface(IDispatch)
          ...
  property Speed: Integer read Get_Speed write Set_Speed;
  property Enabled: Integer read Get_Enabled write Set_Enabled;
          ...
end;
      ...

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

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

----本 文 程 序 在Win NT/98 + Delphi 4/5 环 境 下 调 试 通 过。


阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 夫和费衍射是光的衍射现象之一,其单缝夫和费衍射指的是当光线通过一个狭缝时产生的衍射现象。 在Matlab,我们可以使用Huygens-Fresnel原理来模拟光的衍射。首先,我们需要定义一个处理屏幕(即光线通过狭缝后所投射到的平面)的图像。 在Matlab,我们可以使用imread函数来取一张图像,如Image=imread('image.jpg')。然后,我们可以创建一个空的图像矩阵来存储处理屏幕的图像,例如Result=zeros(size(Image,1), size(Image,2))。 接下来,我们可以按照夫和费衍射的原理,将光线从狭缝的每个点上发出,计算每个点到处理屏幕上的距离,并通过Fresnel-Kirchhoff衍射公式计算每个点上的衍射光强。 最后,我们将计算得到的衍射光强叠到处理屏幕上的对应像素上,即Result(i, j)=Result(i, j)+Intensity,其(i, j)为处理屏幕上的像素坐标,Intensity为计算得到的衍射光强。 通过以上步骤,我们可以得到模拟单缝夫和费衍射的结果。最后,我们可以使用imshow函数将结果图像显示出来,如imshow(Result)。 以这种方式,我们可以使用Matlab模拟和分析光的衍射现象,进一步了解单缝夫和费衍射的特性和规律。 ### 回答2: 单缝夫和费衍射是光学的两种重要现象,可以用matlab进行数值模拟和分析。 夫和衍射是指光波通过一个窄缝时,发生的衍射现象。在matlab,可以使用衍射公式和波动方模拟夫和衍射的光强分布。首先,可以使用Fresnel衍射公式计算单缝夫和衍射的光场强度分布。利用matlab的数值积分函数可以计算出不同点的光强强度,从而绘制出夫和衍射图像。 费衍射是指光波通过一个有限宽度的狭缝或孔径时,发生的衍射现象。费衍射通常使用傅里叶变换进行模拟和分析。在matlab可以使用fft函数来进行傅里叶变换,将光波的空间域信息转换为频率域信息。通过傅里叶变换可以得到费涅尔衍射的光强分布,进而可以通过matlab进行可视化展示。 总之,matlab是一个强大的数学工具和编语言,可以用于模拟和分析matlab 单缝夫和费衍射的光强分布。利用其的数值计算和绘图函数可以很方便地进行模拟和分析工作。 ### 回答3: 单缝夫和费衍射是光学的两种常见现象。 夫和衍射是指当平行光线通过一个细而窄的单缝时,光线会发生偏折现象。根据夫和衍射公式,夫和衍射的角度和干涉级数以及波长等因素有关。通过使用MATLAB的光学相关函数,可以计算和模拟夫和衍射的现象。 首先,通过计算射光线与缝口角度的正弦值,得到夫和衍射角度的正弦值。然后,可以使用MATLAB的sin函数计算夫和衍射角度的正弦值。最后,利用夫和衍射公式,可以得到夫和衍射的光强分布。 费衍射是指当光线通过一个有限尺寸的物体时,光线会发生偏折和相干衍射现象。费衍射可以由MATLAB的传递矩阵方法进行模拟。首先,根据物体的几何形状和光线的波长等参数,可以构建物体的传递矩阵。然后,可以使用MATLAB的矩阵运算函数来计算射光束经过物体衍射后的光强分布。 总之,通过使用MATLAB的光学相关函数和数值计算方法,可以计算和模拟夫和衍射以及费衍射的现象。这些计算和模拟结果对于光学实验和器件设计等应用具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝈蝈俊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值