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

转眼间,大半年没写文章了,没什么理由,就是人变懒了。囧~
看标题,其实大家都被骗了,有这一篇文章还不够,我其实是打算分3篇文章来写的,如果合在一章里面就太长了,不过现在这个标题党横行的网络世界,我也被污染了,哈。
那么为什么要分3篇文章来讲呢?看标题也能猜到了,就是在线、离线、离在线融合这3种语音合成方式,我将分别使用科大讯飞、云知声、百度语音来实现Android的语音合成。至于有什么优缺点,大家可以自行百度,这里就不再赘言了,好吧,不说废话了,我怕有人会打我,哈哈~
首先,这一篇先写用科大讯飞实现的在线语音合成吧,是免费的,它的离线是要钱的,有需求的可以自己到它们官网去看看。
打开讯飞开放平台

注册、登录开发者账号

进入控制台,创建新应用

开通在线语音合成服务

下载SDK

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

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

做完以上准备工作,就可以开始撸代码了
首先,AndroidManifest.xml申请权限(6.0需要动态申请权限,碍于篇幅,请自行百度)
[html] view plain copy
<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. www.chuangyed.com permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android www.wmyl15.com/ permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android. www.senta77.com /permission.READ_PHONE_STATE" />
<uses-permission android:name="android. www.xucaizxyl.com/ permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android. www.lieqibiji.com/ permission.READ_CONTACTS" />
<uses-permission android:name="android. www.dejiaylsmile.cn permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android. www.6788878.cn/ permission.WRITE_SETTINGS" />
<uses-permission android:name="android. www.caihonyule.com permission.READ_EXTERNAL_STORAGE" />
然后,新建MyApplication.Java文件,初始化语音合成SDK,APPID可在讯飞平台-->我的应用查看,也可查看下载的SDK压缩包名字后缀

[java] view plain copy
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{

@Override
public void onCreate() {
super.onCreate();
SpeechUtility.createUtility(this, "appid=5987d170");
}
}
最后记得在AndroidManifest.xml注册该Application

为了可以全局调用语音合成功能,我封装成了一个工具类,大家可以直接复制过去用
[java] view plain copy
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(www.qinlinyule.cn/ 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");
// 设置播放合成音频打断音乐播放,默认为true
mTts.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();
}
}

@Override
public void onInit(int code) {
Log.d(TAG, "InitListener init() code = " + code);
if (code == ErrorCode.SUCCESS) {
isInitSuccess = true;
}
}

@Override
public void onSpeakBegin() {
// 开始播放
}

@Override
public void onBufferProgress(int percent, int beginPos, int endPos,
String info) {
// 合成进度
}

@Override
public void onSpeakPaused() {
// 暂停播放
}

@Override
public void onSpeakResumed() {
// 继续播放
}

@Override
public void onSpeakProgress(int percent, int beginPos, int endPos) {
// 播放进度
}

@Override
public void onCompleted(SpeechError speechError) {
if (speechError != null) {
Log.d(TAG, "onCompleted: " + speechError.getPlainDescription(true));
}
}

@Override
public 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);
}
}
}<strong>
</strong>
要使用这个工具类,那么就要改造一下前面的MyApplication.java文件了
[java] view plain copy
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;

