集成Android免费语音合成功能(在线、离线、离在线融合),有这一篇文章就够了(离线)

集成Android免费语音合成功能(在线、离线、离在线融合),有这一篇文章就够了(离在线融合)

    转眼间,大半年没写文章了,没什么理由,就是人变懒了。囧~

    看标题,其实大家都被骗了,有这一篇文章还不够,我其实是打算分3篇文章来写的,如果合在一章里面就太长了,不过现在这个标题党横行的网络世界,我也被污染了,哈。

那么为什么要分3篇文章来讲呢?看标题也能猜到了,就是在线、离线、离在线融合这3种语音合成方式,我将分别使用科大讯飞、云知声、百度语音来实现Android的语音合成。至于有什么优缺点,大家可以自行百度,这里就不再赘言了,好吧,不说废话了,我怕有人会打我,哈哈~

首先,这一篇先写用科大讯飞实现的在线语音合成吧,是免费的,它的离线是要钱的,有需求的可以自己到它们官网去看看。

打开讯飞开放平台


注册、登录开发者账号



进入控制台,创建新应用


开通在线语音合成服务



下载SDK



下载完SDK后,解压压缩包sample-->SpeechDemo


打开SpeechDemo-->libs文件夹,复制jar包和.so文件到你的项目里面,然后sync一下



做完以上准备工作,就可以开始撸代码了

    首先,AndroidManifest.xml申请权限(6.0需要动态申请权限,碍于篇幅,请自行百度)

    <uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.READ_CONTACTS" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_SETTINGS" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    然后,新建MyApplication.java文件,初始化语音合成SDK,APPID可在讯飞平台-->我的应用查看,也可查看下载的SDK压缩包名字后缀


package com.cyf.ttsdemo;import android.app.Application;import com.iflytek.cloud.SpeechUtility;/*** Created by As on 2017/8/7.*/public class MyApplication extends Application{@Overridepublic void onCreate() {super.onCreate();SpeechUtility.createUtility(this, "appid=5987d170");}
}

    最后记得在AndroidManifest.xml注册该Application



    为了可以全局调用语音合成功能,我封装成了一个工具类,大家可以直接复制过去用

