【Android语音合成TTS】百度语音接入方法,和使用技巧详解

请尊重他人的劳动成果,转载请注明出处:【Android语音合成TTS】百度语音接入方法,和使用技巧详解

Ps.

依托于百度开放云,百度语音为合作伙伴提供了业界领先、永久免费的语音技术服务,目前已上线的服务包括语音识别、语义解析、语音合成,后续会继续带来开放资源、多轮对话等技术服务;通过SDK、REST
API及离线开发包等多种服务方式,满足不同开发者的开发需求。

目前百度语音提供免费的语音接入,语音合成质量尚可,但还没开放离线TTS。

服务接入流程

具体详情可查看:http://yuyin.baidu.com/dev.php

集成开发

导入百度语音的相关jar包和so文件如图:

提示:

将开发包中的 libs目录整体拷贝到工程目录,libs目录包括了各平台的 SO库,开发者视应用需要可以进行删减。galaxy_lite.jar是百度
Android公共基础库,如果项目中还集成了其它百度 SDK,如 PushSDK,在打包过程中出现类似如下的错误信息:

[2013-10-22 11:02:57 - Dex Loader] Unableto execute dex: Multiple dex files defineLcom/baidu/android/common/logging/Configuration; [2013-10-22 11:02:57 -VoiceRecognitionDemo] Conversion to Dalvik format failed: Unable to executedex:
Multiple dex files define Lcom/baidu/android/common/logging/Configuration;

请将此 Jar
包移除。如果 Eclipse ADT版本插件低于 17,需要手工添加依赖库,添加方法为:Project
=> Properties => Java Build Path => Libraries => AddJAR... 3

为了方便使用我这里将百度语音合成引擎做了进一步的封装,封装成了SpeechUtil以方便调用:

package com.jph.tts;

import android.content.Context;
import android.media.AudioManager;
import android.util.Log;

import com.baidu.speechsynthesizer.SpeechSynthesizer;
import com.baidu.speechsynthesizer.SpeechSynthesizerListener;
import com.baidu.speechsynthesizer.publicutility.SpeechError;

/**
 * 语音合成工具类
 *
 * @author JPH
 * @date 2015-4-14 下午1:33:37
 */
public class SpeechUtil implements SpeechSynthesizerListener {

	protected static final int UI_LOG_TO_VIEW = 0;
	private SpeechSynthesizer speechSynthesizer;
	private Context context;

