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, // 这个是用于语音的

定义并实现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;

定义变量

  public
    { Public declarations }
    mTextToSpeech: JTextToSpeech;  //安卓的语音合成
    vTTSIniL: TTTSIniL;//前面我们定义的监听类

初始化代码

procedure TForm5.FormCreate(Sender: TObject);
begin
  // 创建类 这个是用于沉浸显示的
  vImmerse := TImmerse.Create;
  vImmerse.OnTopBotChanged := SetTopBot;

  // 创建时,初始化语音引擎
  vTTSIniL := TTTSIniL.Create;//创建监听
  mTextToSpeech := TJTextToSpeech.JavaClass.init(TAndroidHelper.context,
    vTTSIniL);//初始化语音合成
end;

语音合成(实现朗读)

  // 朗读,对,就这一句 代码
  mTextToSpeech.speak(StringToJString(Memo1.Text),
    TJTextToSpeech.JavaClass.QUEUE_FLUSH, nil);

这里就只需要一句代码。简单吧。

停止朗读

也是一句代码

  mTextToSpeech.stop;

保存到文件


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;

请注意,我这里为了方便,固化了文件保存名与路径,实际使用请修改。

闭关语音引擎

  // 退出时关闭语音引擎
  if Assigned(mTextToSpeech) then
    mTextToSpeech.shutdown;

使用总结

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

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

扫描二维码关注公众号,回复: 11148222 查看本文章

演示代码下载地址

1、点击可跳转下载页面

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

相关或类似文章

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

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

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

点击上面标题后直接查看


欢迎光顾本人小店:(https://shop63778938.taobao.com/)
小店也提供delphi方面其他技术支持、定制开发。

现在就进店看看

大家有什么不清楚的,可以给我留言讨论
以上信息对您有用的话请点赞收藏,就下面这行

原创文章 43 获赞 71 访问量 8万+

猜你喜欢

转载自blog.csdn.net/tanqth/article/details/105821093