Android Studio应用开发集成百度语音合成使用方法实例讲解

首先,语音合成是指将文本信息转换成声音。意思就是将文本转化为声音,让你的应用开口说话。国内在业内比较有名的第三方语音合成平台有百度语音和科大讯飞。

本文集成的是百度语音合成,其主要特点是:

完全永久免费

业界首创完全永久免费新形式,为开发者提供最流畅最自然的语音合成服务。完全免费,永久使用,彻底摆脱限制。

离线在线融合模式

SDK可以根据当前网络状况,自动判断使用本地引擎还是云端引擎进行语音合成,再也不用担心流量消耗!

多语言多音色可选

中文普通话、中英文混读、男声、女声任你选,更支持语速、音调、音量、音频码率设置,让你的应用拥有最甜美和最磁性的声音!

流畅自然的合成效果

语音合成技术业界领先,合成效果接近真人发声,流畅自然,且极具表现力,给你最舒适的听觉体验!

百度语音官方的Demo是在Eclipse环境下编写的,而在Android Studio中则有点小区别,下面请看百度语音合成使用详细步骤(一步一步操作不要跳跃心急吃不了热豆腐):

1、注册百度语音开发者平台

注册百度账号,注册开发者信息,创建应用,可以得到 APP ID、 API Key、和 Secret Key,在开发过程中会使用这三个值进行授权(很关键),开通语音合成服务,若需要使用离线合成功能还需要申请离线授权。详细步骤请看百度语音接入流程 。

Key值查看(很关键)

2、下载资源

下载百度语音SDK,根据自己的需要下载,本样例下载的是离在线融合语音合成SDK_Android版 , 地址: http://yuyin.baidu.com/tts/download

3、集成百度语音指南

3.1添加 jar 包和 so 库到工程

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

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

请将此 Jar 包移除。对于使用Android Studio的用户,应将libs目录中的jar包放在libs目录下,然后添加库依赖(千万别忘记), 而 .SO 库则应该放在jniLibs目录下, jniLibs目录与Java、res在相同目录下。若没有相应的目录就自己创建。整个结构如下图:

3.2 添加语音合成资源文件

将开发包中的 data 目录下的 dat 文件放到工程的assets目录下,assets目录与java、res在同一目录下,以便设置资源文件参数时使用。

3.3 权限声明

使用百度语音需要声明以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

4、语音合成功能代码

4、1 Tts初始化

//获取 tts 实例
speechSynthesizer = SpeechSynthesizer.getInstance();
//设置 app 上下文(必需参数)
speechSynthesizer.setContext(Context);
//设置 tts 监听器
speechSynthesizer.setSpeechSynthesizerListener(SpeechSynthesizerListener);
//文本模型文件路径,文件的绝对路径 (离线引擎使用)
speechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE,
TEXT_MODEL_FILE_FULL_PATH_NAME);
//声学模型文件路径,文件的绝对路径 (离线引擎使用)
speechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE,
SPEECH_MODEL_FILE_FULL_PATH_NAME);
// 本 地 授 权 文 件 路 径 , 如 未 设 置 将 使 用 默 认 路 径 . 设 置 临 时 授 权 文 件 路 径 ,
//LICENCE_FILE_NAME 请替换成临时授权文件的实际路径,仅在使用临时 license 文件时需要进行设置,
//如果在[应用管理]中开通了离线授权,不需要设置该参数,建议将该行代码删除(离线引擎)
speechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_LICENCE_FILE,
LICENSE_FILE_FULL_PATH_NAME);
//请替换为语音开发者平台上注册应用得到的 App ID (离线授权)
speechSynthesizer.setAppId("your_app_id");
//请替换为语音开发者平台注册应用得到的 apikey 和 secretkey (在线授权)
speechSynthesizer.setApiKey("your_api_key", "your_secret_key");
//授权检测接口
AuthInfo authInfo = speechSynthesizer.auth(TtsMode);
//引擎初始化接口
speechSynthesizer.initTts(TtsMode);

注意:在初始化设置之前先把assets文件夹中的资源文件拷贝到SD卡中,以便使用。另外,离线授权临时文件有效期只有30天,若要长久使用语音离线合成应在应用管理中开通离线授权。

4、2合成并播放

mSpeechSynthesizer.speak(text);

该接口比较耗时,采用排队策略,调用后将自动加入合成队列,并按调用顺序进行合成和播放。

好了,到此你的语音合成就可以使用了,若想要进行更多参数设置,请看百度语音合成官方开发文档 和开发手册。

5、源码

最后贴上我的源码。

Manifest文件: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.junkchen.bdttsdemo">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

