转自 https://blog.csdn.net/xialong_927/article/details/84256354

a、两种方案

1、Android自带的语音播报(老版本手机Android6.0以下,不支持中文)

2、讯飞语音播报封装(直接用)

b、具体实现

一、Android自带的语音播报

查看手机是否支持中文语音播报,在测试的设备中打开‘设置’ -->找到 '语言和输入法'-->查看语音选项,是否支持中文,默认仅支持英文。

public class AndroidTTSActivity extends AppCompatActivity implements View.OnClickListener {private TextToSpeech textToSpeech = null;//创建自带语音对象@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.android_tts_layout);findViewById(R.id.btn0).setOnClickListener(this);initTTS();}private void initTTS() {//实例化自带语音对象textToSpeech = new TextToSpeech(this, new TextToSpeech.OnInitListener() {@Overridepublic void onInit(int status) {if (status == textToSpeech.SUCCESS) {// Toast.makeText(MainActivity.this,"成功输出语音",// Toast.LENGTH_SHORT).show();// Locale loc1=new Locale("us");// Locale loc2=new Locale("china");textToSpeech.setPitch(1.0f);//方法用来控制音调textToSpeech.setSpeechRate(1.0f);//用来控制语速//判断是否支持下面两种语言int result1 = textToSpeech.setLanguage(Locale.US);int result2 = textToSpeech.setLanguage(Locale.SIMPLIFIED_CHINESE);boolean a = (result1 == TextToSpeech.LANG_MISSING_DATA || result1 == TextToSpeech.LANG_NOT_SUPPORTED);boolean b = (result2 == TextToSpeech.LANG_MISSING_DATA || result2 == TextToSpeech.LANG_NOT_SUPPORTED);Log.i("zhh_tts", "US支持否?--》" + a +"\nzh-CN支持否》--》" + b);} else {Toast.makeText(AndroidTTSActivity.this, "数据丢失或不支持", Toast.LENGTH_SHORT).show();}}});}@Overridepublic void onClick(View v) {if (v.getId() == R.id.btn0) {startAuto("big sea");}}private void startAuto(String data) {// 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规textToSpeech.setPitch(1.0f);// 设置语速textToSpeech.setSpeechRate(0.3f);textToSpeech.speak(data,//输入中文,若不支持的设备则不会读出来TextToSpeech.QUEUE_FLUSH, null);}@Overrideprotected void onStop() {super.onStop();textToSpeech.stop(); // 不管是否正在朗读TTS都被打断textToSpeech.shutdown(); // 关闭,释放资源}}

补充工具类

/*** Created by RongGuang on 2014-11-21.* 中文朗读*/
public class ChineseToSpeech {private TextToSpeech textToSpeech;public ChineseToSpeech() {this.textToSpeech = new TextToSpeech(Application.getContext(), new TextToSpeech.OnInitListener() {@Overridepublic void onInit(int status) {if (status == TextToSpeech.SUCCESS) {int result = textToSpeech.setLanguage(Locale.CHINA);if (result == TextToSpeech.LANG_MISSING_DATA|| result == TextToSpeech.LANG_NOT_SUPPORTED) {new CoolToast(Application.getContext()).show("不支持朗读功能");}}}});}public void speech(String text) {textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null);}public void destroy() {if (textToSpeech != null) {textToSpeech.stop();textToSpeech.shutdown();}}
}

二、讯飞语音播报封装(直接用)

1.接入项目前准备:

1.申请APPID(步骤):

I.登录讯飞官网-->创建应用-->创建完成在''我的应用"中即可看见自己新建的项目&APPID-->

II.添加需要开通的服务:这里选择在线语音合成+sdk下载(so+jar文件),注意:so文件必须用你对应的项目的,用别人so文件,会导致与你的APPID不匹配,

2.使用说明+接入高频易发问题:

语音次数是有限制的,提高次数需要实名认证+上传项目
引入的so文件必须是你项目所对应的
不可多次初始化合成对象
3.接入项目(AndroidStudio):

I.相关sdk文件引入,如图(再次说明:so文件用的是你新建项目的so文件,不要用他人so):

II.初始化语音播报(API>=23需要授权,所以先授权,再初始化,如下:)

