上回分解,拍立知其中一个功能就是利用文字转成语音再播放出来,这期写一下如何使用。
(在开始之前,强烈建议仔细阅读 百度语音-语音合成-SDK开发文档 能减少90%开发时候遇到的问题。 )
(结合官方demo阅读效果更佳 )
首先,从百度ai上download下百度tts的sdk包(http://ai.baidu.com/sdk)。
下载解压后是个完整的工程,里面已经有几个完整的demo了,而且介绍也是十分的详细,操作之前可以都尝试一下有什么效果。
SynthActivity: 合成demo。含在线和离线,没有纯离线功能。 根据网络状况优先走在线,在线时访问服务器失败后转为离线。
MiniActivity:精简版合成。
SaveFileActivity :保存合成后的音频。
接下来先看一下我的项目文件,control、listener、util三个文件夹可以在 百度tts语音合成示例中找到,移植过来这边,还有一个MainHandlerConstant文件。(根据你们的实际要求适当增减,这个是以我的示例为例)
三个Activity就是主要的工程文件,MainActivity是进入界面后的处理,startActivity是进入的旋转页面,ViewActiviy作为主界面的跳转。
接下来介绍MainActivity里面实现功能,首先从页面看起,页面布局如下:
百度tts语音合成用武之地就在语音播放这里。
我们看一下百度tts语音合成MainActivity位于的设计:
一、首先定义必要的调用信息:
protected String appId = "你的百度appId";
protected String appKey = "你的百度appKey ";
protected String secretKey = "你的百度secretKey";
private TtsMode ttsMode = TtsMode.ONLINE;//设置TTS模式,这是仅在线
protected SpeechSynthesizer mSpeechSynthesizer;//初始化SpeechSynthesizer
String Speck_TEXT="尚未有识别项目,请识别后点击。";//这个是保存Text显示的内容
private Button mSpeak;//这些控件可以自行定义,还有一些就不全部展示
private Button mStop;
private TextView mShowText;
二、精简其函数(这里我只用了在线的模式,所以大部分代码可以裁剪)
这个初始化的initTTs函数(在onCreate里面初始化一下),好像音量(男/女)、声音、语速这些,在https://ai.baidu.com/docs#/TTS-Android-SDK/top下有详细的变量解释。
private void initTTs() {
LoggerProxy.printable(true);
SpeechSynthesizerListener listener = new UiMessageListener(mainHandler);
// 1. 获取实例
mSpeechSynthesizer = SpeechSynthesizer.getInstance();
mSpeechSynthesizer.setContext(this);
// 2. 设置listener
mSpeechSynthesizer.setSpeechSynthesizerListener(listener);
// 3. 设置appId,appKey.secretKey
int result = mSpeechSynthesizer.setAppId(appId);
checkResult(result, "setAppId");
result = mSpeechSynthesizer.setApiKey(appKey, secretKey);
checkResult(result, "setApiKey");
mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "3");
// 设置合成的音量,0-9 ,默认 5
mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "9");
// 设置合成的语速,0-9 ,默认 5
mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "3");
// 设置合成的语调,0-9 ,默认 5
mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");
mSpeechSynthesizer.setAudioStreamType(AudioManager.MODE_IN_CALL);
Map params = new HashMap<>();
InitConfig initConfig = new InitConfig(appId, appKey, secretKey, ttsMode, params, listener);
result = mSpeechSynthesizer.initTts(ttsMode);
checkResult(result, "initTts");
}
一个speak(),一个stop()定义事件。
private void speak() {
if (mSpeechSynthesizer == null) {
print("[ERROR], 初始化失败");
return;
}
mShowText.setText("");
mShowText.setText(Speck_TEXT);
Toast.makeText(getApplicationContext(),"正在连接播放...请稍等",Toast.LENGTH_LONG).show();
int result = mSpeechSynthesizer.speak("播放开始"+Speck_TEXT+"语音播放播放完成");//speak 在这
checkResult(result, "speak");//获取错误代码
}
private void stop() {
print("停止播放!");//停止合成引擎
int result = mSpeechSynthesizer.stop();
checkResult(result, "stop");
}
initView()在于监听是否有onClick, checkResult这个是回传结果,如果有错误会回传错误代码。
// 下面是UI部分
private void initView() {
mSpeak = (Button) this.findViewById(R.id.start);
mStop = (Button) this.findViewById(R.id.pause);
mShowText = (TextView) this.findViewById(R.id.showText);
View.OnClickListener listener = new View.OnClickListener() {
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.start:
speak();
break;
case R.id.pause:
stop();
break;
default:
break;
}
}
};
mSpeak.setOnClickListener(listener);
mStop.setOnClickListener(listener);
mainHandler = new Handler() {
// @param msg
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.obj != null) {
//print(msg.obj.toString());//调试作用
}
}
};
}
private void print(String message) {
Log.i(TAG, message);
mShowText.append(message + "\n");
}
@Override
protected void onDestroy() {
if (mSpeechSynthesizer != null) {
mSpeechSynthesizer.stop();
mSpeechSynthesizer.release();
mSpeechSynthesizer = null;
print("释放资源成功");
}
super.onDestroy();
}
private void checkResult(int result, String method) {
if (result != 0) {
print("error code :" + result + " method:" + method + ", 错误码文档:http://yuyin.baidu.com/docs/tts/122 ");
}
System.out.println("错误参数:"+result);
if(result == -15 )
{
Toast.makeText(getApplicationContext(),"语音请求超时,请重新点击播放或切换网络环境。",Toast.LENGTH_LONG).show();
}
}
下面就是一个对于权限的获取,后面调用相机应用也需要某些权限,所以这里申请。
private void initPermission() {
String[] permissions = {
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.MODIFY_AUDIO_SETTINGS,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.WRITE_SETTINGS,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.CHANGE_WIFI_STATE
};
ArrayList toApplyList = new ArrayList();
for (String perm : permissions) {
if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) {
toApplyList.add(perm);
// 进入到这里代表没有权限.
}
}
String[] tmpList = new String[toApplyList.size()];
if (!toApplyList.isEmpty()) {
ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123);
}
}
对应的, AndroidManifest.xml也要做权限的注册。
以上就是百度tts语音合成使用在MainActivity中的简单调用,通过修改Speck_TEXT修改播放内容。
播放是函数speak()方法,做处理的是函数下这句
mSpeechSynthesizer.speak("播放开始"+Speck_TEXT+"语音播放播放完成")
下一节,介绍相机功能的调用和百度图像识别功能的调用。