Delphi D10.X中实现安卓中文语音合成(中文朗读)就这么简单

前言
语音合成,据说Android系统从1.6版本开始就支持TTS(Text-To-Speech)。但是android系统默认的TTS引擎:Pic TTS不支持中文。好在现在国内较多的手机都已安装好中文的TTS引擎。使用Delphi开发一个可以朗读中文的APP就非常的简单。
本文给大家介绍使用Delphi开发基于安卓原生的TTS(中文语音合成),将文字转语音实现中文的朗读。APP运行后,需要手机上已安装语音引擎。如果您手机上已安装并设置了语音引擎,即可开始朗读。

安卓系统的TTS可支持很多语音引擎,如:谷歌、讯飞、度秘、小爱等。本文主要介绍了如何使用TTS,最终朗读效果由语音引擎确定。

如果您的手机暂时还没有可用的语音引擎或需要不同的合成效果,可搜索下载语音引擎。
(或使用这个:Google的语音合成引擎,点击跳转下载页面)

文字转语音(TTS)输出的设置
如下图(不同手机设置方式有差异):

您可以选择并使用不同的语音引擎,但请注意,必须得有语音引擎
当然,现在有很多免费的语音引擎。

完成后的APP

演示APP主要实现了朗读、停止朗读与保存到文件(请注意,演示中的保存到文件固化了保存目录与文件名,实际可以根据需要调整。另外,部分语音引擎提示保存成功,但实际文件中没有语音,如要保存,请更换语音引擎。)

代码说明
请下载我上传的演示代码。这里仅介绍语音合成部分,代码中动态申请权限、沉浸模式、Toast显示等不作介绍(其他内容请到相关文章中查看,后附地址)。

需要引用的单元
Androidapi.JNI.Speech, // 这个是用于语音的
1
定义并实现TTS初始化监听类
  // 初始化监听
  TTTSIniL = class(TJavaLocal, JTextToSpeech_OnInitListener)
  public
    // 重写初始化监听事件
    procedure onInit(status: Integer); cdecl;
  end;

{ TScanBroadcastReceiver }

procedure TTTSIniL.onInit(status: Integer);
var
  supported: Integer;
begin
  if (status = TJTextToSpeech.JavaClass.SUCCESS) then
  begin
    // 设置朗读语言
    supported := Form5.mTextToSpeech.setLanguage(TJLocale.JavaClass.CHINA);
    if ((supported <> TJTextToSpeech.JavaClass.LANG_AVAILABLE) and
      (supported <> TJTextToSpeech.JavaClass.LANG_COUNTRY_AVAILABLE)) then
    begin
      Toast('不支持当前语言!');
    end;
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
定义变量
  public
    { Public declarations }
    mTextToSpeech: JTextToSpeech;  //安卓的语音合成
    vTTSIniL: TTTSIniL;//前面我们定义的监听类
1
2
3
4
初始化代码
procedure TForm5.FormCreate(Sender: TObject);
begin
  // 创建类 这个是用于沉浸显示的
  vImmerse := TImmerse.Create;
  vImmerse.OnTopBotChanged := SetTopBot;

  // 创建时,初始化语音引擎
  vTTSIniL := TTTSIniL.Create;//创建监听
  mTextToSpeech := TJTextToSpeech.JavaClass.init(TAndroidHelper.context,
    vTTSIniL);//初始化语音合成
end;
1
2
3
4
5
6
7
8
9
10
11
语音合成(实现朗读)
  // 朗读,对,就这一句 代码
  mTextToSpeech.speak(StringToJString(Memo1.Text),
    TJTextToSpeech.JavaClass.QUEUE_FLUSH, nil);
1
2
3
这里就只需要一句代码。简单吧。

停止朗读
也是一句代码

  mTextToSpeech.stop;
1
保存到文件

procedure TForm5.StrToFile;
var
  I: Integer;
  vStr: JString;
  vHashMap: JHashMap;
begin
  vStr := StringToJString(Memo1.Text);
  vHashMap := TJHashMap.JavaClass.init;
  vHashMap.put(TJTextToSpeech_Engine.JavaClass.KEY_PARAM_UTTERANCE_ID, vStr);
  //请注意,我这里为了方便,固化了文件保存名与路径,实际使用请修改
  I := mTextToSpeech.synthesizeToFile(vStr, vHashMap,
    StringToJString('/mnt/sdcard/Test_speak.wav'));
  if (I = TJTextToSpeech.JavaClass.SUCCESS) then
    Toast('保存成功!'+#13#10+'演示时固定保存在sdcard/Test_speak.wav')
  else
    Toast('保存错误!');
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
请注意,我这里为了方便,固化了文件保存名与路径,实际使用请修改。

闭关语音引擎
  // 退出时关闭语音引擎
  if Assigned(mTextToSpeech) then
    mTextToSpeech.shutdown;
1
2
3
使用总结
整体代码量很小,1、定义监听类,定义使用的变量;2、初始化语音引擎;3、朗读;4关闭语音引擎。
我测试过几个我身边手机上的不同语音引擎,朗读的效果各有优劣,请根据自身的需要情况去选择吧。

使用Delphi开发安卓下中文语音合成,一个可以朗读中文的APP就那么简单。下载资源内包括开发源码。同时,还演示了动态申请权限、沉浸模式、Toast显示内容。

演示代码下载地址
1、点击可跳转下载页面

2、Google的语音合成引擎 你可能会需要用到。

相关或类似文章
1、《Delphi D10.X快速实现安卓状态栏沉浸模式》这是一个Delphi实现状态栏沉浸透明的文章

2、《Delphi D10.X安卓APP开发中简单使用原生Toast》这是上一篇的内容,也是这篇的基础。

3、《Delphi D10.X安卓APP开发让原生Toast显示图片》一个Toast更高级的用法。

(点击上面标题后直接查看)
————————————————
版权声明:本文为CSDN博主「tanqth」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tanqth/article/details/105821093

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蝈蝈(GuoGuo)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值