Layout布局文件: activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context="com.junkchen.bdttsdemo.MainActivity">
<EditText
android:id="@+id/edt_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:minLines="5"
android:text="Hi 我是百度语音合成,请输入要合成的语音内容" />
<Button
android:id="@+id/btn_speak"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="语音合成并播放" />
</LinearLayout>

Java: MainActivity.java

package com.junkchen.bdttsdemo;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.baidu.tts.answer.auth.AuthInfo;
import com.baidu.tts.client.SpeechError;
import com.baidu.tts.client.SpeechSynthesizer;
import com.baidu.tts.client.SpeechSynthesizerListener;
import com.baidu.tts.client.TtsMode;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity implements SpeechSynthesizerListener {
private static final String TAG = "MainActivity";
private SpeechSynthesizer mSpeechSynthesizer;//百度语音合成客户端
private String mSampleDirPath;
private static final String SAMPLE_DIR_NAME = "baiduTTS";
private static final String SPEECH_FEMALE_MODEL_NAME = "bd_etts_speech_female.dat";
private static final String SPEECH_MALE_MODEL_NAME = "bd_etts_speech_male.dat";
private static final String TEXT_MODEL_NAME = "bd_etts_text.dat";
private static final String LICENSE_FILE_NAME = "temp_license_2016-04-05";
private static final String ENGLISH_SPEECH_FEMALE_MODEL_NAME = "bd_etts_speech_female_en.dat";
private static final String ENGLISH_SPEECH_MALE_MODEL_NAME = "bd_etts_speech_male_en.dat";
private static final String ENGLISH_TEXT_MODEL_NAME = "bd_etts_text_en.dat";
private static final String APP_ID = "7957876";//请更换为自己创建的应用
private static final String API_KEY = "cVN31pILxBhRNdGdlNHyeuyq";//请更换为自己创建的应用
private static final String SECRET_KEY = "84e6987b56f11e6ee97e02ef25a2b4f0";//请更换为自己创建的应用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initialEnv();
initialTts();
initView();
}
@Override
protected void onDestroy() {
this.mSpeechSynthesizer.release();//释放资源
super.onDestroy();
}
private EditText edt_content;
private Button btn_speak;
private void initView() {
edt_content = (EditText) findViewById(R.id.edt_content);
btn_speak = (Button) findViewById(R.id.btn_speak);
btn_speak.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String content = edt_content.getText().toString();
mSpeechSynthesizer.speak(content);
Log.i(TAG, ">>>say: " + edt_content.getText().toString());
}
});
}
/**
* 初始化语音合成客户端并启动
*/
private void initialTts() {
//获取语音合成对象实例
this.mSpeechSynthesizer = SpeechSynthesizer.getInstance();
//设置Context
this.mSpeechSynthesizer.setContext(this);
//设置语音合成状态监听
this.mSpeechSynthesizer.setSpeechSynthesizerListener(this);
//文本模型文件路径 (离线引擎使用)
this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, mSampleDirPath + "/"
+ TEXT_MODEL_NAME);
//声学模型文件路径 (离线引擎使用)
this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, mSampleDirPath + "/"
+ SPEECH_FEMALE_MODEL_NAME);
//本地授权文件路径,如未设置将使用默认路径.设置临时授权文件路径,LICENCE_FILE_NAME请替换成临时授权文件的实际路径,
//仅在使用临时license文件时需要进行设置,如果在[应用管理]中开通了离线授权,
//不需要设置该参数,建议将该行代码删除(离线引擎)
this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_LICENCE_FILE, mSampleDirPath + "/"
+ LICENSE_FILE_NAME);
//请替换为语音开发者平台上注册应用得到的App ID (离线授权)
this.mSpeechSynthesizer.setAppId(APP_ID);
// 请替换为语音开发者平台注册应用得到的apikey和secretkey (在线授权)
this.mSpeechSynthesizer.setApiKey(API_KEY, SECRET_KEY);
//发音人(在线引擎),可用参数为0,1,2,3。。。
//(服务器端会动态增加,各值含义参考文档,以文档说明为准。0--普通女声,1--普通男声,2--特别男声,3--情感男声。。。)
this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");
// 设置Mix模式的合成策略
this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);
// 授权检测接口(可以不使用,只是验证授权是否成功)
AuthInfo authInfo = this.mSpeechSynthesizer.auth(TtsMode.MIX);
if (authInfo.isSuccess()) {
Log.i(TAG, ">>>auth success.");
} else {
String errorMsg = authInfo.getTtsError().getDetailMessage();
Log.i(TAG, ">>>auth failed errorMsg: " + errorMsg);
}
// 引擎初始化tts接口
mSpeechSynthesizer.initTts(TtsMode.MIX);
// 加载离线英文资源(提供离线英文合成功能)
int result =
mSpeechSynthesizer.loadEnglishModel(mSampleDirPath + "/" + ENGLISH_TEXT_MODEL_NAME, mSampleDirPath
+ "/" + ENGLISH_SPEECH_FEMALE_MODEL_NAME);
Log.i(TAG, ">>>loadEnglishModel result: " + result);
}
@Override
public void onSynthesizeStart(String s) {
//监听到合成开始
Log.i(TAG, ">>>onSynthesizeStart()<<< s: " + s);
}
@Override
public void onSynthesizeDataArrived(String s, byte[] bytes, int i) {
//监听到有合成数据到达
Log.i(TAG, ">>>onSynthesizeDataArrived()<<< s: " + s);
}
@Override
public void onSynthesizeFinish(String s) {
//监听到合成结束
Log.i(TAG, ">>>onSynthesizeFinish()<<< s: " + s);
}
@Override
public void onSpeechStart(String s) {
//监听到合成并开始播放
Log.i(TAG, ">>>onSpeechStart()<<< s: " + s);
}
@Override
public void onSpeechProgressChanged(String s, int i) {
//监听到播放进度有变化
Log.i(TAG, ">>>onSpeechProgressChanged()<<< s: " + s);
}
@Override
public void onSpeechFinish(String s) {
//监听到播放结束
Log.i(TAG, ">>>onSpeechFinish()<<< s: " + s);
}
@Override
public void onError(String s, SpeechError speechError) {
//监听到出错
Log.i(TAG, ">>>onError()<<< description: " + speechError.description + ", code: " + speechError.code);
}
private void initialEnv() {
if (mSampleDirPath == null) {
String sdcardPath = Environment.getExternalStorageDirectory().toString();
mSampleDirPath = sdcardPath + "/" + SAMPLE_DIR_NAME;
}
File file = new File(mSampleDirPath);
if (!file.exists()) {
file.mkdirs();
}
copyFromAssetsToSdcard(false, SPEECH_FEMALE_MODEL_NAME, mSampleDirPath + "/" + SPEECH_FEMALE_MODEL_NAME);
copyFromAssetsToSdcard(false, SPEECH_MALE_MODEL_NAME, mSampleDirPath + "/" + SPEECH_MALE_MODEL_NAME);
copyFromAssetsToSdcard(false, TEXT_MODEL_NAME, mSampleDirPath + "/" + TEXT_MODEL_NAME);
copyFromAssetsToSdcard(false, LICENSE_FILE_NAME, mSampleDirPath + "/" + LICENSE_FILE_NAME);
copyFromAssetsToSdcard(false, "english/" + ENGLISH_SPEECH_FEMALE_MODEL_NAME, mSampleDirPath + "/"
+ ENGLISH_SPEECH_FEMALE_MODEL_NAME);
copyFromAssetsToSdcard(false, "english/" + ENGLISH_SPEECH_MALE_MODEL_NAME, mSampleDirPath + "/"
+ ENGLISH_SPEECH_MALE_MODEL_NAME);
copyFromAssetsToSdcard(false, "english/" + ENGLISH_TEXT_MODEL_NAME, mSampleDirPath + "/"
+ ENGLISH_TEXT_MODEL_NAME);
}
/**
* 将工程需要的资源文件拷贝到SD卡中使用(授权文件为临时授权文件,请注册正式授权)
*
* @param isCover 是否覆盖已存在的目标文件
* @param source
* @param dest
*/
public void copyFromAssetsToSdcard(boolean isCover, String source, String dest) {
File file = new File(dest);
if (isCover || (!isCover && !file.exists())) {
InputStream is = null;
FileOutputStream fos = null;
try {
is = getResources().getAssets().open(source);
String path = dest;
fos = new FileOutputStream(path);
byte[] buffer = new byte[1024];
int size = 0;
while ((size = is.read(buffer, 0, 1024)) >= 0) {
fos.write(buffer, 0, size);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

以上所述是小编给大家介绍的Android Studio应用开发集成百度语音合成使用方法实例讲解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android仿微信语音聊天界面设计

    有段时间没有看视频了,昨天晚上抽了点空时间,又看了下鸿洋大神的视频教程,又抽时间写了个学习记录.代码和老师讲的基本一样,网上也有很多相同的博客.我只是在AndroidStudio环境下写的. --主界面代码-- public class MainActivity extends Activity { private ListView mListView; private ArrayAdapter<Recorder> mAdapter; private List<Recorder>

  • Android使用百度语音识别的示例代码

    本文使用百度语音识别,完成语音识别的功能,使用百度语音识别,先要申请APP ID,这个直接到百度网站上有说明文档,本文不再赘述.申请之后,下载SDK包,按照百度官网要求,合并libs和res两个目录到项目中,然后在build.gradle(module:app)中的Android{...}下添加 sourceSets{ main{ jniLibs.srcDirs=['libs'] } } 这样, 百度语音识别的so文件才能正常使用. Manifest文件中添加权限 <uses-permissio

  • Android实现语音识别代码

    苹果的iphone 有语音识别用的是Google 的技术,做为Google 力推的Android 自然会将其核心技术往Android 系统里面植入,并结合google 的云端技术将其发扬光大. 所以Google Voice Recognition在Android 的实现就变得极其轻松. 语音识别,借助于云端技术可以识别用户的语音输入,包括语音控制等技术,下面我们将利用Google 提供的Api 实现这一功能. 功能点为:通过用户语音将用户输入的语音识别出来,并打印在列表上. 功能界面如下: 用户

  • android预置默认的语音信箱号码具体实现

    有些SIM卡在出厂时并没有预置VoiceMail number,但运营商又要求能够根据PLMN去自适应的从手机中读取到预设的VM number.在此介绍以xml的方式预置VM number的方法,以及如何允许用户去修改并能够记住用户的选择.VM number使用的优先级为: SIM卡读取>用户设置>xml预置.在用户修改voice mail number时,优先存储到SIM卡.若SIM卡存储失败,则以IMSI为单位存储到手机中. 1.支持以XML的方式预置VM number,文件名为:voic

  • Android仿微信语音聊天功能

    本文实例讲述了Android仿微信语音聊天功能代码.分享给大家供大家参考.具体如下: 项目效果如下: 具体代码如下: AudioManager.java package com.xuliugen.weichat; import java.io.File; import java.io.IOException; import java.util.UUID; import android.media.MediaRecorder; public class AudioManager { private

  • Android 轻松实现语音识别详解及实例代码

    使用Intent调用语音识别程序 说明 Android中主要通过RecognizerIntent来实现语音识别,其实代码比较简单,但是如果找不到语音识别设备,就会抛出异常 ActivityNotFoundException,所以我们需要捕捉这个异常.而且语音识别在模拟器上是无法测试的,因为语音识别是访问google 云端数据,所以如果手机的网络没有开启,就无法实现识别声音的!一定要开启手机的网络,如果手机不存在语音识别功能的话,也是无法启用识别! 注意:使用前需要安装语音识别程序.如<语音搜索>

  • Android 基于百度语音的语音交互功能(推荐)

    项目里面用到了语音唤醒功能,前面一直在用讯飞的语音识别,本来打算也是直接用讯飞的语音唤醒,但是讯飞的语音唤醒要收费,试用版只有35天有效期.只好改用百度语音,百度语音所有功能免费,功能也比较简单实用,包括语音识别,语音合成和语音唤醒,正好可以组成一套完整的语音交互功能. 效果图: 首先是语音唤醒功能,说出关键词即可叫语音识别,唤醒成功会有语音提示,这里采用了百度语音的合成功能.然后百度语音识别会根据wifi情况自动切换在线或者离线识别,但是离线识别只能识别已经导入的关键词,而且离线第一次识别需要

  • Android实现语音数据实时采集、播放

    最近做的项目是和语音实时采集并发送,对方实时接收并播放相关,下面记录下实现的核心代码. 很多Android开发者应该知道android有个MediaRecorder对象和MediaPlayer对象,用于录制和播放音频.这个弊端在于他们不能实时采集并发送出去,所以,我们只能使用AudioRecord和AudioTrack来实现. 记得申明权限: <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS&qu

  • android语音即时通讯之录音、播放功能实现代码

    在android中,实现录音与语音播放的功能算是比较简单的,但是作为参考,还是很有必要将语音相关的知识做一个简要的记录. 首先,在android中,支持录音支持两种方式.主要包括:字节流模式和文件流模式.用文件流模式进行录音操作比较简单,而且相对来说,因为其封装性比较好,录制下的文件也会比较小.但是相对于文件流模式,就没有字节流模式那么灵活,但是想要用好字节流模式还是需要下一点功夫的. 下面开始介绍文件流模式的语音操作: 文件流模式 我们来看录音部分的实现,首先我们实现开始录音的部分: 在正式编

  • Android基于讯飞语音SDK实现语音识别

    一.准备工作 1.你需要android手机应用开发基础 2.科大讯飞语音识别SDK android版 3.科大讯飞语音识别开发API文档 4.android手机 关于科大讯飞SDK及API文档,请到科大语音官网下载:http://www.xfyun.cn/ 当然SDK和API有多个版本可选,按照你的需要下载,其次,下载需要填写资料申请注册,申请通过或可获得Appid 如下图,申请一个APPID,就可以了. 二.语音识别流程 1.创建识别控件 函数原型 Public RecognizerDialo

随机推荐