安卓实时弹幕demo(四)科大讯飞语音SDK
来源:互联网 发布:windows刷新英文 编辑:程序博客网 时间:2024/05/17 06:05
///////////////2016/08/03///////////////
///////////////by xbw////////////////////
//////////////android studio//////////
先感叹一下,科大讯飞的语音识别技术着实厉害,识别率真实牛。
没用过的可以去看看,传送门
帮助文档描述比较清楚了,很好配置。。。
在下载的demo中复制以下文件
然后androidmanifest.xml中的东西也要拷贝过来
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xbw.danmu.danmu"> <!-- 【必须】 信鸽SDK所需权限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.VIBRATE" /> <!-- 【常用】 信鸽SDK所需权限 --> <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 【可选】 信鸽SDK所需权限 --> <uses-permission android:name="android.permission.RESTART_PACKAGES" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BATTERY_STATS" /> <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.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application android:name=".MyApplication" android:allowBackup="true" android:icon="@drawable/ic_launch" 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> <!-- 【必须】 (2.30及以上版新增)展示通知的activity --> <activity android:name="com.tencent.android.tpush.XGPushActivity" android:theme="@android:style/Theme.Translucent" android:exported="false" > <intent-filter> <!-- 若使用AndroidStudio,请设置android:name="android.intent.action"--> <action android:name="android.intent.action" /> </intent-filter> </activity> <!-- 【必须】 信鸽receiver广播接收 --> <receiver android:name="com.tencent.android.tpush.XGPushReceiver" android:process=":xg_service_v2" > <intent-filter android:priority="0x7fffffff" > <!-- 【必须】 信鸽SDK的内部广播 --> <action android:name="com.tencent.android.tpush.action.SDK" /> <action android:name="com.tencent.android.tpush.action.INTERNAL_PUSH_MESSAGE" /> <!-- 【必须】 系统广播:网络切换 --> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <!-- 【可选】 系统广播:开屏 --> <action android:name="android.intent.action.USER_PRESENT" /> <!-- 【可选】 一些常用的系统广播,增强信鸽service的复活机会,请根据需要选择。当然,你也可以添加APP自定义的一些广播让启动service --> <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" /> <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /> </intent-filter> <!-- 【可选】 usb相关的系统广播,增强信鸽service的复活机会,请根据需要添加 --> <intent-filter android:priority="0x7fffffff" > <action android:name="android.intent.action.MEDIA_UNMOUNTED" /> <action android:name="android.intent.action.MEDIA_REMOVED" /> <action android:name="android.intent.action.MEDIA_CHECKING" /> <action android:name="android.intent.action.MEDIA_EJECT" /> <data android:scheme="file" /> </intent-filter> </receiver> <!-- 【必须】 信鸽service --> <service android:name="com.tencent.android.tpush.service.XGPushService" android:exported="true" android:persistent="true" android:process=":xg_service_v2" /> <!-- 【必须】 通知service,其中android:name部分要改为当前包名 --> <service android:name="com.tencent.android.tpush.rpc.XGRemoteService" android:exported="true" > <intent-filter> <!-- 【必须】 请修改为当前APP名包.PUSH_ACTION,如demo的包名为:com.qq.xgdemo --> <action android:name="com.xbw.danmu.danmu.PUSH_ACTION" /> </intent-filter> </service> <!-- 已废弃,可删除之;若不删除也不会有任何副作用 --> <!--<service android:name="com.tencent.android.tpush.service.XGDaemonService" android:process=":qq_push_daemon" /> --> <!-- 【可选】信鸽拉起其他APP应用,若应用在本地找不到可以自动下载 --> <!-- <service android:name="com.tencent.android.tpush.XGDownloadService" android:enabled="true" android:exported="false" /> --> <!-- 【可选】APP实现的Receiver,用于接收消息透传和操作结果的回调,请根据需要添加 --> <!-- YOUR_PACKAGE_PATH.CustomPushReceiver需要改为自己的Receiver: --> <receiver android:name="com.xbw.danmu.danmu.MessageReceiver" android:exported="false" > <intent-filter> <!-- 接收消息透传 --> <action android:name="com.tencent.android.tpush.action.PUSH_MESSAGE" /> <!-- 监听注册、反注册、设置/删除标签、通知被点击等处理结果 --> <action android:name="com.tencent.android.tpush.action.FEEDBACK" /> </intent-filter> </receiver> <!-- 【必须】 请修改为APP的AccessId,“21”开头的10位数字,中间没空格 --> <meta-data android:name="XG_V2_ACCESS_ID" android:value="21*******" /> <!-- 【必须】 请修改为APP的AccessKey,“A”开头的12位字符串,中间没空格 --> <meta-data android:name="XG_V2_ACCESS_KEY" android:value="A******" /> </application></manifest>
string.xml中包含了apiID,必须的添加。
MainActivity.java 这个包含了弹幕跟语音,消息透传
package com.xbw.danmu.danmu;import android.app.Activity;import android.os.Environment;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.CompoundButton;import android.widget.ImageView;import android.widget.Toast;import android.widget.ToggleButton;import com.iflytek.cloud.ErrorCode;import com.iflytek.cloud.InitListener;import com.iflytek.cloud.RecognizerListener;import com.iflytek.cloud.RecognizerResult;import com.iflytek.cloud.SpeechConstant;import com.iflytek.cloud.SpeechError;import com.iflytek.cloud.SpeechRecognizer;import com.iflytek.cloud.ui.RecognizerDialog;import com.iflytek.cloud.ui.RecognizerDialogListener;import com.tencent.android.tpush.XGIOperateCallback;import com.tencent.android.tpush.XGPushManager;import com.xbw.danmu.danmu.iflytek.speech.util.JsonParser;import com.xbw.danmu.danmu.opendanmaku.DanmakuView;import org.json.JSONException;import org.json.JSONObject;import java.util.HashMap;import java.util.LinkedHashMap;public class MainActivity extends Activity { public static DanmakuView mDanmakuView; private ImageView sendDanmu; private String danmucontent = ""; // 语音听写对象 private SpeechRecognizer mIat; // 语音听写UI private RecognizerDialog mIatDialog; // 引擎类型 private String mEngineType = SpeechConstant.TYPE_CLOUD; private Toast mToast; // 用HashMap存储听写结果 private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>(); private ToggleButton danmuOpen; private ChangeDialog cd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cd=new ChangeDialog(this); cd.showChangeDialog("输入昵称"); initXGPush(); initUI(); } private void initXGPush() { XGPushManager.registerPush(this, new XGIOperateCallback() { @Override public void onSuccess(Object data, int flag) { Log.d("TPush", "注册成功,设备token为:" + data); } @Override public void onFail(Object data, int errCode, String msg) { Log.d("TPush", "注册失败,错误码:" + errCode + ",错误信息:" + msg); } }); } int ret = 0; private void initUI() { mDanmakuView = (DanmakuView) findViewById(R.id.danmakuView);//弹幕 danmuOpen = (ToggleButton) findViewById(R.id.switch1); sendDanmu = (ImageView) findViewById(R.id.imageView5);//发送弹幕 mIat = SpeechRecognizer.createRecognizer(MainActivity.this, mInitListener); // 初始化听写Dialog,如果只使用有UI听写功能,无需创建SpeechRecognizer // 使用UI听写功能,请根据sdk文件目录下的notice.txt,放置布局文件和图片资源 mIatDialog = new RecognizerDialog(MainActivity.this, mInitListener); mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT); sendDanmu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mIatResults.clear(); danmucontent = ""; // 设置参数 setParam(); boolean isShowDialog = true; if (isShowDialog) { // 显示听写对话框 mIatDialog.setListener(mRecognizerDialogListener); mIatDialog.show(); showTip(getString(R.string.text_begin)); } else { // 不显示听写对话框 ret = mIat.startListening(mRecognizerListener); if (ret != ErrorCode.SUCCESS) { showTip("听写失败,错误码:" + ret); } else { showTip(getString(R.string.text_begin)); } } } }); danmuOpen.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { mDanmakuView.show(); mDanmakuView.setVisibility(View.VISIBLE); } else { mDanmakuView.hide(); mDanmakuView.setVisibility(View.GONE); } } }); } /** * 初始化监听器。 */ private InitListener mInitListener = new InitListener() { @Override public void onInit(int code) { //Log.d(TAG, "SpeechRecognizer init() code = " + code); if (code != ErrorCode.SUCCESS) { showTip("初始化失败,错误码:" + code); } } }; /** * 听写监听器。 */ private RecognizerListener mRecognizerListener = new RecognizerListener() { @Override public void onBeginOfSpeech() { // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入 showTip("开始说话"); } @Override public void onError(SpeechError error) { // Tips: // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。 // 如果使用本地功能(语记)需要提示用户开启语记的录音权限。 showTip(error.getPlainDescription(true)); } @Override public void onEndOfSpeech() { // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入 showTip("结束说话"); } @Override public void onResult(RecognizerResult results, boolean isLast) { } @Override public void onVolumeChanged(int volume, byte[] data) { showTip("当前正在说话,音量大小:" + volume); } @Override public void onEvent(int eventType, int arg1, int arg2, Bundle obj) { } }; private void printResult(RecognizerResult results) { String text = JsonParser.parseIatResult(results.getResultString()); String sn = null; // 读取json结果中的sn字段 try { JSONObject resultJson = new JSONObject(results.getResultString()); sn = resultJson.optString("sn"); } catch (JSONException e) { e.printStackTrace(); } mIatResults.put(sn, text); StringBuffer resultBuffer = new StringBuffer(); for (String key : mIatResults.keySet()) { resultBuffer.append(mIatResults.get(key)); } danmucontent = resultBuffer.toString(); } /** * 听写UI监听器 */ private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() { public void onResult(RecognizerResult results, boolean isLast) { printResult(results); if (isLast) { // TODO 最后的结果 //printResult(results); AsyncTask_Insert_Danmu dan = new AsyncTask_Insert_Danmu(MainActivity.this); dan.execute(Config.UserName,danmucontent); } } /** * 识别回调错误. */ public void onError(SpeechError error) { showTip(error.getPlainDescription(true)); } }; private void showTip(final String str) { mToast.setText(str); mToast.show(); } /** * 参数设置 * * @param param * @return */ public void setParam() { // 清空参数 mIat.setParameter(SpeechConstant.PARAMS, null); // 设置听写引擎 mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType); // 设置返回结果格式 mIat.setParameter(SpeechConstant.RESULT_TYPE, "json"); String lag = "mandarin"; if (lag.equals("en_us")) { // 设置语言 mIat.setParameter(SpeechConstant.LANGUAGE, "en_us"); } else { // 设置语言 mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); // 设置语言区域 mIat.setParameter(SpeechConstant.ACCENT, lag); } // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理 mIat.setParameter(SpeechConstant.VAD_BOS, "4000"); // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音 mIat.setParameter(SpeechConstant.VAD_EOS, "1000"); // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点 mIat.setParameter(SpeechConstant.ASR_PTT, "1"); // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限 // 注:AUDIO_FORMAT参数语记需要更新版本才能生效 mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav"); mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/iat.wav"); } @Override protected void onPause() { super.onPause(); mDanmakuView.hide(); mDanmakuView.setVisibility(View.GONE); } @Override public void onResume() { super.onResume(); mDanmakuView.show(); mDanmakuView.setVisibility(View.VISIBLE); } @Override protected void onDestroy() { super.onDestroy(); mDanmakuView.clear(); mIat.cancel(); mIat.destroy(); }}
好了
0 0
- 安卓实时弹幕demo(四)科大讯飞语音SDK
- 安卓实时弹幕demo(一)弹幕效果
- 安卓实时弹幕demo(一)弹幕效果
- 安卓实时弹幕demo(二)消息透传
- 安卓实时弹幕demo(二)消息透传
- 安卓实时弹幕demo(三)消息透传服务器
- 科大讯飞语音demo
- 科大讯飞语音识别 demo
- Unity5.0后(unity5.3.5)讯飞语音听写安卓sdk的开发
- 安卓Android科大讯飞语音识别代码使用详解
- AndroidStudio集成科大讯飞语音SDK
- 科大讯飞语音SDK使用流程
- 安卓弹幕实现
- 实时弹幕(swoole+websocket)
- 讯飞语音听写Demo
- c# 讯飞语音 sdk
- 科大讯飞语音合成Demo讲讲(做做玩,超简)
- 安卓实现直播弹幕
- ceoi2011 切题记
- SpringMVC学习笔记1:springMVC1 springmvc的基础知识
- ios监测相册变化
- How to fix "OLE DB provider is not registered"
- Activity/Fragment 状态缓存和恢复的最佳实践
- 安卓实时弹幕demo(四)科大讯飞语音SDK
- PHP寻找子栏目
- 16. 3Sum Closest
- Mysql学习系列
- BFS广度优先遍历
- 剑指Offer:二进制中1的个数
- Oracle PL/SQL显示游标、隐式游标、游标循环
- vim配置--命令行简单(文章最后)
- Picasso 使用心得