@Override
public 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. CDH集成Kafka,两种方式:离线、在线

    1.离线 先下载相应版本的kafka http://archive.cloudera.com/kafka/parcels/ 然后放置相应目录,如下图: 然后直接添加组件即可 2.在线 配置相应的kaf ...

  2. npm包与gem包--在线&离线安装

    目录 NPM 在线 离线 GEM 在线 离线 NPM NPM,即为Node的包管理工具,官网为 https://www.npmjs.com/,我们可以在站内搜索所需要的NPM包,了解相关的使用规则 安 ...

  3. Xamarin Mono For Android 4.6.07004 完整离线安装破解版(C#开发Android、IOS工具)

      Xamarin是由Miguel de Icaza成立的一家新的独立公司,目的是给Mono一个继续奋斗的机会.Mono for Android (原名:MonoDroid)可以让开发人员使用 Mic ...

  4. Ubuntu14.04用apt在线/离线安装CDH5.1.2[Apache Hadoop 2.3.0]

    目录 [TOC] 1.CDH介绍 1.1.什么是CDH和CM? CDH一个对Apache Hadoop的集成环境的封装,可以使用Cloudera Manager进行自动化安装. Cloudera-Ma ...

  5. 使用Vitamio打造自己的Android万能播放器(6)——在线播放(播放列表)

    前言 新版本的VPlayer由设计转入开发阶段,预计开发周期为一个月,这也意味着新版本的Vitamio将随之发布,开发者们可以和本系列文章一样,先开发其他功能.本章内容为"在线视频播放列表& ...

  6. 大前端技术系列:TWA技术+TensorFlow.js => 集成原生和AI功能的app

    大前端技术系列:TWA技术+TensorFlow.js => 集成原生和AI功能的app ( 本文内容为melodyWxy原作,git地址:https://github.com/melodyWx ...

  7. Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)

    简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...

  8. 使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)

    前言 本章将实现非常实用的功能——下载在线视频.涉及到多线程.线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术 ...

  9. Android SDK 和 Eclipse ADT 离线安装 教程

    因为google 被限制,就是FQ后,下载的速度依旧非常慢,让人非常崩溃啊,所以这里就分享一下离线安装android SDK 和eclipse ADT 离线安装方法. 安装之前首先已经确保java s ...

随机推荐

  1. java,javascript中的url编码

    真实场景 url示例如下 http://localhost:31956/Login/Auto?Token=e8a67a9f-c062-4964-b703-d79f29c8b64e&Return ...

  2. 【LGR-047】洛谷5月月赛

    这次我期待了很久的Luogu月赛崩掉了 传说中的Luogu神机就这样被卡爆了 然后我过了20min才登上Luogu的网站,30min后才看到题目 然后交T1TM的不给我测!!!然后又交了一次机子就炸了 ...

  3. Duplicate entry * for key *

    一.问题 插入数据时报错 Duplicate entry * for key * 二.分析 建表语句 CREATE TABLE `t_product_result_config` ( `id` var ...

  4. (6)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- AOP框架

    AOP 框架基础 要求懂的知识:AOP.Filter.反射(Attribute). 如果直接使用 Polly,那么就会造成业务代码中混杂大量的业务无关代码.我们使用 AOP (如果不了解 AOP,请自 ...

  5. 《RabbitMQ Tutorial》译文 第 1 章 简介

    原文来自 RabbitMQ 英文官网的教程(1.Introduction),其示例代码采用了 .NET C# 语言. RabbitMQ is a message broker: it accepts ...

  6. 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--请求处理结果适配篇(7/8)

    文章目录 前情概要 前面一大坨一大坨的代码把route.controller.action.attribute都搞完事儿了,最后剩下一部分功能就是串起来的调用. 那接下就说个说第二个中间件,也是最后一 ...

  7. Bash Shebang 小结

    在 shell(Bash 是一种 shell) 中执行外部程序和脚本时,Linux 内核会启动一个新的进程,以便在新的进程中执行指定的程序或脚本.内核知道该如何为编译型的程序做这件事,但是对于脚本程序 ...

  8. [朴孝敏][Ooh La La]

    歌词来源:http://music.163.com/#/song?id=484058960 作曲 : Damon Sharpe/Jimmy Burney/Adam Kapit [作曲 : Damon ...

  9. 分布式监控系统Zabbix--完整安装记录(7)-使用percona监控MySQL

    前面已经介绍了分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控,但是没有提供可以直接使用的Key,太过简陋,监控效果不佳.要想更加仔细的监控Mysql,业内同学们都会选择 ...

  10. linux系统最小化安装后的初始化脚本

    作为运维人员,经常会初始化系统,系统在安装过程中基本都会选择最小化安装,这样安装好的系统里会缺少很多环境. 下面分享一个系统安装后的初始化脚本: #!/bin/bash #系统时最小化安装的,这里要安 ...