	public SpeechUtil(Context activity) {
		this.context = activity;
		init();
	}
	/**
	 * 初始化合成相关组件
	 *
	 * @author JPH
	 * @date 2015-4-14 下午1:36:53
	 */
	private void init() {
		speechSynthesizer = new SpeechSynthesizer(context, "holder", this);
		// 此处需要将setApiKey方法的两个参数替换为你在百度开发者中心注册应用所得到的apiKey和secretKey
		speechSynthesizer.setApiKey("your apiKey",
				"your secretKey");
		speechSynthesizer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//		activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
		setParams();
	}
	/**
	 * 开始文本合成并朗读
	 * @author JPH
	 * @date 2015-4-14 下午1:47:05
	 * @param content
	 */
	public void speak(final String content) {
		 new Thread(new Runnable() {
             @Override
             public void run() {
//                 setParams();
                 int ret = speechSynthesizer.speak(content.toString());
                 if (ret != 0) {
                     Log.e("inf","开始合成器失败:"+ret);
                 }
             }
         }).start();
	}
	/**
	 * 取消本次合成并停止朗读
	 * @author JPH
	 * @date 2015-4-14 下午2:20:33
	 */
	public void cancle() {
		speechSynthesizer.cancel();
	}
	/**
	 * 暂停文本朗读,如果没有调用speak(String)方法或者合成器初始化失败,该方法将无任何效果
	 * @author JPH
	 * @date 2015-4-14 下午2:21:07
	 */
	public void pause() {
		speechSynthesizer.pause();
	}
	/**
	 * 继续文本朗读,如果没有调用speak(String)方法或者合成器初始化失败,该方法将无任何效果
	 * @author JPH
	 * @date 2015-4-14 下午2:21:29
	 */
	public void resume() {
		speechSynthesizer.resume();
	}
	/**
	 * 为语音合成器设置相关参数
	 * @author JPH
	 * @date 2015-4-14 下午1:45:11
	 */
	private void setParams() {
		speechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");//发音人,目前支持女声(0)和男声(1)
		speechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "9");//音量,取值范围[0, 9],数值越大,音量越大
		speechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5");//朗读语速,取值范围[0, 9],数值越大,语速越快
		speechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");//音调,取值范围[0, 9],数值越大,音量越高
		speechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUDIO_ENCODE,
				SpeechSynthesizer.AUDIO_ENCODE_AMR);//音频格式,支持bv/amr/opus/mp3,取值详见随后常量声明
		speechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUDIO_RATE,
				SpeechSynthesizer.AUDIO_BITRATE_AMR_15K85);//音频比特率,各音频格式支持的比特率详见随后常量声明
	}
	@Override
	public void onStartWorking(SpeechSynthesizer synthesizer) {
		Log.i("msg", "开始工作,请等待数据...");
	}

	@Override
	public void onSpeechStart(SpeechSynthesizer synthesizer) {
		Log.i("msg", "朗读开始");
	}

	@Override
	public void onSpeechResume(SpeechSynthesizer synthesizer) {
		Log.i("msg", "朗读继续");
	}

	@Override
	public void onSpeechProgressChanged(SpeechSynthesizer synthesizer,
			int progress) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onSpeechPause(SpeechSynthesizer synthesizer) {
		Log.i("msg", "朗读已暂停");
	}

	@Override
	public void onSpeechFinish(SpeechSynthesizer synthesizer) {
		Log.i("msg", "朗读已停止");
	}

	@Override
	public void onNewDataArrive(SpeechSynthesizer synthesizer,
			byte[] audioData, boolean isLastData) {
		Log.i("msg", "新的音频数据:" + audioData.length
				+ (isLastData ? "(end)" : ""));
	}

	@Override
	public void onError(SpeechSynthesizer synthesizer, SpeechError error) {
		Log.i("msg", "发生错误:" + error.errorDescription + "(" + error.errorCode
				+ ")");
	}

	@Override
	public void onCancel(SpeechSynthesizer synthesizer) {
		Log.i("msg", "已取消");
	}

	@Override
	public void onBufferProgressChanged(SpeechSynthesizer synthesizer,
			int progress) {
		// TODO Auto-generated method stub

	}
}

使用方法:

package com.jph.tts;

import android.app.Activity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.baidu.tts.sample.R;

public class HomeActivity extends Activity implements OnClickListener {

	protected static final int UI_LOG_TO_VIEW = 0;
	private TextView logView;
	private EditText inputTextView;
	private Button startButton;
	private SpeechUtil speechUtil;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_home);
		logView = (TextView) findViewById(R.id.logView);
		logView.setMovementMethod(new ScrollingMovementMethod());
		inputTextView = (EditText) findViewById(R.id.inputTextView);
		speechUtil = new SpeechUtil(this);
	}

	@Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btnStart:
        	speechUtil.speak(inputTextView.getText().toString());
            break;
        case R.id.btnPause:
        	speechUtil.pause();
        	break;
        case R.id.btnResume:
        	speechUtil.resume();
        	break;
        case R.id.btnStop:
        	speechUtil.cancle();
        	break;
        default:
            break;
        }
    }
}

因为百度TTS需要联网解析所以要赋予应用相应的权限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

推荐阅读:

【Android语音合成TTS】国内主流引擎对比

【Android语音合成TTS】云知声离线TTS使用详解

时间: 2024-12-23 01:30:14

【Android语音合成TTS】百度语音接入方法,和使用技巧详解的相关文章

【Android语音合成TTS】云知声离线TTS使用详解

