Android TTS的暂停与恢复功能

        最近有同事做项目遇到这样一个需求,就是通过原生TTS播报文本希望能有暂停的功能,目前原生TTS接口TextToSpeech没有提供相应的接口,所以只能通过其他途径进行解决,目前初步的解决思路是:

  • (1)通过TextToSpeech保存文本为本地wav文件
  • (2)通过MediaPlayer播放本地的wav文件
  • (3)通过MediaPlayer的接口实现播放的暂停,回复和重置等功能

思路很简单,网上也有相应的说法,但是没有落实的方案,今天特意测试了一下,先给出主要的代码逻辑,在总结一下主要的问提。

(1)通过TextToSpeech保存文本为本地wav文件

  HashMap<String, String> myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, content);mSpeech.synthesizeToFile(content, myHashRender, wavPath);
//或者
//mSpeech.synthesizeToFile(content, null, wavPath,TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID);

(2)通过MediaPlayer播放本地的wav文件

MediaPlayer本身也是一块较多较复杂的内容,我们这里只是最基本的用法:

player.setDataSource(wavPath);
player.prepare();

(3)通过MediaPlayer的接口实现播放的暂停,回复和重置等功能

//播放
player.start();
//暂停
player.pause();
//恢复
player.resume();
//重置
player.reset();

完整的逻辑代码如下:

package aoto.com.ttstest;import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Environment;
import android.speech.tts.TextToSpeech;
import android.support.annotation.RequiresApi;
import android.util.Log;import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Set;/*** author:why* created on: 2019/7/10 9:57* description:*/
public class TTSManager {private static final String TAG = "TTSManagerWhy";private static volatile TTSManager manager = null;private static TextToSpeech mSpeech = null;private Context mContext;private String wavPath;private MediaPlayer player;private HashMap<String, String> myHashRender = new HashMap();@RequiresApi(api = Build.VERSION_CODES.M)private TTSManager(Context context) {this.mContext = context;wavPath = Environment.getExternalStorageDirectory() + "/temp.wav";player = new MediaPlayer();//6.0以上可以设置语速
//        Log.e(TAG, "TTSManager: "+ player.getPlaybackParams().getSpeed());
//        player.setPlaybackParams(player.getPlaybackParams().setSpeed(??));initSpeech();}/*** Init TTS and set params*/private void initSpeech() {mSpeech = new TextToSpeech(mContext, new TextToSpeech.OnInitListener() {@Overridepublic void onInit(int status) {mSpeech.setLanguage(Locale.ENGLISH);}});
}@RequiresApi(api = Build.VERSION_CODES.M)public static TTSManager getInstance(Context context) {if (manager == null) {synchronized (TTSManager.class) {if (manager == null) {manager = new TTSManager(context);}}}return manager;}public void speak(String content) {Log.e(TAG, "speak content: " + content);myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, content);int r = mSpeech.synthesizeToFile(content, myHashRender, wavPath);if (r == TextToSpeech.SUCCESS) {Log.e(TAG, "save success" + wavPath);} else {Log.e(TAG, "save fail");}try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}try {player.reset();player.setDataSource(wavPath);player.prepare();} catch (IOException e) {e.printStackTrace();}player.start();}/*** pause the TTS*/public void pause() {if (player.isPlaying()) {player.pause();}}/*** reset the TTS*/public void resume() {player.start();}/*** stop the TTS*/public void stop() {player.stop();player.release();mSpeech.shutdown();mSpeech.stop();}
}

下面总结几个重要的点:

(1)这里面我的语言设置的是英语,因为原生的不支持中文,而且在设置TextToSpeech参数的时候,需要在初始化工作完成之后进行,否则容易出现设置无效的情况;关于如何实现中文的暂停播报,主要问题就是需要解决中文文本转为音频文件的工作

(2)这里的播放速度控制不能通过TextToSpeech来设置了,需要通过MediaPlayer来设置实现,有一点需要注意的是,这个功能只有在6.0以上的系统才有,可以通过如下方式设置:

player.setPlaybackParams(player.getPlaybackParams().setSpeed(??));

(3)在测试中发现,我们通过TextToSpeech保存wav文件时,log显示成功了之后我直接调用播放代码是播放不了的,需要休眠一段时间之后才行,这一点也需要注意一下,我这里休眠了500ms,估计这个和文本长度还有关系,具体可以多测试一下

(4)注意各种权限的申请

后续要做的工作就是实现中文的暂停播报。中文实现已经更新

 

