讯飞语音_讯飞语音识别 - CSDN
精华内容
参与话题
  • 语音听写SDK适配安卓6.0需要手动申请权限 关于语音听写SDK的开发,参考科大讯飞开放平台官网为准在百度搜索讯飞科技开放平台,自己注册账号 自己创建一个新应用在控制台界面创建完应用,然后选择SDK下载选择需要的...

    语音听写SDK适配安卓6.0需要手动申请权限
    关于语音听写SDK的开发,参考科大讯飞开放平台官网为准

    在百度搜索讯飞科技开放平台,自己注册账号 自己创建一个新应用

    这里写图片描述

    在控制台界面创建完应用,然后选择SDK下载

    这里写图片描述

    选择需要的SDK进行下载(这里我们选择的是组合下载前两个)

    这里写图片描述

    解压下载包,在libs中对应导入Android Studio中 jar包需要Add As Library操作 jnilibs文件夹自建
    语音识别返回的是JSON数据需要添加Gson依赖
    j
    这里写图片描述
    复制assets文件夹到项目中
    这里写图片描述
    项目结构 —— 下面只有Demo文件夹中的类和布局,忽略MainActivity
    这里写图片描述
    添加权限

    <!--连接网络权限,用于执行云端语音能力 -->    
    <uses-permission android:name="android.permission.INTERNET" />    
    <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->    
    <uses-permission android:name="android.permission.RECORD_AUDIO" />    
    <!--读取网络信息状态 -->    
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    
    <!--获取当前wifi状态 -->    
    <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.READ_CONTACTS" />    
    <!--外存储写权限,构建语法需要用到此权限 -->    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    
    <!--外存储读权限,构建语法需要用到此权限 -->    
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />    
    <!--配置权限,用来记录应用配置信息 -->    
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />    
    <!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务--> <!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->    
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    

    以下代码根据项目结构复制

    Main2Activity界面

    package com.example.xunfei.Demo;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.example.xunfei.R;
    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.SpeechSynthesizer;
    import com.iflytek.cloud.SpeechUtility;
    import com.iflytek.cloud.SynthesizerListener;
    import com.iflytek.cloud.ui.RecognizerDialog;
    import com.iflytek.cloud.ui.RecognizerDialogListener;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.util.HashMap;
    import java.util.LinkedHashMap;
    
    public class Main2Activity extends AppCompatActivity implements View.OnClickListener {
    
        private EditText et_input;
        private TextView text2;
        private Button btn_startspeech;
        private Button btn_startspeektext;
    
        // 用HashMap存储听写结果
        private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //加载布局
            setContentView(R.layout.activity_main2);
             将“xxxxxxx”替换成您申请的 APPID    =   不要删除 
            SpeechUtility.createUtility(this, SpeechConstant.APPID + "=xxxxxxx");//初始化SDK
            initView();
        }
    
    
        private void speekText() {
            //1. 创建 SpeechSynthesizer 对象 , 第二个参数: 本地合成时传 InitListener
            SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(this, null);
    //2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类
    //设置发音人(更多在线发音人,用户可参见 附录 13.2
            mTts.setParameter(SpeechConstant.VOICE_NAME, "vixyun"); // 设置发音人
            mTts.setParameter(SpeechConstant.SPEED, "50");// 设置语速
            mTts.setParameter(SpeechConstant.VOLUME, "100");// 设置音量,范围 0~100
            mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端
    //设置合成音频保存位置(可自定义保存位置),保存在 “./sdcard/iflytek.pcm”
    //保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限
    //仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码
            mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
    //3.开始合成
            mTts.startSpeaking(et_input.getText().toString(), new MySynthesizerListener());
    
        }
    
        class MySynthesizerListener implements SynthesizerListener {
    
            @Override
            public void onSpeakBegin() {
                showTip(" 开始播放 ");
            }
    
            @Override
            public void onSpeakPaused() {
                showTip(" 暂停播放 ");
            }
    
            @Override
            public void onSpeakResumed() {
                showTip(" 继续播放 ");
            }
    
            @Override
            public void onBufferProgress(int percent, int beginPos, int endPos,
                                         String info) {
                // 合成进度
            }
    
            @Override
            public void onSpeakProgress(int percent, int beginPos, int endPos) {
                // 播放进度
            }
    
            @Override
            public void onCompleted(SpeechError error) {
                if (error == null) {
                    showTip("播放完成 ");
                } else if (error != null) {
                    showTip(error.getPlainDescription(true));
                }
            }
    
            @Override
            public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
                // 以下代码用于获取与云端的会话 id,当业务出错时将会话 id提供给技术支持人员,可用于查询会话日志,定位出错原因
                // 若使用本地能力,会话 id为null
                //if (SpeechEvent.EVENT_SESSION_ID == eventType) {
                //     String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
                //     Log.d(TAG, "session id =" + sid);
                //}
            }
        }
    
        private void startSpeechDialog() {
            //1. 创建RecognizerDialog对象
            RecognizerDialog mDialog = new RecognizerDialog(this, new MyInitListener());
            //2. 设置accent、 language等参数
            mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");// 设置中文
            mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
            // 若要将UI控件用于语义理解,必须添加以下参数设置,设置之后 onResult回调返回将是语义理解
            // 结果
            // mDialog.setParameter("asr_sch", "1");
            // mDialog.setParameter("nlp_version", "2.0");
            //3.设置回调接口
            mDialog.setListener(new MyRecognizerDialogListener());
            //4. 显示dialog,接收语音输入
            mDialog.show();
        }
    
        class MyRecognizerDialogListener implements RecognizerDialogListener {
    
            /**
             * @param results
             * @param isLast  是否说完了
             */
            @Override
            public void onResult(RecognizerResult results, boolean isLast) {
                String result = results.getResultString(); //为解析的
                showTip(result);
                System.out.println(" 没有解析的 :" + result);
    
                String text = JsonParser.parseIatResult(result);//解析过后的
                System.out.println(" 解析后的 :" + text);
    
                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));
                }
    
                et_input.setText(resultBuffer.toString());// 设置输入框的文本
                et_input.setSelection(et_input.length());//把光标定位末尾
            }
    
            @Override
            public void onError(SpeechError speechError) {
    
            }
        }
    
        class MyInitListener implements InitListener {
    
            @Override
            public void onInit(int code) {
                if (code != ErrorCode.SUCCESS) {
                    showTip("初始化失败 ");
                }
    
            }
        }
    
        /**
         * 语音识别
         */
        private void startSpeech() {
            //1. 创建SpeechRecognizer对象,第二个参数: 本地识别时传 InitListener
            SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(this, null); //语音识别器
            //2. 设置听写参数,详见《 MSC Reference Manual》 SpeechConstant类
            mIat.setParameter(SpeechConstant.DOMAIN, "iat");// 短信和日常用语: iat (默认)
            mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");// 设置中文
            mIat.setParameter(SpeechConstant.ACCENT, "mandarin");// 设置普通话
            //3. 开始听写
            mIat.startListening(mRecoListener);
        }
    
    
        // 听写监听器
        private RecognizerListener mRecoListener = new RecognizerListener() {
            // 听写结果回调接口 (返回Json 格式结果,用户可参见附录 13.1);
    //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;
    //关于解析Json的代码可参见 Demo中JsonParser 类;
    //isLast等于true 时会话结束。
            public void onResult(RecognizerResult results, boolean isLast) {
                Log.e("yyyy", results.getResultString());
                System.out.println(results.getResultString());
                showTip(results.getResultString());
            }
    
            // 会话发生错误回调接口
            public void onError(SpeechError error) {
                showTip(error.getPlainDescription(true));
                // 获取错误码描述
                Log.e("yyyyy", "error.getPlainDescription(true)==" + error.getPlainDescription(true));
            }
    
            // 开始录音
            public void onBeginOfSpeech() {
                showTip(" 开始录音 ");
            }
    
            //volume 音量值0~30, data音频数据
            public void onVolumeChanged(int volume, byte[] data) {
                showTip(" 声音改变了 ");
            }
    
            // 结束录音
            public void onEndOfSpeech() {
                showTip(" 结束录音 ");
            }
    
            // 扩展用接口
            public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
            }
        };
    
        private void showTip(String data) {
            Toast.makeText(this, data, Toast.LENGTH_SHORT).show();
        }
    
    
        private void initView() {
            et_input = (EditText) findViewById(R.id.et_input);
            text2 = (TextView) findViewById(R.id.text2);
            btn_startspeech = (Button) findViewById(R.id.btn_startspeech);
            btn_startspeektext = (Button) findViewById(R.id.btn_startspeektext);
    
            btn_startspeech.setOnClickListener(this);
            btn_startspeektext.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_startspeech:
                    //语音识别(把声音转文字)
                    startSpeechDialog();
                    break;
                case R.id.btn_startspeektext:
                    // 语音合成(把文字转声音)
                    speekText();
    
                    break;
            }
        }
        private void submit() {
            // validate
            String input = et_input.getText().toString().trim();
            if (TextUtils.isEmpty(input)) {
                Toast.makeText(this, "请输入文本信息 ...", Toast.LENGTH_SHORT).show();
                return;
            }
    
        }
    }
    

    JsonParser类

    package com.example.xunfei.Demo;
    
    import org.json.JSONArray;
    import org.json.JSONObject;
    import org.json.JSONTokener;
    
    /**
     * Created by 墨鸦 on 2017/12/27.
     */
    
    public class JsonParser {
    
        public static String parseIatResult(String json) {
            StringBuffer ret = new StringBuffer() ;
            try {
                JSONTokener tokener = new JSONTokener(json) ;
                JSONObject joResult = new JSONObject(tokener) ;
    
                JSONArray words = joResult.getJSONArray("ws" );
                for (int i = 0; i < words.length(); i++) {
                    // 转写结果词,默认使用第一个结果
                    JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
                    JSONObject obj = items.getJSONObject(0 );
                    ret.append(obj.getString("w" ));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return ret.toString();
        }
    
        public static String parseGrammarResult(String json) {
            StringBuffer ret = new StringBuffer() ;
            try {
                JSONTokener tokener = new JSONTokener(json) ;
                JSONObject joResult = new JSONObject(tokener) ;
    
                JSONArray words = joResult.getJSONArray("ws" );
                for (int i = 0; i < words.length(); i++) {
                    JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
                    for (int j = 0; j < items.length() ; j++)
                    {
                        JSONObject obj = items.getJSONObject(j);
                        if (obj.getString("w").contains( "nomatch"))
                        {
                            ret.append( "没有匹配结果.") ;
                            return ret.toString();
                        }
                        ret.append( "【结果】" + obj.getString("w" ));
                        ret.append("【置信度】 " + obj.getInt("sc" ));
                        ret.append("\n ");
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                ret.append(" 没有匹配结果 .");
            }
            return ret.toString();
        }
    
        public static String parseLocalGrammarResult(String json) {
            StringBuffer ret = new StringBuffer() ;
            try {
                JSONTokener tokener = new JSONTokener(json) ;
                JSONObject joResult = new JSONObject(tokener) ;
    
                JSONArray words = joResult.getJSONArray("ws" );
                for (int i = 0; i < words.length(); i++) {
                    JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
                    for (int j = 0; j < items.length() ; j++)
                    {
                        JSONObject obj = items.getJSONObject(j);
                        if (obj.getString("w").contains( "nomatch"))
                        {
                            ret.append( "没有匹配结果.") ;
                            return ret.toString();
                        }
                        ret.append( "【结果】" + obj.getString("w" ));
                        ret.append("\n ");
                    }
                }
                ret.append("【置信度】 " + joResult.optInt("sc" ));
    
            } catch (Exception e) {
                e.printStackTrace();
                ret.append(" 没有匹配结果 .");
            }
            return ret.toString();
        }
    
    }

    布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".Demo.Main2Activity">
    
        <EditText
            android:id="@+id/et_input"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:layout_margin="10dp"
            android:hint="请输入文本信息 ..."
            android:textSize="20sp"/>
    
        <TextView
            android:id="@+id/text2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="这是文字"
            android:textSize="20sp"/>
    
        <Button
            android:id="@+id/btn_startspeech"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="点击按钮语音输入 "
            android:textSize="20sp" />
    
        <Button
            android:id="@+id/btn_startspeektext"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="语音合成(把文字转声音) "
            android:textSize="20sp" />
    </LinearLayout>
    
    展开全文
  • 讯飞语音——唤醒

    万次阅读 2015-08-19 12:54:01
    讯飞语音唤醒 唤醒功能,顾名思义,通过语音,唤醒服务,做我们想做的事情。效果图(开启应用后说讯飞语音或者讯飞语点唤醒)源码下载 地址:http://download.csdn.net/detail/q4878802/9023213步骤1. 创建应用,...

    讯飞语音唤醒

    唤醒功能,顾名思义,通过语音,唤醒服务,做我们想做的事情。

    • 效果图(开启应用后说讯飞语音或者讯飞语点唤醒)

    P4

    • 源码下载

    地址:http://download.csdn.net/detail/q4878802/9023213

    步骤

    1. 创建应用,开通服务

    地址:http://blog.csdn.net/q4878802/article/details/47762169

    2. 下载SDK

    我们要使用的是讯飞的付费功能,选择唤醒服务,点击下载以后,会提示没有购买。点击“购买服务
    P1

    点击购买一会看到付费情况,有项目需要,就必须购买,我们写Demo,讯飞给提供了体验版的SDK,和正式版的没有功能上的区别,但是只能试用35天,装机量只有3个,唤醒词不能改,只有“讯飞语音”和“讯飞语点”两个唤醒词。
    P2

    3. 解压SDK

    assets目录下是一些图片资源文件

    doc目录下是一些开发文档

    libs目录下是一些jar包和so库

    res目录下是语音的资源文件,非常重要

    sample目录下是Demo

    P3

    4. 集成语音唤醒

    可以按照开发文档的介绍,一步一步跟着做,实现唤醒功能

    地址:http://www.xfyun.cn/doccenter/awd

    我个人的习惯是看Demo,开发文档只是做一个参考,我个人感觉这样更直接,开发效率更高。

    步骤

    1. 将Demo导入IDE,跑起来。
    2. 在手机上找到功能的入口,根据一些界面上显示的关键字,找到控件。
    3. 根据控件ID,在代码找到对应功能的的代码。
    4. 找到功能的核心代码以后,看看当前的方法或者类在哪里有用到,怎么用的,是如何初始化的然后集成到自己的工程里,就OK了。
    5. 下载的SDK里给的一些资源不是白给的,是和你的appid对应的,你要将demo的appid换成你自己的appid,资源文件也要拷贝到的你的工程里,才能正常使用。

    开发步骤

    1. 添加权限

    这里用到的唤醒功能不是所有的权限都用到的,具体用到了哪些权限,可以看上面的链接,用到哪写权限就加哪些权限,这个为了快速方便测试,把讯飞用到的权限都加上了。

    <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" />

    2. 初始化appid

    我是将appid的初始化放在的Applicaiton下,具体可以下载源码

    // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史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(InitKqwSpeech.this, param.toString()); 

    3. 工具类

    初始化好了以后直接复制工具类就可以用了

    package com.example.kqwspeechdemo.engine;
    import org.json.JSONException;
    import org.json.JSONObject;
    import com.iflytek.cloud.SpeechConstant;
    import com.iflytek.cloud.SpeechError;
    import com.iflytek.cloud.SpeechUtility;
    import com.iflytek.cloud.VoiceWakeuper;
    import com.iflytek.cloud.WakeuperListener;
    import com.iflytek.cloud.WakeuperResult;
    import com.iflytek.cloud.util.ResourceUtil;
    import com.iflytek.cloud.util.ResourceUtil.RESOURCE_TYPE;
    import android.content.Context;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.Toast;
    
    /**
     * 语音唤醒
     * 
     * @author kongqw
     * 
     */
    public abstract class KqwWake {
    
        /**
         * 唤醒的回调
         */
        public abstract void kqwWake();
    
        // Log标签
        private static final String TAG = "KqwWake";
    
        // 上下文
        private Context mContext;
        // 语音唤醒对象
        private VoiceWakeuper mIvw;
    
        /*
         * TODO 设置门限值 : 门限值越低越容易被唤醒,需要自己反复测试,根据不同的使用场景,设置一个比较合适的唤醒门限
         */
        // private final static int MAX = 60;
        // private final static int MIN = -20;
        private int curThresh = 40;
    
        public KqwWake(Context context) {
            mContext = context;
    
            // 加载识唤醒地资源,resPath为本地识别资源路径
            StringBuffer param = new StringBuffer();
            String resPath = ResourceUtil.generateResourcePath(context, RESOURCE_TYPE.assets, "ivw/55d33f09.jet");
            param.append(ResourceUtil.IVW_RES_PATH + "=" + resPath);
            param.append("," + ResourceUtil.ENGINE_START + "=" + SpeechConstant.ENG_IVW);
            boolean ret = SpeechUtility.getUtility().setParameter(ResourceUtil.ENGINE_START, param.toString());
            if (!ret) {
                Log.d(TAG, "启动本地引擎失败!");
            }
            // 初始化唤醒对象
            mIvw = VoiceWakeuper.createWakeuper(context, null);
    
        };
    
        /**
         * 唤醒
         */
        public void wake() {
            // 非空判断,防止因空指针使程序崩溃
            mIvw = VoiceWakeuper.getWakeuper();
            if (mIvw != null) {
                // textView.setText(resultString);
                // 清空参数
                mIvw.setParameter(SpeechConstant.PARAMS, null);
                // 唤醒门限值,根据资源携带的唤醒词个数按照“id:门限;id:门限”的格式传入
                mIvw.setParameter(SpeechConstant.IVW_THRESHOLD, "0:" + curThresh);
                // 设置唤醒模式
                mIvw.setParameter(SpeechConstant.IVW_SST, "wakeup");
                // 设置持续进行唤醒
                mIvw.setParameter(SpeechConstant.KEEP_ALIVE, "1");
                mIvw.startListening(mWakeuperListener);
            } else {
                Toast.makeText(mContext, "唤醒未初始化", Toast.LENGTH_SHORT).show();
            }
        }
    
        public void stopWake() {
            mIvw = VoiceWakeuper.getWakeuper();
            if (mIvw != null) {
                mIvw.stopListening();
            } else {
                Toast.makeText(mContext, "唤醒未初始化", Toast.LENGTH_SHORT).show();
            }
        }
    
        String resultString = "";
        private WakeuperListener mWakeuperListener = new WakeuperListener() {
    
            @Override
            public void onResult(WakeuperResult result) {
                try {
                    String text = result.getResultString();
                    JSONObject object;
                    object = new JSONObject(text);
                    StringBuffer buffer = new StringBuffer();
                    buffer.append("【RAW】 " + text);
                    buffer.append("\n");
                    buffer.append("【操作类型】" + object.optString("sst"));
                    buffer.append("\n");
                    buffer.append("【唤醒词id】" + object.optString("id"));
                    buffer.append("\n");
                    buffer.append("【得分】" + object.optString("score"));
                    buffer.append("\n");
                    buffer.append("【前端点】" + object.optString("bos"));
                    buffer.append("\n");
                    buffer.append("【尾端点】" + object.optString("eos"));
                    resultString = buffer.toString();
                    stopWake();
                    kqwWake();
                } catch (JSONException e) {
                    resultString = "结果解析出错";
                    e.printStackTrace();
                }
            }
    
            @Override
            public void onError(SpeechError error) {
                Log.i(TAG, error.getPlainDescription(true));
            }
    
            @Override
            public void onBeginOfSpeech() {
                Log.i(TAG, "开始说话");
            }
    
            @Override
            public void onEvent(int eventType, int isLast, int arg2, Bundle obj) {
    
            }
        };
    
    }

    测试类

    package com.example.kqwspeechdemo;
    
    import com.example.kqwspeechdemo.engine.KqwWake;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        private TextView mTvLog;
        private TextView mTvResult;
        private KqwWake kqwWake;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mTvLog = (TextView) findViewById(R.id.tv_log);
            mTvResult = (TextView) findViewById(R.id.tv_result);
    
            kqwWake = new KqwWake(this) {
                @Override
                public void kqwWake() {
                    Toast.makeText(MainActivity.this, "Debug:\n唤醒成功", Toast.LENGTH_SHORT).show();
                    // 开启唤醒
                    kqwWake.wake();
                }
            };
            // 开启唤醒
            kqwWake.wake();
        }
    }

    页面布局

    <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"
        tools:context="com.example.kqwspeechdemo.MainActivity" >
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#FF000000"
            android:gravity="center"
            android:padding="10dp"
            android:text="唤醒词:讯飞语音、讯飞语点"
            android:textColor="#FFFFFFFF"
            android:textSize="20dp" />
    
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#FFFFFFFF" />
    
        <TextView
            android:id="@+id/tv_log"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#FF000000"
            android:gravity="center"
            android:padding="10dp"
            android:text="录音信息"
            android:textColor="#FFFFFFFF"
            android:textSize="10dp" />
    
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#FFFFFFFF" />
    
        <TextView
            android:id="@+id/tv_result"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FF000000"
            android:padding="10dp"
            android:text="返回结果"
            android:textColor="#FFFFFFFF"
            android:textSize="10dp" />
    
    </LinearLayout>

    注意

    1. 如果你直接用我的Demo,我用的是测试版的离线包,只有35天的试用期,而且装机量只有3个,如果大家都用,很可能是不能正常运行的
    2. 如果是参考我的demo自己写一个,千万不要忘记替换appid和资源文件。
    展开全文
  • 讯飞语音的使用及常遇到的问题

    万次阅读 2016-12-29 13:08:54
    讯飞语音是科大讯飞推出的以语音交互技术为核心的人工智能开放平台,为开发者免费提供语音识别、语音合成等语音技术SDK,人脸识别、声纹识别等。  最常遇到问题:  一、错误码21001,没有安装语音组件(在最下方有...

      讯飞语音是科大讯飞推出的以语音交互技术为核心的人工智能开放平台,为开发者免费提供语音识别、语音合成等语音技术SDK,人脸识别、声纹识别等。

      最常遇到问题:

         一、错误码21001,没有安装语音组件(在最下方有全部的错误码和解决方案)

         解决方案:

         1、有没有使用SpeechUtility.createUtility()设置appid。
         2、有没有将libmsc.so放到工程中。
         3、如果使用的是讯飞语音+的本地功能,有没有安装讯飞语音+。
         4、如果设备是android 5.0及其以上,需要将工程中的armeabi和armeabi-v7a文件夹中都放上libmsc.so,如果你下载的SDK中没有armeabi-v7a对应的库,可以将armeabi中的libmsc.so复制一份到armeabi-v7a文件夹中。
         5、SpeechUtility.createUtility()如在Application中调用,需要在Mainifest中注册该Applicaiton。此方法不是必须在Appcation中调用,可在需要使用语音能力之前,例如进入语音搜索页面调用。
         6、使用Android Studio的开发者注意将so放在jniLib目录下,或者在配置文件中指定so加载的路径。

         二、错误码:10407,用户校验失败

         原因:是因为没有下载跟应用名称对应的sdk,讯飞语音一个应用对应一个sdk,所以要下载跟我开发的应用名称相对应的sdk,将其lib库考到project的libs文件夹下。也就是首先对照注册的appid与在Application初始化中的appid是不是一样。

                     三、错误码:11208,授权应用失败

                   原因:先检查appid的申请时间(35天期限),还要注意所有的资源文件都是最新的

    使用步骤:

    一、讯飞语音SDK的获取   

      讯飞语音官网:http://www.xfyun.cn/

       

      集成讯飞功能的流程(实际上集成大部分开发平台的SDK,其流程都是如此)

        

       填写信息方可使用第三方平台提供功能

        

        语音听写,创建应用

           

               

        选择自己应用的功能

      

       选择对应功能的SDK,进行下载

               

         最终的应用信息,注意要记住appid

      

      下载后的文件夹,其中assets是图片资源,doc是官方文档及使用说明(下面代码和注释都是用的官方使用文档)

      libs是我们需要拷贝到项目中的资源,sample是一个些demo。

      

      

    二、导入SDK

       将下载的开发工具包中libs目录下的Msc.jar和armeabi(实际还有多个文件,全部拷贝进来,以便机型适配)复制到Android工程的libs目录。 

          

    三、在项目build.gradle文件的android{}内,配置下面一段代码,同步一下gradle文件。

    empty sourceSets{
            main{
                jniLibs.srcDir'libs'
            }
        }

    四、在清单文件进行权限配置
    <!--连接网络权限,用于执行云端语音能力 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <!--读取网络信息状态 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!--获取当前wifi状态 -->
    <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.READ_CONTACTS"/>
    <!-- 如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
    <uses-permission android:name="android.permission.CAMERA" />

    五、为了便于快速开发,SDK提供了一套默认的语音输入UI,若使用,请将SDK资源包assets下的文件拷贝至项目的asstes目录下(studio没有,就把assets复制到src->main下)


    六、初始化讯飞语音SDK:

        只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下(注意在清单文件中注册Application,这里的appid就是上面注册的appid):

    public class MyApplication extends Application {
        @Override
        public void onCreate() {
            // 将“12345678”替换成您申请的 APPID,申请地址:http://www.xfyun.cn
            // 请勿在“=”与 appid 之间添加任务空字符或者转义符
            SpeechUtility.createUtility(this, SpeechConstant.APPID + "=586365ef");
            super.onCreate();
        }
    }

    七、执行识别语音为文字的的逻辑代码(放到点击事件中):
    //1.创建RecognizerDialog对象,第二参数就是一个初始化的监听,我们用不上就设置为null
    RecognizerDialog mDialog = new RecognizerDialog(this,null);
    //2.设置accent、language等参数
    mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//设置为中文模式
    mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//设置为普通话模式
    //若要将UI控件用于语义理解,必须添加以下参数设置,设置之后onResult回调返回将是语义理解
    //mDialog.setParameter("asr_sch", "1");
    //mDialog.setParameter("nlp_version", "2.0");
    //3.设置回调接口,语音识别后,得到数据,做响应的处理.
    mDialog.setListener(new RecognizerDialogListener() {
    //识别成功执行 参数1 recognizerResult:识别出的结果,Json格式(用户可参见附录12.1)  
    // 参数2 b:等于true时会话结束。方法才不会继续回调
    //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加,(关于解析Json的代码可参见MscDemo中JsonParser类)
    @Override
    public void onResult(RecognizerResult recognizerResult, boolean b) {
    //拿到讯飞识别的结果
    String resultString = recognizerResult.getResultString();
    System.out.println("讯飞识别的结果 "+resultString);
    System.out.println("b参数是什么 "+b);
    }
    @Override//识别失败执行 speechError:错误码
    public void onError(SpeechError speechError) {
    }
    });
    //4.显示dialog,接收语音输入
    mDialog.show();

    八、创建Bean类,以用来存放讯飞语音识别的结果json数据。

    public class XFBean {
       public ArrayList ws;
       public class WS{
           public ArrayList cw;
       }
        public class CW{
           public String w;
       }
    }

    九、创建解析讯飞识别结果bean数据的方法,使用谷歌的Gson。

    private String parseData(String resultString) {
           //创建gson对象,记得要关联一下gson.jar包方可以使用.
           Gson gson = new Gson();
           //参数 1.String类型的json数据 参数 2.存放json数据对应的bean类
           XFBean xfBean = gson.fromJson(resultString, XFBean.class);
           //创建一个集合,用来存放bean类里的对象.
           ArrayList ws = xfBean.ws;
           //创建一个容器,用来存放从每个集合里拿到的数据,使用StringBuilder效率更高
           StringBuilder stringBuilder = new StringBuilder();
           //使用高级for循环,取出特定属性的特有数据,装入StringBuilder中
             for ( XFBean.WS w: ws) {
               String text = w.cw.get(0).w;
               stringBuilder.append(text);
            }
           //把容器内的数据转为字符串返回出去.
           return stringBuilder.toString();
       }

    十、执行识别语音为文字的的逻辑代码(之前的拿到的数据是无法直接使用的bean数据,现在就是解析出来的最终String类型数据)。

    //1.创建RecognizerDialog对象,第二参数就是一个初始化的监听,我们用不上就设置为null
           RecognizerDialog mDialog = new RecognizerDialog(this,null);
           //2.设置accent、language等参数
           mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//设置为中文模式
           mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//设置为普通话模式
           //若要将UI控件用于语义理解,必须添加以下参数设置,设置之后onResult回调返回将是语义理解
           //mDialog.setParameter("asr_sch", "1");
           //mDialog.setParameter("nlp_version", "2.0");
           //创建一个装每次解析数据的容器(你说话有停顿,解析就是一段一段的,而用容器就能拼接成一句话了)
           mStringBuilder = new StringBuilder();
           //3.设置回调接口,语音识别后,得到数据,做响应的处理.
           mDialog.setListener(new RecognizerDialogListener() {
               //识别成功执行 参数1 recognizerResult:识别出的结果,Json格式(用户可参见附录12.1) 
               // 参数2 b:等于true时会话结束。方法才不会继续回调
               //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加,(关于解析Json的代码可参见MscDemo中JsonParser类)
               public void onResult(RecognizerResult recognizerResult, boolean b) {
                   //拿到讯飞识别的结果
                   String resultString = recognizerResult.getResultString();
                   System.out.println("讯飞识别的结果 "+resultString);
                   //自定义解析bean数据的一个方法.用到了Gson,在项目里关联一下.
                   String text = parseData(resultString);
                   //容器装解析出来的数据
                   mStringBuilder.append(text);
                   //对参数2进行判断,如果为true,代表这个方法不会再回调,就把容器里的数据转成字符串.拿来使用.
                   if(b){
                        String result = mStringBuilder.toString();
                        System.out.println("话说完,最终的结果 : "+ result);
                        }
                    }
                   @Override//识别失败执行 speechError:错误码
                   public void onError(SpeechError speechError) {
                   }
                });
                //4.显示dialog,接收语音输入
                mDialog.show();
    

    十一、讯飞固定的把文字转文语音的逻辑代码,把String参数传进去,然后调用此方法即可

     public void TextToVoice(String text){
    //1.创建SpeechSynthesizer对象, 第一个参数上下文,第二个参数:本地合成时传InitListener
            SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(this, null);
            //2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类
            mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//设置发音人
            mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速
            mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量,范围0~100
            mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端,这些功能用到讯飞服务器,所以要有网络.
            //设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm”
            //保存在SD卡需要在AndroidManifest.xml添加写SD卡权限
            //如果不需要保存合成音频,注释该行代码
            mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
            //3.开始合成,第一个参数就是转成声音的文字,可以自定义  第二个参数是合成监听器对象.我们不需要对声音有什么特殊处理,就传null
       mTts.startSpeaking(text,null);
     }
    

    十二、使智能语音能根据用户说的话,回答相映的内容,这就需要拿到用户说话的结果,进行判断,回答对应的内容。

    //回答对象,在没有匹配到用户说的话,默认输出语句
    String answer="不好意思,没有听清楚";
    //这里的result参数,就是我们通过讯飞听写里最终拿到用户说话的结果
    if(result.contains("你好")){
       answer="你好,我是智能语音助手";
    }else if(result.contains("谁是世界上最帅的人")){
       answer="哈哈,当然是您";
    }else if (result.contains("中午吃什么")) {
                                    String[] anwserList = new String[]{"火锅", "烧烤", "烤鱼", "麻辣烫"};
                                    int random = (int) (Math.random() * anwserList.length);
                                    anwser = anwserList[random];
    }
    //调用语音助手说话的方法,把回答对象传进去.
    TextToVoice(answer);

    提示:程序没有办法运行到模拟器上,因为模拟器没有麦克风的回调接口,只能运行在真机上。



    讯飞官方提供的错误码及解决办法:






















    展开全文
  • 讯飞语音离线DEMO

    2020-07-21 11:39:12
    自己调试看看了,我觉得还可以,主要是需要了解下整个的内容和方式
  • 讯飞语音

    2017-11-02 21:16:36
    1.首先在讯飞开放平台注册账号 http://www.xfyun.cn/?ch=bdtg 2.在控制台添加应用 获得APPID 然后添加应用 之后就是下载SDK了 在组合服务下载SDK中下载 下载好后解压出来得到以下文件 把libs下的资源放入...

    1.首先在讯飞开放平台注册账号
    http://www.xfyun.cn/?ch=bdtg

    2.在控制台添加应用 获得APPID
    这里写图片描述

    然后添加应用
    这里写图片描述

    之后就是下载SDK了
    在组合服务下载SDK中下载
    这里写图片描述

    下载好后解压出来得到以下文件
    这里写图片描述

    把libs下的资源放入到你的工程的libs下面
    手动添加到依赖库add as library

    你还需要把assets文件夹复制到main下面
    这里写图片描述

    在项目build.gradle文件的android{}内,配置下面一段代码,同步一下gradle文件

    sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }

    当然还必须有权限了

      <!--连接网络权限,用于执行云端语音能力 -->
        <uses-permission android:name="android.permission.INTERNET"/>
        <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
        <uses-permission android:name="android.permission.RECORD_AUDIO"/>
        <!--读取网络信息状态 -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <!--获取当前wifi状态 -->
        <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.READ_CONTACTS"/>
        <!-- 如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
        <uses-permission android:name="android.permission.CAMERA" />

    接下来就是代码了

    先创建一个Application类在里面进行配置

    public class MyApp extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            //讯飞语音
            SpeechUtility.createUtility(this, SpeechConstant.APPID +"=你的APPID");
        }
    }

    记得在Manifest.xml中配置
    这里写图片描述

    注意这里的“=”号不能删除哦


    public class JsonParser {
        public static String parseIatResult(String json) {
            StringBuffer ret = new StringBuffer() ;
            try {
                JSONTokener tokener = new JSONTokener(json) ;
                JSONObject joResult = new JSONObject(tokener) ;
    
                JSONArray words = joResult.getJSONArray("ws" );
                for (int i = 0; i < words.length(); i++) {
                    // 转写结果词,默认使用第一个结果
                    JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
                    JSONObject obj = items.getJSONObject(0 );
                    ret.append(obj.getString("w" ));
    //                  如果需要多候选结果,解析数组其他字段
    //                 for(int j = 0; j < items.length(); j++)
    //                 {
    //                      JSONObject obj = items.getJSONObject(j);
    //                      ret.append(obj.getString("w"));
    //                 }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return ret.toString();
        }
    
        public static String parseGrammarResult(String json) {
            StringBuffer ret = new StringBuffer() ;
            try {
                JSONTokener tokener = new JSONTokener(json) ;
                JSONObject joResult = new JSONObject(tokener) ;
    
                JSONArray words = joResult.getJSONArray("ws" );
                for (int i = 0; i < words.length(); i++) {
                    JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
                    for (int j = 0; j < items.length() ; j++)
                    {
                        JSONObject obj = items.getJSONObject(j);
                        if (obj.getString("w").contains( "nomatch"))
                        {
                            ret.append( "没有匹配结果.") ;
                            return ret.toString();
                        }
                        ret.append( "【结果】" + obj.getString("w" ));
                        ret.append("【置信度】 " + obj.getInt("sc" ));
                        ret.append("\n ");
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                ret.append(" 没有匹配结果 .");
            }
            return ret.toString();
        }
    
        public static String parseLocalGrammarResult(String json) {
            StringBuffer ret = new StringBuffer() ;
            try {
                JSONTokener tokener = new JSONTokener(json) ;
                JSONObject joResult = new JSONObject(tokener) ;
    
                JSONArray words = joResult.getJSONArray("ws" );
                for (int i = 0; i < words.length(); i++) {
                    JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
                    for (int j = 0; j < items.length() ; j++)
                    {
                        JSONObject obj = items.getJSONObject(j);
                        if (obj.getString("w").contains( "nomatch"))
                        {
                            ret.append( "没有匹配结果.") ;
                            return ret.toString();
                        }
                        ret.append( "【结果】" + obj.getString("w" ));
                        ret.append("\n ");
                    }
                }
                ret.append("【置信度】 " + joResult.optInt("sc" ));
    
            } catch (Exception e) {
                e.printStackTrace();
                ret.append(" 没有匹配结果 .");
            }
            return ret.toString();
        }
    }


    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    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.SpeechSynthesizer;
    import com.iflytek.cloud.SpeechUtility;
    import com.iflytek.cloud.SynthesizerListener;
    import com.iflytek.cloud.ui.RecognizerDialog;
    import com.iflytek.cloud.ui.RecognizerDialogListener;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.util.HashMap;
    import java.util.LinkedHashMap;
    
    import static com.bawei.guolijun20171101.R.id.btn_startspeech;
    import static com.bawei.guolijun20171101.R.id.btn_startspeektext;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    
        private Button btn1;
        private Button btn2;
        private EditText et_input;
        private static final String TAG = MainActivity.class .getSimpleName();
        private HashMap<String, String> mIatResults = new LinkedHashMap<String , String>();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
            btn1 = (Button) findViewById(btn_startspeech);
            btn2 = (Button) findViewById(btn_startspeektext);
            et_input = (EditText) findViewById(R.id.et_input);
          btn1.setOnClickListener(this);
            btn2.setOnClickListener(this);
            initSpeech() ;
        }
        private void initSpeech() {
            // 将“12345678”替换成您申请的 APPID,申请地址: http://www.xfyun.cn
            // 请勿在 “ =”与 appid 之间添加任务空字符或者转义符
            SpeechUtility.createUtility(this, SpeechConstant.APPID + "=59f855b9");
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_startspeech: //语音识别(把声音转文字)
                    startSpeechDialog();
                    break;
                case R.id. btn_startspeektext:// 语音合成(把文字转声音)
                    speekText();
                    break;
            }
    
        }
        private void speekText() {
            //1. 创建 SpeechSynthesizer 对象 , 第二个参数: 本地合成时传 InitListener
            SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer( this, null);
    //2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类
    //设置发音人(更多在线发音人,用户可参见 附录 13.2
            mTts.setParameter(SpeechConstant. VOICE_NAME, "vixyun" ); // 设置发音人
            mTts.setParameter(SpeechConstant. SPEED, "50" );// 设置语速
            mTts.setParameter(SpeechConstant. VOLUME, "80" );// 设置音量,范围 0~100
            mTts.setParameter(SpeechConstant. ENGINE_TYPE, SpeechConstant. TYPE_CLOUD); //设置云端
    //设置合成音频保存位置(可自定义保存位置),保存在 “./sdcard/iflytek.pcm”
    //保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限
    //仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码
            mTts.setParameter(SpeechConstant. TTS_AUDIO_PATH, "./sdcard/iflytek.pcm" );
    //3.开始合成
            mTts.startSpeaking( et_input.getText().toString(), new MySynthesizerListener()) ;
    
        }
        class MySynthesizerListener implements SynthesizerListener{
    
            @Override
            public void onSpeakBegin() {
                showTip(" 开始播放 ");
            }
    
            @Override
            public void onSpeakPaused() {
                showTip(" 暂停播放 ");
            }
    
            @Override
            public void onSpeakResumed() {
                showTip(" 继续播放 ");
            }
    
            @Override
            public void onBufferProgress(int percent, int beginPos, int endPos ,
                                         String info) {
                // 合成进度
            }
    
            @Override
            public void onSpeakProgress(int percent, int beginPos, int endPos) {
                // 播放进度
            }
    
            @Override
            public void onCompleted(SpeechError error) {
                if (error == null) {
                    showTip("播放完成 ");
                } else if (error != null ) {
                    showTip(error.getPlainDescription( true));
                }
            }
    
            @Override
            public void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {
                // 以下代码用于获取与云端的会话 id,当业务出错时将会话 id提供给技术支持人员,可用于查询会话日志,定位出错原因
                // 若使用本地能力,会话 id为null
                //if (SpeechEvent.EVENT_SESSION_ID == eventType) {
                //     String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
                //     Log.d(TAG, "session id =" + sid);
                //}
            }
    
        }
        private void startSpeechDialog() {
            //1. 创建RecognizerDialog对象
            RecognizerDialog mDialog = new RecognizerDialog(this, new MyInitListener()) ;
            //2. 设置accent、 language等参数
            mDialog.setParameter(SpeechConstant. LANGUAGE, "zh_cn" );// 设置中文
            mDialog.setParameter(SpeechConstant. ACCENT, "mandarin" );
            // 若要将UI控件用于语义理解,必须添加以下参数设置,设置之后 onResult回调返回将是语义理解
            // 结果
            // mDialog.setParameter("asr_sch", "1");
            // mDialog.setParameter("nlp_version", "2.0");
            //3.设置回调接口
            mDialog.setListener( new MyRecognizerDialogListener()) ;
            //4. 显示dialog,接收语音输入
            mDialog.show() ;
        }
        class MyRecognizerDialogListener implements RecognizerDialogListener {
    
            /**
             * @param results
             * @param isLast  是否说完了
             */
            @Override
            public void onResult(RecognizerResult results, boolean isLast) {
                String result = results.getResultString(); //为解析的
                showTip(result) ;
                System. out.println(" 没有解析的 :" + result);
    
                String text = JsonParser.parseIatResult(result) ;//解析过后的
                System. out.println(" 解析后的 :" + text);
    
                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));
                }
    
                et_input.setText(resultBuffer.toString());// 设置输入框的文本
                et_input .setSelection(et_input.length()) ;//把光标定位末尾
            }
    
            @Override
            public void onError(SpeechError speechError) {
    
            }
        }
    
        class MyInitListener implements InitListener {
    
            @Override
            public void onInit(int code) {
                if (code != ErrorCode.SUCCESS) {
                    showTip("初始化失败 ");
                }
    
            }
        }
        private void startSpeech() {
            //1. 创建SpeechRecognizer对象,第二个参数: 本地识别时传 InitListener
            SpeechRecognizer mIat = SpeechRecognizer.createRecognizer( this, null); //语音识别器
            //2. 设置听写参数,详见《 MSC Reference Manual》 SpeechConstant类
            mIat.setParameter(SpeechConstant. DOMAIN, "iat" );// 短信和日常用语: iat (默认)
            mIat.setParameter(SpeechConstant. LANGUAGE, "zh_cn" );// 设置中文
            mIat.setParameter(SpeechConstant. ACCENT, "mandarin" );// 设置普通话
            //3. 开始听写
            mIat.startListening( mRecoListener);
        } private RecognizerListener mRecoListener = new RecognizerListener() {
            // 听写结果回调接口 (返回Json 格式结果,用户可参见附录 13.1);
    //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;
    //关于解析Json的代码可参见 Demo中JsonParser 类;
    //isLast等于true 时会话结束。
            public void onResult(RecognizerResult results, boolean isLast) {
                Log.e (TAG, results.getResultString());
                System.out.println(results.getResultString()) ;
                showTip(results.getResultString()) ;
            }
    
            // 会话发生错误回调接口
            public void onError(SpeechError error) {
                showTip(error.getPlainDescription(true)) ;
                // 获取错误码描述
                Log. e(TAG, "error.getPlainDescription(true)==" + error.getPlainDescription(true ));
            }
    
            // 开始录音
            public void onBeginOfSpeech() {
                showTip(" 开始录音 ");
            }
    
            //volume 音量值0~30, data音频数据
            public void onVolumeChanged(int volume, byte[] data) {
                showTip(" 声音改变了 ");
            }
    
            // 结束录音
            public void onEndOfSpeech() {
                showTip(" 结束录音 ");
            }
    
            // 扩展用接口
            public void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {
            }
        };
    
        private void showTip (String data) {
            Toast.makeText( this, data, Toast.LENGTH_SHORT).show() ;
        }
    
    }
    
    
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn_startspeech"
        android:text="语音识别 "
        />
        <Button
            android:id="@+id/btn_startspeektext"
            android:text="语音合成"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <EditText
            android:id="@+id/et_input"
            android:layout_margin="10dp"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:hint="请输入文本信息 ..." />
    
    
      如果设备是android 5.0及其以上,需要将工程中的armeabi和armeabi-v7a文件夹中都放上libmsc.so,如果你下载的SDK中没有armeabi-v7a对应的库,可以将armeabi中的libmsc.so复制一份到armeabi-v7a文件夹中。



    展开全文
  • H5调用讯飞语音接口实现在线语音听写测评

    万次阅读 热门讨论 2016-06-11 19:54:26
    韩顺平老师是我的人生导师,所以,老规矩,先看效果,后讲解:下面是效果...1.在讯飞语音平台注册,创建一个应用并下载相应的sdk 2.将下载后的sdk解压,里面有很多example(demo)的,随便打开一个,copy
  • 讯飞离线语音合成(语记|语音+)

    万次阅读 2015-09-09 16:32:52
    讯飞离线语音合成(语记|语音+) 讯飞语音合成有三种方式 在线语音合成(免费) 离线使用语记语音合成(免费,需要本地装一个语记App并且下载离线资源) 使用讯飞离线语音包(付费) 这里使用语记实现...
  • 如何通过讯飞语音将文本合成后的语音保存到本地 2014-2-21分类:Android, 解决方案, 随手实例 | 暂无评论 转自:http://www.krislq.com/2014/02/voicecloud_local/ 讯飞大家一定都非常的熟悉。最近...
  • 讯飞语音识别和唤醒开发示例

    千次阅读 2018-07-30 21:02:40
    讯飞语音识别和唤醒开发示例 最近需要用到讯飞的语音识别和语音唤醒的功能,就对这方面进行了一下简单研究。 本文帮助大家简单入门,并且提供几个代码示例给大家参考。 讯飞开发者网址:https://www.xfyun.cn/ ...
  • 这次给大家带来的是项目的离线语音功能。 讯飞开放平台中的离线语音 首先创建开放平台的账号,这个不必多说 然后创建新应用 选择我的应用,如下图,注意下我打马赛克的地方...
  • 讯飞语音听写开发入门之获取appid号

    千次阅读 2016-06-13 15:49:44
    首先申请开发者用户(http://member.voicecloud.cn/index.php/default/register),注册账号,
  • 讯飞语音的详细配置使用

    千次阅读 2016-10-09 17:59:50
    首先祝各位国庆长假玩的愉快!!! 讯飞语音的详细配置...腾讯推出腾讯云,百度也有自己的百度语音等,科大讯飞旗下的讯飞输入法,讯飞语音是两个不错的服务。我们了解一下讯飞语音的配置使用。图文教程简单易上手。
  • 讯飞语音+”语音识别开放功能使用方法介绍

    万次阅读 多人点赞 2014-06-11 10:29:07
    本文介绍了讯飞语音+接入的方法和基本功能的介绍
  • 讯飞语音SDK提示用户校验失败10407

    万次阅读 2016-09-28 09:55:00
    在使用讯飞语音SDK中遇到错误:用户校验失败10407。原因是一个应用申请的Appid和对应下载的SDK具有一致性,SDK不通用。 另外吐槽一下,讯飞开发平台里只能添加应用,不能删除。
  • 讯飞大家一定都非常的熟悉。最近需要把做个小功能来把文字转换成语音,所以网上搜索了下,刚好讯飞在android...如果下载讯飞的开发包就不多说了,直接去: 讯飞语音开发者平台 下载好后,里面有开发包及文档说明。但
  • unity接讯飞语音识别SDK(windows平台)

    千次阅读 热门讨论 2018-07-24 09:30:01
    上一篇只是shi'实现C#接讯飞语音识别SDK,这一篇在unity中实现语音识别 1、在unitygong工yin'音频资源 2、导入SDK中的msc: 3、创建脚本,封装dll,步骤就不重复了 4、做一个处理音频的接口,传入appid,会话...
  • 讯飞语音输入法解包即用,绿色便携免安装版,官方版本的讯飞语音输入法用着还算不错,只可惜还要安装,在安装那个拼音输入法的基础上,本身支持手写,当然是用鼠标写了,而且安装之后会多出一个服务占用主进程,这点...
  • 微信小程序+讯飞语音实现个人语音助手

    万次阅读 热门讨论 2018-05-19 11:56:05
    ​ 本案例主要 实现一个微信小程序语音助手,可以以提供的功能如下: 语音输入 返回结果 小程序 北京的天气 雨水将短暂停歇,最高气温回升至28℃。 语音播放 返回结果 讲个笑话 随机返回一个笑话 ...
  • 首先在讯飞官网下载语音识别的SDK,这些网上教程很多。(下载window平台语音听写SDK) 1、创建一个C#工程 按照讯飞官网的说明文档(https://doc.xfyun.cn/msc_windows/SDK%E5%8C%85%E5%AF%BC%E5%85%A5.html)将SDK...
  • 讯飞语音,感受微信输入新体验

    千次阅读 2013-06-26 09:09:44
    但其针对文本输入略显费力,尤其是长文本的输入,而讯飞语音凭借其强大的语音优势,可以与微信平台完美结合,在微信中使用讯飞语音插件,能够快速将语音转化为文本,让您只动口不动手,即可成为输入达人,让您玩微信...
1 2 3 4 5 ... 20
收藏数 4,884
精华内容 1,953
关键字:

讯飞语音