public class StartActivity extends AppCompatActivity {private List<String> permissionList = null;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);SystemClock.sleep(1000);//延时加载requestPermissions();}private void openActivity(Class<? extends AppCompatActivity> clazz) {initTTS();startActivity(new Intent(this, clazz));finish();}//权限申请private void requestPermissions() {// 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {addListPermission();boolean isGranted = false;//是否全部授权// 权限是否已经 授权 GRANTED---授权  DINIED---拒绝Iterator<String> iterator = permissionList.iterator();while (iterator.hasNext()) {// 检查该权限是否已经获取int granted = ContextCompat.checkSelfPermission(this, iterator.next());if (granted == PackageManager.PERMISSION_GRANTED) {iterator.remove();//已授权则remove}}if (permissionList.size() > 0) {// 如果没有授予该权限,就去提示用户请求//将List转为数组String[] permissions = permissionList.toArray(new String[permissionList.size()]);// 开始提交请求权限ActivityCompat.requestPermissions(this, permissions, 0x10);} else {Log.i("zhh", "权限已申请");openActivity(MainActivity.class);}} else {openActivity(MainActivity.class);}}//初始化语音合成private void initTTS() {//讯飞语音播报平台SpeechUtility.createUtility(this, "appid=");//=号后面写自己应用的APPIDSetting.setShowLog(true); //设置日志开关(默认为true),设置成false时关闭语音云SDK日志打印TTSUtils.getInstance().init(); //初始化工具类}/*** 权限申请返回结果** @param requestCode  请求码* @param permissions  权限数组* @param grantResults 申请结果数组,里面都是int类型的数*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {case 0x10:if(grantResults.length>0&&ifGrantResult(grantResults)){Toast.makeText(this, "同意权限申请", Toast.LENGTH_SHORT).show();openActivity(MainActivity.class);}else{Toast.makeText(this, "权限被拒绝了", Toast.LENGTH_SHORT).show();finish();}break;default:break;}}private boolean ifGrantResult(int[] grants) {boolean isGrant = true;for (int grant : grants) {if (grant == PackageManager.PERMISSION_DENIED) {isGrant = false;break;}}return isGrant;}//敏感权限添加private void addListPermission() {if (null == permissionList) {permissionList = new ArrayList<>();permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);permissionList.add(Manifest.permission.READ_PHONE_STATE);permissionList.add(Manifest.permission.RECORD_AUDIO);}}}

III.语音播报封装(部分代码)

public class TTSUtils implements InitListener, SynthesizerListener {private static volatile TTSUtils instance = null;private boolean isInitSuccess = false;private SpeechSynthesizer mTts;//单例模式public static TTSUtils getInstance() {if (instance == null) {synchronized (TTSUtils.class) {if (instance == null) {instance = new TTSUtils();}}}return instance;}public TTSUtils() {}// 初始化合成对象public void init() {//判断进程是否已启动,初始化多次会报错//个人遇到问题:极光推送引入后,不加该条件回报错if (CourseUtils.resultProcess("com.zhanghai.ttsapp")) {mTts = SpeechSynthesizer.createSynthesizer(App.getContext(), this);// 清空参数mTts.setParameter(SpeechConstant.PARAMS, null);// 设置在线云端mTts.setParameter(SpeechConstant.ENGINE_TYPE,SpeechConstant.TYPE_CLOUD);// 设置发音人--发音人选择--具体见values-stringmTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoqi");// 设置发音语速mTts.setParameter(SpeechConstant.SPEED, "50");// 设置音调mTts.setParameter(SpeechConstant.PITCH, "50");// 设置合成音量mTts.setParameter(SpeechConstant.VOLUME, "100");// 设置播放器音频流类型mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");// 设置播放合成音频打断音乐播放,默认为truemTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");// 设置音频保存路径,需要申请WRITE_EXTERNAL_STORAGE权限,如不需保存注释该行代码
//        mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH,"./sdcard/iflytek.pcm");Log.i("zhh", "--初始化成完成-");}}//开始合成public void speak(String msg) {if (isInitSuccess) {if (mTts.isSpeaking()) {stop();}mTts.startSpeaking(msg, this);} else {init();}}
}