补(2019.07.15):

该方法也可以通过安装中文引擎配合上面的接口实现,下载安装并配置中文引擎可参考Android原生TTS的基本使用以及配合中文语音包实现中文TTS,其他方式不变,即可实现中文TTS播报的暂停与恢复功能。

 

注:如果喜欢,可以扫码关注

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/60454.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么好多人说uc浏览器是最牛的浏览器?

UC浏览器最强大的功能是视频缓存&#xff0c;很多人都因为它可以视频缓存而下载使用。但是&#xff0c;随着它这项功能的消失&#xff0c;越来越多的人开始选择舍弃UC浏览器了&#xff0c;为何呢&#xff1f; 1.广告增多 我们发现UC浏览器的广告开始增多&#xff0c;整体的浏…

继 QQ 被曝扫描浏览器历史记录之后,微信也被曝出会扫描所有 Chromium cookies

| 快讯 文章目录 微信被曝出扫描所有 chromium cookies腾讯技术人员最新回复 微信被曝出扫描所有 chromium cookies 1 月 18 日&#xff0c;PC 端 QQ 被曝出启动 QQ 时&#xff0c;QQ会自动扫描所有浏览器的历史记录。 1 月 19 日&#xff0c;经火绒证实&#xff0c;QQ 的确…

夸克、QQ浏览器、简单搜索竞品分析报告

作者&#xff1a;迷航 &#xff08;转载已取得作者授权&#xff09; 一、竞品分析目的 伴随着中国移动互联网的人口红利逐渐到顶&#xff0c;手机浏览器市场的马太效应也越发强烈。在激烈的竞争环境下&#xff0c;仍有新价值要素正在带来新的机会&#xff1a;Z时代、00后用户逐…

告别用了8年的QQ浏览器,这也许是我换浏览器的原因吧

手机浏览器作为高频率使用的应用之一&#xff0c;几乎每个人都会用到&#xff0c;相信大家也一定会有自己常用的一个手机浏览器。不管别人说这个浏览器多不好、多流氓&#xff0c;因为用习惯了&#xff0c;你可能都不愿意去换。 就像我一样&#xff0c;用QQ浏览器用了8年。虽然…

这几款手机浏览器真的牛,比夸克更好用

以前给大家推荐过不少浏览器&#xff0c;比如Alook浏览器、UC浏览器等。一些网友都喜欢轻便干净、极简大方的浏览器。但是&#xff0c;也有一些网友则喜欢功能全面的浏览器。今天&#xff0c;再给大家推荐3款浏览器&#xff0c;这3款浏览器真是牛的离谱&#xff0c;比夸克更好用…

夸克真的实用吗,其实除了它还有更好用的浏览器

夸克是一个非常强大的浏览器&#xff0c;之前写过一篇关于夸克的文章&#xff0c;很多人在评论区列举了夸克的各个优点&#xff0c;由此可见夸克是符合时代的优秀工具。然而&#xff0c;也有人表示&#xff0c;要卸载夸克&#xff0c;因为它脱离了浏览器路线&#xff0c;越来越…

高等数学学习笔记——第七十一讲——多元函数的泰勒公式

1. 问题引入——“以平代曲”与“以曲代曲” 2. 一元函数的导数&#xff0c;二元函数一阶导数&#xff0c;梯度及二元函数的二阶矩阵&#xff08;海塞矩阵&#xff09; 3. 海塞矩阵计算示例 4. 二元函数的带拉格朗日余项的麦克劳林公式 5. 二元函数的泰勒公式及拉格朗日中值公式…

汤家凤高等数学基础手写笔记-不定积分

越来越发现&#xff0c;下层基础决定上层建筑。除了考试&#xff0c;在研究中&#xff0c;我们能够用到的就是理论体系的知识&#xff0c;而不是会做题目的多少。做题目的目的在于加深对基础理论的理解。 本系列笔记汇总之处&#xff1a;汤家凤高等数学基础课2020年基础笔记概…

汤家凤高等数学基础手写笔记-微分方程

越来越发现&#xff0c;下层基础决定上层建筑。除了考试&#xff0c;在研究中&#xff0c;我们能够用到的就是理论体系的知识&#xff0c;而不是会做题目的多少。做题目的目的在于加深对基础理论的理解。 本系列笔记汇总之处&#xff1a;汤家凤高等数学基础课2020年基础笔记概览…

汤家凤高等数学基础手写笔记-定积分

