讯飞在线语音合成
2015-08-29 22:13
260 查看
讯飞在线语音合成
效果图
源码
下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9062261下载SDK
1. 选择服务
2. 选择平台
3. 选择应用
4. 下载SDK
说明
之前的工程都是在Eclipse下演示的,随着Android Studio的普及,我这里也开始使用Android Studio写Demo,虽然细节导入jar包和so库的过程可能不太一样,但是整体的流程是一样的。将jar包和so库导入Android Studio工程
将jar包copy到libs目录下
在main目录下创建jniLibs目录,将so文件copy过来
添加网络权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET"/>
初始化
在清单文件中application标签下添加name属性
android:name=".InitApplication"
初始化
package com.example.kongqw.kqwspeechcompounddemo; import android.app.Application; import android.widget.Toast; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechUtility; /** * Created by kongqw on 2015/8/29. */ public class InitApplication extends Application { @Override public void onCreate() { Toast.makeText(this, "InitApplication", Toast.LENGTH_LONG).show(); // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null // 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true" // 参数间使用“,”分隔。 // 设置你申请的应用appid StringBuffer param = new StringBuffer(); param.append("appid=55d33f09"); param.append(","); param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC); // param.append(","); // param.append(SpeechConstant.FORCE_LOGIN + "=true"); SpeechUtility.createUtility(InitApplication.this, param.toString()); super.onCreate(); } }
语音合成工具类
package com.example.kongqw.kqwspeechcompounddemo.engine; import android.content.Context; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; import com.iflytek.cloud.ErrorCode; import com.iflytek.cloud.InitListener; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechError; import com.iflytek.cloud.SpeechSynthesizer; import com.iflytek.cloud.SynthesizerListener; /** * 语音合成的类 发音人明细http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=367 * * @author kongqw */ public class KqwSpeechCompound { // Log标签 private static final String TAG = "KqwSpeechCompound"; // 上下文 private Context mContext; // 语音合成对象 private static SpeechSynthesizer mTts; /** * 发音人 */ public final static String[] COLOUD_VOICERS_ENTRIES = {"小燕", "小宇", "凯瑟琳", "亨利", "玛丽", "小研", "小琪", "小峰", "小梅", "小莉", "小蓉", "小芸", "小坤", "小强 ", "小莹", "小新", "楠楠", "老孙",}; public final static String[] COLOUD_VOICERS_VALUE = {"xiaoyan", "xiaoyu", "catherine", "henry", "vimary", "vixy", "xiaoqi", "vixf", "xiaomei", "xiaolin", "xiaorong", "xiaoqian", "xiaokun", "xiaoqiang", "vixying", "xiaoxin", "nannan", "vils",}; /** * 构造方法 * * @param context */ public KqwSpeechCompound(Context context) { // 上下文 mContext = context; // 初始化合成对象 mTts = SpeechSynthesizer.createSynthesizer(mContext, new InitListener() { @Override public void onInit(int code) { if (code != ErrorCode.SUCCESS) { Log.i(TAG, "初始化失败,错误码:" + code); } } }); } /** * 开始合成 * * @param text */ public void speaking(String text) { // 非空判断 if (TextUtils.isEmpty(text)) { return; } int code = mTts.startSpeaking(text, mTtsListener); if (code != ErrorCode.SUCCESS) { if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) { Toast.makeText(mContext, "没有安装语音+ code = " + code, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(mContext, "语音合成失败,错误码: " + code, Toast.LENGTH_SHORT).show(); } } } /* * 停止语音播报 */ public static void stopSpeaking() { // 对象非空并且正在说话 if (null != mTts && mTts.isSpeaking()) { // 停止说话 mTts.stopSpeaking(); } } /** * 判断当前有没有说话 * * @return */ public static boolean isSpeaking() { if (null != mTts) { return mTts.isSpeaking(); } else { return false; } } /** * 合成回调监听。 */ private SynthesizerListener mTtsListener = new SynthesizerListener() { @Override public void onSpeakBegin() { Log.i(TAG, "开始播放"); } @Override public void onSpeakPaused() { Log.i(TAG, "暂停播放"); } @Override public void onSpeakResumed() { Log.i(TAG, "继续播放"); } @Override public void onBufferProgress(int percent, int beginPos, int endPos, String info) { // TODO 缓冲的进度 Log.i(TAG, "缓冲 : " + percent); } @Override public void onSpeakProgress(int percent, int beginPos, int endPos) { // TODO 说话的进度 Log.i(TAG, "合成 : " + percent); } @Override public void onCompleted(SpeechError error) { if (error == null) { Log.i(TAG, "播放完成"); } else if (error != null) { Log.i(TAG, error.getPlainDescription(true)); } } @Override public void onEvent(int eventType, int arg1, int arg2, Bundle obj) { } }; /** * 参数设置 * * @return */ private void setParam() { // 清空参数 mTts.setParameter(SpeechConstant.PARAMS, null); // 引擎类型 网络 mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); // 设置发音人 mTts.setParameter(SpeechConstant.VOICE_NAME, COLOUD_VOICERS_VALUE[0]); // 设置语速 mTts.setParameter(SpeechConstant.SPEED, "50"); // 设置音调 mTts.setParameter(SpeechConstant.PITCH, "50"); // 设置音量 mTts.setParameter(SpeechConstant.VOLUME, "100"); // 设置播放器音频流类型 mTts.setParameter(SpeechConstant.STREAM_TYPE, "3"); // mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/KRobot/wavaudio.pcm"); // 背景音乐 1有 0 无 // mTts.setParameter("bgs", "1"); } }
测试类
package com.example.kongqw.kqwspeechcompounddemo; import android.app.Activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.example.kongqw.kqwspeechcompounddemo.engine.KqwSpeechCompound; public class MainActivity extends Activity { private EditText mEtText; private KqwSpeechCompound mKqwSpeechCompound; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEtText = (EditText) findViewById(R.id.et_text); // 初始化语音合成对象 mKqwSpeechCompound = new KqwSpeechCompound(this); } /** * 开始合成 * * @param view */ public void start(View view) { Toast.makeText(this, "开始合成 : " + mEtText.getText().toString().trim(), Toast.LENGTH_SHORT).show(); mKqwSpeechCompound.speaking(mEtText.getText().toString().trim()); } }
XML页面布局
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <EditText android:id="@+id/et_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="语音合成的内容" android:textSize="20dp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/et_text" android:gravity="center" android:onClick="start" android:text="语音合成" android:textSize="20dp" /> </RelativeLayout>
相关文章推荐
- chmod chown umask命令的使用和正则表达
- HP--day06--输入一组数去重并排序
- HDU 5422:Rikka with Graph
- BestCoder Round #53
- PullScrollView详解(六)——延伸拓展(listview中getScrollY()一直等于0、ScrollView中的overScrollBy)
- 讯飞在线语音合成
- 增加个人博客地址,欢迎访问
- 统计数据的类型的划分
- HDU 5422:Rikka with Graph
- [C++]Kth Smallest Element in a BST 在一个二叉排序树中找第k小的元素
- C模板实现STL容器中的vector
- LeetCode Linked List Cycle
- 二叉树的建立
- 用Python实现基本排序算法03——插入排序
- javascript 面向对象
- AJAX 跨域 :Access-Control-Allow-Origin
- LeetCode Linked List Cycle
- 编写灵活、稳定、高质量的 HTML 和 CSS 代码的规范。
- TextNut文件保存路径
- Linux 内存管理机制