安卓实时弹幕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
原创粉丝点击