请尊重他人的劳动成果,转载请注明出处:[Android语音合成TTS]云知声离线TTS使用详解 PS. 云知声是2012年创立的,虽然只有1年多的发展历程,但其语音识别技术核心团队已经从业十余年,积累颇丰,这也是为什么能够短短一年时间能够在语音识别领域内做得风生水起的缘故.微语音插件.搜狗语音助手.乐视超级电视.老罗锤子操作系统.触宝输入法,还有网易+电信推出的的易信,用的是云知声的语音识别.2013年,云知声在资本市场的认可度非常高,极受追捧. 目前云知声提供免费的离线TTS,但API比较少,

【Android语音合成TTS】国内主流引擎对比

PS. TTS即TextToSpeech(从文本到语言),也就是语音合成.TTS把文字智能地转化为自然语音流.TTS技术对文本文件进行实时转换,转换时间之短可以秒计算.在其特有智能语音控制器作用下,文本输出的语音音律流畅,使得听者在听取信息时感觉自然,毫无机器语音输出的冷漠与生涩感. 纵观整个应用市场会发现越来越多的APP含有语音识别语音合成的功能,TTS可以帮助开发者轻松构建各类语音交互应用,帮助各行业伙伴打造语音服务特色产品. 下面就给大家分析一下国内的主流语音引擎提供商,希望能对大家开发和

Android基础入门教程——2.3.1 TextView(文本框)详解

Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是翻译API文档,不会一个个属性的去扣,只学实际开发中常用的,有用的,大家遇到感觉到陌生的属性可以查询对应的API!当然,每一节开始都会贴这一节对应API文档的链接:TextVie

Android PullToRefresh (ListView GridView 下拉刷新) 使用详解

Android PullToRefresh (ListView GridView 下拉刷新) 使用详解 标签: Android下拉刷新pullToRefreshListViewGridView 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38238749,本文出自:[张鸿洋的博客] 群里一哥们今天聊天偶然提到这个git hub上的控件:pull-to-r

Android基础入门教程——2.5.2 Notification(状态栏通知)详解

Android基础入门教程--2.5.2 Notification(状态栏通知)详解 标签(空格分隔): Android基础入门教程 本节引言: 本节带来的是Android中用于在状态栏显示通知信息的控件:Notification,相信大部分 学Android都对他都很熟悉,而网上很多关于Notification的使用教程都是基于2.x的,而 现在普遍的Android设备基本都在4.x以上,甚至是5.0以上的都有:他们各自的Notification 都是不一样的!而本节给大家讲解的是基于4.x以

Android基础之十四数据存储 之 SQLite数据库详解

Android基础之十四数据存储 之 SQLite数据库详解 SQLite 是一款 轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百 K 的内存就足够了,因而特别适合在移动设备上使用. SQLite 不仅支持标准的 SQL 语法,还遵循了数据库的 ACID( 原子性(Atomicity) .一致性(Consistency) . 隔离性(Isolation) . 持久性(Durability))事务,所以只要你以前使用过其他的关系型数据库,就可以很快地上手 SQLite.而

Android开发之DatePickerDialog与TimePickerDialog的功能和用法详解

DatePickerDialog与TimePickerDialog的功能比较简单,用法也很简单,只要下面两步即可. ?  通过new关键字创建DatePickerDialog.TimePickerDialog实例,调用它们的show()方法即可将日期选择对话框.时间选择对话框显示出来. ?  为DatePickerDialog.TimePickerDialog绑定监听器,这样可以保证用户通过DatePickerDialog.TimePickerDialog设置事件是触发监听器,从而通过监听器来获

jquery ajax 方法及各参数详解

jquery ajax 方法及各参数详解 1.$.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息. 参数列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET".注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分

Android进阶中级教程——1.1 Git的本地使用详解

Android进阶中级教程--1.1 Git的本地使用详解 标签(空格分隔): Android进阶 1.引言 在之前的Android基础入门系列我们就讲解过Git的简单使用了,进阶系列我们 系统地对Git进行讲解,基本命令的使用:工作区,暂存区,历史仓库,远程仓库的概念, 团队协作中的分支管理,Android Studio中使用Git等:Git是一个快速的分布式的版本 控制系统,和其他的版本控制系统的差别在于Git直接记录快照,而不是差异比较! 差异比较的版本控制系统只关心文件内容的具体差异,然