IV:调用实例

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG = MainActivity.class.getSimpleName();private EditText et = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et = findViewById(R.id.et);findViewById(R.id.btn0).setOnClickListener(this);findViewById(R.id.btn1).setOnClickListener(this);findViewById(R.id.btn2).setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn0:TTSUtils.getInstance().speak("bigsea是大海");break;case R.id.btn1:String msg = et.getText().toString();TTSUtils.getInstance().speak(TextUtils.isEmpty(msg) ? "输入信息为空" : msg);break;case R.id.btn2:startActivity(new Intent(this, AndroidTTSActivity.class));break;default:break;}}@Overrideprotected void onResume() {//移动数据统计分析--不用可不用加入FlowerCollector.onResume(MainActivity.this);FlowerCollector.onPageStart(TAG);super.onResume();}@Overrideprotected void onPause() {//移动数据统计分析FlowerCollector.onPageEnd(TAG);FlowerCollector.onPause(MainActivity.this);super.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();TTSUtils.getInstance().release();//释放资源}}

完!!!

原文地址:http://www.cnblogs.com/xxdh/p/9303377.html

下载地址:https://github.com/seastoneard/TTSApp
————————————————
版权声明:本文为CSDN博主「沧海龙腾LV」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xialong_927/article/details/84256354

android----Android语音播报的两种简单实现相关推荐

  1. android 画布叠加,Android实现图片叠加效果的两种方法

    本文实例讲述了Android实现图片叠加效果的两种方法.分享给大家供大家参考,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(Vi ...

  2. android 毫秒 计时器,Android时分秒计时器的两种实现方法

    可能我们在开发中会时常用到计时器这玩意儿,比如在录像的时候,我们可能需要在右上角显示一个计时器.这个东西其实实现起来非常简单. 只需要用一个控件Chronometer,是的,就这么简单,我都不好意思讲 ...

  3. android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...

    本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,noti ...

  4. android 图片叠加xml,Android实现图片叠加效果的两种方法

    本文实例讲述了Android实现图片叠加效果的两种方法.,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(View v) { // ...

  5. Android点击图片随机,android 设置图片随机出现-两种方式

    android 设置图片随机出现-两种方式, 第一种方式:得到图片对应的Drawable实例,通过setImageDrawable(drawable)实现 //ImageView对应的id ivBg ...

  6. Android4清理代码缓存,Android清除应用缓存的两种方法

    第一种 使用ActivityManager中的clearApplicationUserData方法,代码如下: ActivityManager am = (ActivityManager) getSy ...

  7. Android实现圆形图像的两种方法(Glide和Picasso)

    Android实现圆形图像的两种方法 先上效果图 Glide Picasso CircleTransform.java(圆形图片工具类) 先上效果图 Glide 在app的build.gradle中引 ...

  8. android打开另外的app两种方式,内置到自己本身的app,重新打开app,

    android打开另外的app两种方式,内置到自己本身的app空间,重新打开app空间, 目录 1.内置到自己本身的app空间, 2.重新打开app空间, 1.内置到自己本身的app空间, 被打开的a ...

  9. Android页面数据传递的两种方式

    在android中实现页面中数据的传递有两种方式: 1:第一种数据传递的方式是通过inputExtra方法来进行数据的传递的 2:第二中方法是通过bundle的方法来实现数据的传递的 接下来我们首先来 ...

最新文章

  1. 关于Python中的yield(转载)
  2. 在Python中对子进程进行非阻塞读取
  3. 利用福禄克网线/光纤测试仪规范测试BICSI标准
  4. 扩展方法略好于帮助方法
  5. java编译时注解_简单介绍 Java 中的编译时注解
  6. 要求或禁止在堆中产生对象
  7. 2020年智能物联网设备数量将达204亿,是智能为王还是服务为王?
  8. 顶尖,何为顶尖?你知道吗?我知道..
  9. ElementUI:input表单验证
  10. unity 线程断点时卡机_Java使用JDI进行线上程序断点信息记录
  11. 做一个iframe的弹出框
  12. Windows server 2003设置IP安全策略批处理脚本
  13. cad2023三维立体图形图纸工程设计绘图软件Autodesk AutoCAD 2023 中文
  14. 2020定额招投标报价评审办法及案例分享交流会圆满结束
  15. excel怎么启用宏_利用Excel连接Power BI,实现PPT报告自动输出
  16. 基于Flutter的m3u8下载器
  17. 用VB评估数学表达式
  18. Lua程序设计任务系统和NPC
  19. 跨平台应用开发进阶(十五) :uni-app实现全项目字体替换
  20. 小程序电商商城怎么搭建?

热门文章

  1. 计算机检索的辅助检索方法有,中国知网等文献检索的一般方法.docx
  2. CarSim仿真快速入门(十六)—CarSim传感器仿真之ADAS Sensor Objects (2)
  3. 程序减肥,strip,eu-strip 及其符号表
  4. 路由器 静态、动态路由的配置
  5. 《VR/AR技术与应用》笔记 002
  6. 精益生产排程系统(APS)优化的力量是什么?
  7. 如何禁止福昕阅读器改变PDF页面缩放比例?
  8. 《滚雪球:巴菲特和他的财富人生》【美】艾丽斯·施罗德著
  9. 新南威尔士大学预科学生宿舍
  10. ZYNQ中DMA与AXI4总线-DMA简介