package com.cyf.ttsdemo.utils;import android.os.Bundle;
import android.os.Environment;
import android.util.Log;import com.cyf.ttsdemo.MyApplication;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechEvent;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SynthesizerListener;/*** Created by As on 2017/8/7.*/public class TTSUtils implements InitListener, SynthesizerListener {private static final String TAG = "TTSUtils";private static volatile TTSUtils instance = null;private boolean isInitSuccess = false;private SpeechSynthesizer mTts;private TTSUtils() {}public static TTSUtils getInstance() {if (instance == null) {synchronized (TTSUtils.class) {if (instance == null) {instance = new TTSUtils();}}}return instance;}public void init() {// 初始化合成对象mTts = SpeechSynthesizer.createSynthesizer(MyApplication.getContext(), this);// 清空参数mTts.setParameter(SpeechConstant.PARAMS, null);// 设置在线合成引擎mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);// 设置在线合成发音人mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");// 设置合成语速mTts.setParameter(SpeechConstant.SPEED, "50");// 设置合成音调mTts.setParameter(SpeechConstant.PITCH, "50");// 设置合成音量mTts.setParameter(SpeechConstant.VOLUME, "50");// 设置播放器音频流类型mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");// 设置播放合成音频打断音乐播放,默认为truemTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限// 注:AUDIO_FORMAT参数语记需要更新版本才能生效mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/tts.wav");}public void speak(String msg) {if (isInitSuccess){if (mTts.isSpeaking()) {stop();}mTts.startSpeaking(msg, this);}else {init();}}public void pause() {mTts.pauseSpeaking();}public void resume() {mTts.resumeSpeaking();}public void stop() {mTts.stopSpeaking();}public void release() {if (null != mTts) {mTts.stopSpeaking();// 退出时释放连接mTts.destroy();}}@Overridepublic void onInit(int code) {Log.d(TAG, "InitListener init() code = " + code);if (code == ErrorCode.SUCCESS) {isInitSuccess = true;}}@Overridepublic void onSpeakBegin() {// 开始播放}@Overridepublic void onBufferProgress(int percent, int beginPos, int endPos,String info) {// 合成进度}@Overridepublic void onSpeakPaused() {// 暂停播放}@Overridepublic void onSpeakResumed() {// 继续播放}@Overridepublic void onSpeakProgress(int percent, int beginPos, int endPos) {// 播放进度}@Overridepublic void onCompleted(SpeechError speechError) {if (speechError != null) {Log.d(TAG, "onCompleted: " + speechError.getPlainDescription(true));}}@Overridepublic void onEvent(int eventType, int i1, int i2, Bundle bundle) {//以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因if (SpeechEvent.EVENT_SESSION_ID == eventType) {String sid = bundle.getString(SpeechEvent.KEY_EVENT_SESSION_ID);Log.d(TAG, "session id =" + sid);}}
}

    要使用这个工具类,那么就要改造一下前面的MyApplication.java文件了

package com.cyf.ttsdemo;import android.app.Application;
import android.content.Context;import com.cyf.ttsdemo.utils.TTSUtils;
import com.iflytek.cloud.Setting;
import com.iflytek.cloud.SpeechUtility;/*** Created by As on 2017/8/7.*/public class MyApplication extends Application {private static Context context;@Overridepublic void onCreate() {super.onCreate();context = getApplicationContext();SpeechUtility.createUtility(this, "appid=5987d170");// 以下语句用于设置日志开关(默认开启),设置成false时关闭语音云SDK日志打印Setting.setShowLog(false);TTSUtils.getInstance().init();}public static Context getContext() {return context;}
}

    好的,这样就大功告成了,在需要进行语音合成的地方调用TTSUtils.getInstance().speak("xxx")即可


    最后,我们需要到讯飞开放平台进行上传应用审核,不然使用的语音合成功能每天是有次数限制的。


    当应用审核通过之后,就可以免费无限制的使用在线语音合成功能啦。

集成Android免费语音合成功能(在线、离线、离在线融合),有这一篇文章就够了(在线)相关推荐

  1. 集成Android免费语音合成功能(在线、离线、离在线融合),有这一篇文章就够了(离线)

    原址 集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(在线) 集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离在线融合)     ...

  2. 集成Android免费语音合成功能(在线、离线、离在线融合)

    集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离线) 集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离在线融合) 转眼间,大半年 ...

  3. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

  4. Unity3d 集成 Android 系统打印功能

    研究了一段时间Android 系统打印功能,看到早在Android 4.0 也就是API Level>=19版本中就不需要再额外的安装打印驱动了,通过各种网站发现都是用同一种方法包括Androi ...

  5. Android:学习AIDL,这一篇文章就够了(上)

    前言 在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说--你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓--那样就很尴尬了.不过又转念一想, ...

  6. android的相机自动曝光,你真的会用手机拍照?一篇文章了解手动曝光!

    只要手机摄像头好,手机也能拍出单反的效果?亲,您想多了!拍照绝对是智能手机最频繁的应用之一,但你真的会用手机拍照吗?从最基本的光线应用到画面构图,小编将为大家奉上系列专题,本期,就让我们从手动曝光谈起 ...

  7. 集成Android 科大讯飞免费在线语音合成播报功能(附源码)

    概述 开篇先介绍一下'科大讯飞',毕竟是我家乡合肥的科技公司,我感到骄傲,更重要的是它在语音识别行业也是佼佼者,在如今人工智能横飞的时代,依然能够保持着较高水准的技术优势.在此,希望科大在AI之战中能 ...

  8. Android 百度语音合成 (含离线、在线、API合成方式,详细步骤+源码)

    百度语音合成 声明 前言 正文 一.创建项目 二.离线语音合成 1. 配置AndroidManifest.xml 2. 配置SDK 3. 离线SDK初始化 4. 导包 5. 运行 三.在线语音合成 - ...

  9. Android集成华为推送功能详细

    1.前言 Android集成推送功能也算是有好几个SDK了,包括极光.个推.小米.百度云推送.但是真心感觉华为的文档写的太差,封装的也不好,别的开发文档看一两遍就能按照文档集成成功,而华为仔细看了几遍 ...

最新文章

  1. Oracle中PL/SQL的循环语句
  2. 树莓派安装openCV做图像识别
  3. 华为平板能运行python吗_我是如何使用华为平板的
  4. python学习笔记(十四)标准库urllib
  5. 用Python写脚本:通过ssh在Windows下批量管理Linux
  6. 在优图网,临摹借鉴设计大咖作品|品图标设计:主要趋势
  7. 不填写内容用哪个斜杠代替_python3用单反斜杠代替双反斜杠
  8. struts获取ajax传值,struts 接收 jquery带参数ajax请求
  9. 用户没有create session权限_快速搞懂Oracle 19c安全新特性 (二)Privilege Analysis(权限分析)...
  10. OCR文本扫描 轮廓检测 透视变换-唐宇迪笔记
  11. 五金件常见问题01——2.普通螺纹与管螺纹
  12. js通过资源链接下载文件
  13. flink 时间语义、水位线(Watermark)、生成水位线、水位线的传递
  14. Android应用内跳转Scheme协议
  15. 【赛百味加入区块链试验项目以提高食品供应链透明度】GBCAX
  16. 如果我比别人走得更远些,那是因为我站在巨人的肩上。
  17. 2021-12-18 迈向程序猿的第四十七步
  18. 有限责任公司破产清算程序有哪些
  19. java type proposals_eclipse自动提示类型的作用
  20. 中国女排3-2力克巴西,朱婷、张常宁等主力回归,下次对阵荷兰,排名会发生怎样的变化?

热门文章

  1. 继承ActionSupport的例子
  2. python修片_python – Matplotlib savefig图像修剪
  3. 徐荣谦《养好脾和肺 宝宝不积食不咳嗽长大个》【03】食物养肺
  4. Wind-Up Knight:发条骑士冒险记
  5. 利用zlib库进行zip解压
  6. 我懂技术,不就显示个IP 属地嘛!一个小时能搞定吧
  7. 爬取实习吧与python相关的招聘信息及分析与数据可视化
  8. 运用Scrapy框架爬取淘车网十七万二手车数据
  9. jar小说生成器的编写思路
  10. 某直播平台协议分析之一