越来越发现&#xff0c;下层基础决定上层建筑。除了考试&#xff0c;在研究中&#xff0c;我们能够用到的就是理论体系的知识&#xff0c;而不是会做题目的多少。做题目的目的在于加深对基础理论的理解。 本系列笔记汇总之处&#xff1a;汤家凤高等数学基础课2020年基础笔记概…

汤家凤高等数学基础手写笔记-一元微分学的应用

越来越发现&#xff0c;下层基础决定上层建筑。除了考试&#xff0c;在研究中&#xff0c;我们能够用到的就是理论体系的知识&#xff0c;而不是会做题目的多少。做题目的目的在于加深对基础理论的理解。 本系列笔记汇总之处&#xff1a;汤家凤高等数学基础课2020年基础笔记概…

高等数学公式大赏

极限 概念公式极限∃A&#xff0c;∀ε>0&#xff0c;∃δ>0&#xff0c;使x∈(a-δ,a)∪(a,aδ)时│f(x)-A│<ε ⇔ lim ⁡ x → a \lim\limits_{x→a} x→alim​f(x)A无穷极限∃A&#xff0c;∀ε>0&#xff0c;∃δ>0&#xff0c;使│x-a│>δ时│f(x)-…

实用的才是最好的,教你如何以MATLAB的方式实现高等应用数学问题(一)

前言 关于MATLAB系列的精品专栏大家可参见 MATLAB-30天带你从入门到精通 MATLAB深入理解高级教程(附源码) 喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟! 系列文章第二篇 实用的才是最好的,教你如何以MATLAB的方式实现高等应用数学问题(二) 高等应用数…

高等数学学习(1)-函数

1.1实数 1.1.1 集合 具有某种属性的事务的全体成为集合 集合的表示方法&#xff1a;1&#xff09;列举法&#xff08;列出每一个元素&#xff09;&#xff1b;2&#xff09;说明法&#xff08;说明元素共有的特性&#xff0c;这种说明需要能概括所有的元素&#xff0c;且不能…

高等数学基础(一)

高等数学基础&#xff08;一&#xff09; 目录 高等数学基础&#xff08;一&#xff09;1、函数1.1 函数的定义1.2 几种特殊函数的定义1.2.1分段函数1.2.2 反函数1.2.3显函数与隐函数 1.3 函数的几种特性1.3.1 函数的奇偶性1.3.2 函数的单调性1.3.3 函数的周期性 2、极限2.1数列…

高等数学 画图软件Mathematica

关键词&#xff1a; 高等数学 高数 作图软件 画图软件 几何图形软件 高等数学软件 Mathematica Mathematica是一款科学计算软件&#xff0c;很好地结合了数值和符号计算引擎、图形系统、编程语言、文本系统、和与其他应用程序的高级连接。很多功能在相应领域内处于世界领先地…

高等数学(预备知识之三角函数)

目录 一. 三角函数的定义二.象限角的三角函数符号三.诱导公式一四. 三角函数重要公式 一. 三角函数的定义 正弦函数, 余弦函数, 正切函数都是以角为自变量, 以单位圆上的坐标或坐标的比值为函数值的函数, 我们将他们称为三角函数 sin ⁡ \sin sin α \alpha α y cos ⁡ …

高等数学强化3:一元函数积分学 P积分

1.不定积分 常见不定积分公式 1.不定积分2大类题型&#xff1a; 1.不定积分计算 2.不定积分杂例 若 f f f在区间 I I I上连续&#xff0c;则 f f f在区间 I I I上一定有原函数。 若 f f f在区间 I I I上有第一类间断点&#xff0c;则 f f f在 I I I上没有原函数。 2.不定积…

高等数学 - 高分导学

基本理解 求极限 第一步,判断属于哪个类型 0:0型 洛必达法则 等价无穷小代换 等价无穷小例题 知道极限确定参数 泰勒公式 多项式 非多项式 / 多项式 求极限 : 把非多项式 用泰勒展开为多项式 why??? 问题:x->0 求极限  ax3 bx2cxd lim一一一一一一 0     x3 三…

高等数学需要记住的一些点

正定五种情况是&#xff0c;A正定然后其余都正定 特征向量也是五种情况&#xff0c;使用和A一样的线性变换&#xff0c;除了一个P逆AP的除外。 第十八章所有格林公式和斯托克斯公式还有高斯公式都是一样光滑且有一阶连续偏导的条件。 只有二阶偏导连续的时候&#xff0c;先导…