离线语音识别 讯飞_讯飞语音识别 离线语音识别 - CSDN
精华内容
参与话题
  • 从科大讯飞官方Demo中提取的语音识别部分代码加以修改,可实现在线与离线语音识别,下载后需要填写自己的APPID以及修改成与ID相匹配的讯飞SDK,实测可运行。
  • 讯飞离线语音命令词识别

    万次阅读 2019-03-18 09:23:05
    讯飞离线语音命令词识别 1、注册并下载sdk 2、创建工程 3、权限 4、拷贝jar包 5、初始化引擎 6、功能代码 7、打赏1、注册并下载sdk讯飞官网地址:http://www.xfyun.cn/*选择立即开通并登录* 弹出对话框,选择创建...

    讯飞离线语音命令词识别

    强烈推荐

    分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来! 网址:http://www.captainbed.net/yancyang

    • 1、注册并下载sdk
    • 2、创建工程
    • 3、权限
    • 4、拷贝jar包
    • 5、初始化引擎
    • 6、功能代码
    • 7、打赏

    弹出对话框,选择创建应用。

    这里写图片描述

    按照提示填写。

    应用创建完毕,接下来就是开通服务,以及获取AppID了。

    这里写图片描述

    Yancy是我创建的应用名称,记住AppID,选择开通服务为离线命令词识别

    • 2、创建工程

    Android studio创建工程就不说了。

    3、权限

    拷贝权限到功能清单文件中。

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

    4、拷贝jar包
    下载的SDK文档中so库太多,离线命令词识别只需要用到 Msc.jar和libmsc.so

    上传的资源下载需要积分,这里就放百度云。

    地址:https://pan.baidu.com/s/1hsanJBe

    密码:523z

    记得关联jar包与.so库

    5、初始化引擎

    public class SpeechApp extends Application {
    
        @Override
        public void onCreate() {
            // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null
            // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true"
            // 参数间使用“,”分隔。
            // 设置你申请的应用appid
    
            // 注意: appid 必须和下载的SDK保持一致,否则会出现10407错误
    		// 5a4448f4更换成自己的appID.
            StringBuffer param = new StringBuffer();
            param.append("appid=5a4448f4");
            param.append(",");
            // 设置使用v5+
            param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC);
            SpeechUtility.createUtility(SpeechApp.this, param.toString());
            super.onCreate();
        }
    }
    

    别忘了,在功能清单中申明Application 。

       <application
            android:name=".SpeechApp"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            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>
        </application>
    

    6、功能代码

    package hyco_voice.hyco.com.hycovoicedemo;
    
    import android.content.SharedPreferences;
    import android.os.Environment;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import com.iflytek.cloud.ErrorCode;
    import com.iflytek.cloud.GrammarListener;
    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.util.ResourceUtil;
    
    import static com.iflytek.cloud.SpeechConstant.TYPE_LOCAL;
    
    public class MainActivity extends AppCompatActivity {
    
        private static final String TAG = "yancy";
    
        private EditText message;
    
        // 语音识别对象
        private SpeechRecognizer mAsr;
        private Toast mToast;
    
        //引擎类型 本地
        private String mEngineType = TYPE_LOCAL;
    
        // 本地语法构建路径
        private String grmPath = Environment.getExternalStorageDirectory()
                .getAbsolutePath() + "/msc/test";
        // 返回结果格式,支持:xml,json
        private String mResultType = "json";
    
        // 本地语法文件
        private String mLocalGrammar = null;
    
        private final String GRAMMAR_TYPE_BNF = "bnf";
    
        // 缓存
        private SharedPreferences mSharedPreferences;
    
        private final String KEY_GRAMMAR_ABNF_ID = "grammar_abnf_id";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            message = findViewById(R.id.message);
    
            // 1.初始化识别对象
            mAsr = SpeechRecognizer.createRecognizer(this, mInitListener);
            mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
    
    
            //2.构件语法
            build();
        }
    
        /**
         * 1.1 初始化监听器。
         */
        private InitListener mInitListener = new InitListener() {
            @Override
            public void onInit(int code) {
                Log.e(TAG, "SpeechRecognizer init() code = " + code);
                if (code != ErrorCode.SUCCESS) {
                    showTip("初始化失败,错误码:" + code);
                }
            }
        };
        String mContent;// 语法、词典临时变量
    
        //2.构件语法
        public void build() {
            mLocalGrammar = FucUtil.readFile(this, "call.bnf", "utf-8");
            mSharedPreferences = getSharedPreferences(getPackageName(), MODE_PRIVATE);
            message.setText(mLocalGrammar);
            mContent = new String(mLocalGrammar);
            mAsr.setParameter(SpeechConstant.PARAMS, null);
            // 设置文本编码格式
            mAsr.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");
            // 设置引擎类型
            mAsr.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
            // 设置语法构建路径
            mAsr.setParameter(ResourceUtil.GRM_BUILD_PATH, grmPath);
            //使用8k音频的时候请解开注释
    //					mAsr.setParameter(SpeechConstant.SAMPLE_RATE, "8000");
            // 设置资源路径
            mAsr.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());
            ret = mAsr.buildGrammar(GRAMMAR_TYPE_BNF, mContent, grammarListener);
            if (ret != ErrorCode.SUCCESS) {
                showTip("语法构建失败,错误码:" + ret);
            }
        }
    
        /**
         * 2.1 构建语法监听器。
         */
        private GrammarListener grammarListener = new GrammarListener() {
            @Override
            public void onBuildFinish(String grammarId, SpeechError error) {
                if (error == null) {
                    if (mEngineType.equals(SpeechConstant.TYPE_CLOUD)) {
                        SharedPreferences.Editor editor = mSharedPreferences.edit();
                        if (!TextUtils.isEmpty(grammarId))
                            editor.putString(KEY_GRAMMAR_ABNF_ID, grammarId);
                        editor.commit();
                    }
                    showTip("语法构建成功:" + grammarId);
                } else {
                    showTip("语法构建失败,错误码:" + error.getErrorCode());
                }
            }
        };
    
        int ret = 0;//返回值
    
        /**
         * 点击事件
         *
         * @param view
         */
        public void onClick(View view) {
            if (null == mAsr) {
                // 创建单例失败,与 21001 错误为同样原因,参考 http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=9688
                this.showTip("创建对象失败,请确认 libmsc.so 放置正确,\n 且有调用 createUtility 进行初始化");
                return;
            }
            // 设置参数
            if (!setParam()) {
                showTip("请先构建语法。");
                return;
            }
            ret = mAsr.startListening(mRecognizerListener);
            if (ret != ErrorCode.SUCCESS) {
                showTip("识别失败,错误码: " + ret);
            }
        }
    
        /**
         * toast 消息
         *
         * @param str
         */
        private void showTip(final String str) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mToast.setText(str);
                    mToast.show();
                }
            });
        }
    
        /**
         * 识别监听器。
         */
        private RecognizerListener mRecognizerListener = new RecognizerListener() {
    
            @Override
            public void onVolumeChanged(int volume, byte[] data) {
                showTip("当前正在说话,音量大小:" + volume);
                Log.d(TAG, "返回音频数据:" + data.length);
            }
    
            @Override
            public void onResult(final RecognizerResult result, boolean isLast) {
                if (null != result && !TextUtils.isEmpty(result.getResultString())) {
                    Log.d(TAG, "recognizer result:" + result.getResultString());
                    String text = "";
                    if (mResultType.equals("json")) {
                        text = JsonParser.parseGrammarResult(result.getResultString(), mEngineType);
                    }/* else if (mResultType.equals("xml")) {
                        text = XmlParser.parseNluResult(result.getResultString());
                    }*/
                    // 显示
                    message.setText(text);
                } else {
                    Log.d(TAG, "recognizer result : null");
                }
            }
    
            @Override
            public void onEndOfSpeech() {
                // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
                showTip("结束说话");
            }
    
            @Override
            public void onBeginOfSpeech() {
                // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
                showTip("开始说话");
            }
    
            @Override
            public void onError(SpeechError error) {
                showTip("onError Code:" + error.getErrorCode());
            }
    
            @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);
                //	}
            }
    
        };
    
        public boolean setParam() {
            boolean result = false;
            // 清空参数
            mAsr.setParameter(SpeechConstant.PARAMS, null);
            // 设置识别引擎
            mAsr.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
            if (TYPE_LOCAL.equalsIgnoreCase(mEngineType)) {
                // 设置本地识别资源
                mAsr.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());
                // 设置语法构建路径
                mAsr.setParameter(ResourceUtil.GRM_BUILD_PATH, grmPath);
                // 设置返回结果格式
                mAsr.setParameter(SpeechConstant.RESULT_TYPE, mResultType);
                // 设置本地识别使用语法id
                mAsr.setParameter(SpeechConstant.LOCAL_GRAMMAR, "call");
                // 设置识别的门限值
                mAsr.setParameter(SpeechConstant.MIXED_THRESHOLD, "30");
                // 使用8k音频的时候请解开注释
    //			mAsr.setParameter(SpeechConstant.SAMPLE_RATE, "8000");
                result = true;
            }
            // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
            // 注:AUDIO_FORMAT参数语记需要更新版本才能生效
            mAsr.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
            mAsr.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/asr.wav");
            return result;
        }
    
        //获取识别资源路径
        private String getResourcePath() {
            StringBuffer tempBuffer = new StringBuffer();
            //识别通用资源
            tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, "asr/common.jet"));
            //识别8k资源-使用8k的时候请解开注释
            //tempBuffer.append(";");
            //tempBuffer.append(ResourceUtil.generateResourcePath(this, RESOURCE_TYPE.assets, "asr/common_8k.jet"));
            return tempBuffer.toString();
        }
    }
    
    

    DEMO下载http://download.csdn.net/download/weixin_39923324/10178489

    百度云Demo下载地址

    如果运行中出现问题,欢迎留下你的评论。
    转注注明出处。

    强烈推荐

    分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来! 网址:http://www.captainbed.net/yancyang

    展开全文
  • 讯飞离线语音识别.zip

    2020-07-30 23:31:29
    基于android的离线语音识别,实现没有网络的情况下把语音转换成文字信息。 对程序内容进行了简化,内容简单明了,容易看懂。 包含了离线语音需要的所有离线包 speechapp.java文件第22行修改成自己在讯飞网站申请的id...
  • 用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现) 本人接的任务,做离线语音识别,用的是科大讯飞的离线识别,java不支持离线了,所以下载了windows的离线包,用JNA进行调用。之前用的是jni,但是一直...

    #用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现)(一)

    本人接的任务,做离线语音识别,用的是科大讯飞的离线识别,java不支持离线了,所以下载了windows的离线包,用JNA进行调用。之前用的是jni,但是一直没有测试通过,本人又不会C++,研究了一个星期终究放弃。转而使用JNA,JNA使用只要导入一个jar包即可,JNA实际上是对JNI的一种封装。

    【在线语音识别的实现看我的另一篇】科大讯飞 在线语音识别 音频来源为【文件】的java接入实现, 适用于初学者

    说明

    本人一边做一边写,记录问题和解决办法,留给自己思考和大家交流。如有不对的地方,欢迎批评指正!
    【ps】现在已经做完,参考第二篇

    一、注册用户,下载dll这个先略过,很简单,可以参考其他的……【待】
    1、先进入讯飞开放平台,先注册【地址】https://www.xfyun.cn/
    2、创建应用,记得平台选windows,因为java不支持离线
    在这里插入图片描述

    3、创建完成之后,在 我的应用 中
    在这里插入图片描述

    选择【离线命令词识别】
    就完成创建了!

    4、下载需要的SDK,这个SDK包含了动态库dll,静态库lib,头文件.h,以及非常重要的例子!
    在这里插入图片描述
    【点亮需要的功能,下载相应的SDK】
    在这里插入图片描述
    下载好之后,找出其中的dll文件,两个版本,上面是32位系统,下面是64位系统,本人是64位的
    在这里插入图片描述

    二、调用JNA
    1下载jna的jar包
    【JNA包下载地址】:https://download.csdn.net/download/weixin_43112746/10690193

    2导入java工程中
    在这里插入图片描述
    jar包的位置,可以放在根目录,也可以像我一样创立一个lib文件夹来放置
    然后
    右键工程–properties—java Build Path----libraries—add jars
    在这里插入图片描述
    【找到相应的JNA包的位置,添加之后点击Apply and Close】就完成JNA包的导入
    【JNA包下载地址】:https://download.csdn.net/download/weixin_43112746/10690193

    没有做过的,先加载个例子试试!
    在这里插入图片描述

    创建一个class,一个interface,下面的是讯飞的dll文件放在根目录下
    【接口】这里只测试登录的函数

    package test;
    
    import com.sun.jna.Library;
    import com.sun.jna.Native;
    import com.sun.jna.win32.StdCallLibrary;
    
    public interface VoiceLib extends Library {
    	  int MSPLogin(String usr, String pwd, String params);
    	  VoiceLib instance = (VoiceLib)Native.loadLibrary("msc_x64", VoiceLib.class);//接口直接对动态库文件进行调用,
    	  //省去JNI的繁琐步骤
    		
    
    }
    
    
    【类】
    package test;
    
    import com.sun.jna.Native;
    
    public class Voice {
    		public static void main(String[] args) {
    		String usr=null;
    		String pwd=null;
    		String params="appid=5ba4bc08";//这里填写自己的appid,从讯飞的我的应用里面粘贴过来
    		int a;
    		a=VoiceLib.instance.MSPLogin(usr, pwd, params);//调用接口的方法传参数
    		System.out.println(“a=+a);
    		
    		
    	}
    }
    
    
    
    

    输出结果a=0
    很明显测试成功了!
    能够继续往下写了。

    又遇到问题,参数的转换!
    普通的倒是还好,转换关系如下:
    在这里插入图片描述
    来源:https://github.com/java-native-access/jna/blob/master/www/Mappings.md
    可是问题来了,讯飞中有指针,句柄,回调函数等等各种乱七八糟的参数,这可怎么转换?头顶一直乌鸦飞过……

    三、参数的转换(难点)
    登录做完了,再做构建语法,其中用到的函数是

    int MSPAPI QISRBuildGrammar(const char *grammarType, const char *grammarContent, unsigned int grammarLength,
     const char *params, GrammarCallBack callback, void *userData);
    

    除了无符号int那个,其他都没有!又一只乌鸦飞过……
    竟然还有语法回调函数!这是什么!又一只乌鸦飞过……
    查一下回调函数
    【百度】这是个链接哈

    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

    找个资源帖参考下:
    https://blog.csdn.net/l527719041/article/details/77461328

    哦!原来可以这么操作!

    先把const char *解决,这是要转换成String 【待】

    再来解决回调函数的参数问题!
    【先做这么多,下回分解】
    第二篇的链接:手把手的操作——用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现)(二)

    展开全文
  • msp_errors.h msp_types.h为通用数据结构的头文件,qisr.h是语音识别用的头文件,qtts.h是语音合成用的头文件。 这是sdk中原代的解释: 1.doc目录下存放开发文档等; 2.lib目录下存放SDK需要调用的动态库以...

    先从官网下载sdk.

    文件解析:

    bin/inc下有四个头文件:msp_errors.h  msp_types.h  qisr.h  qtts.h

    msp_errors.h  msp_types.h为通用数据结构的头文件,qisr.h是语音识别用的头文件,qtts.h是语音合成用的头文件。

    这是sdk中原代的解释:

    1.doc目录下存放开发文档等;
    
    2.lib目录下存放SDK需要调用的动态库以及需要引用的头文件。
    
    3.example目录下存放提供的示例demo,每个例子下都有Makefile文件,在当前目录make即可;
    
    4.bin目录下存放符合标准的语音文件样例、配置文件和资源文件等,make之后的example可执行程序也会拷贝至此,请在此目录下运行,否则会运行失败;
    
    5.prj目录下提供make脚本,可以快速编译例子。

     然后我按照它的指示,在example下的asrdome下make,然而报错:找不到 lasound,去看它的makefile文件,其中需要这个库,在网上搜了一下,解决方案如下:

    sudo apt-get install alsa-base alsa-utils alsa-source libasound2-dev

    重新编译,又报错,警告:检测到时钟错误。您的创建可能是不完整的。

    将之前编译创建的 “asrdemo.o” 删除 继续,编译成功。

    然后再bin下生成了"asrdemo"可执行文件,在bin目录下运行(./asrdemo)

    运行成功。

    然而 输出的结果是一堆代码,里面夹杂识别的话。在网上查了一下,代码的函数逻辑大概如下

    1.先要调用QISRInit()函数,参数是自己的appid,每个SDK都是注册才能下载的,所以是唯一的,用来区分用户的,不同级别的用户每天可以使用SDK的次数有限制,毕竟人用的多了语音识别的性能肯定会下降;

    2.之后就是把GrammarID,输入输出的参数param和调用状态返回值ret作为参数传入QISRSessionBegin()函数中进行初始化,返回值是sessionID,这个是后面所有函数的主要参数之一;

    3.打开自己的音频文件,调用QISRAudioWrite()函数写入,可以分段也可以一次,第一个参数是sessionID,上面初始化函数返回的值,第二个参数是音频数据头指针,第三个参数是音频文件大小,第四个参数是音频发送的状态,表示发送完了没有,剩下两个是服务器端检测语音状态和识别状态的返回值;

    4.调用QISRGetResult()函数获取识别的结果,第一个参数还是sessionID,第二个参数是输出识别的状态,第三个参数是与服务器交互的间隔时间,官方建议5000,我取为0,第四个参数是调用状态返回值ret,最后这个函数的返回值就是上面结果的json数据了

     

     

    录制语音时,使用“ffmpeg”录音,简单方便,符合语音识别的要求。

    讯飞语音对语音的要求如下:采样率16K或8KHz,采样位是16位,单声道,格式是PCM或WAV。自带的录音软件都是默认32位采样,只能用ffmpeg或自己写代码录制,ffmpeg命令如下:

    ffmpeg -f alsa  -ar 16000 -ac 1 -i hw:0 lib.wav

     

    展开全文
  • 基于android的离线语音识别,实现没有网络的情况下把语音转换成文字信息。 对程序内容进行了简化,内容简单明了,容易看懂。 包含了离线语音需要的所有离线包 speechapp.java文件第22行修改成自己在讯飞网站申请的id...
  • 基于android的离线语音识别,实现没有网络的情况下把语音转换成文字信息。 对程序内容进行了简化,内容简单明了,容易看懂。 包含了离线语音需要的所有离线包
  • Android 科大讯飞离线语音识别

    千次阅读 热门讨论 2018-10-19 15:07:05
    最近Boss让我开发一个离线语音听写功能 , 可是我发现科大讯飞的离线版本下架了 , 也看了很多地方如百度语音.......  都没发现有离线版本 , 然而今天突然发现科大讯飞的离线听写又上架了 这就让我很开心 . 我就...

    最近Boss让我开发一个离线语音听写功能 , 可是我发现科大讯飞的离线版本下架了 , 也看了很多地方如百度语音.......

          都没发现有离线版本 , 然而今天突然发现科大讯飞的离线听写又上架了  这就让我很开心 . 我就立马把它下载了下来,集成到我的项目中去 . 然后经过一个小时的努力 , 我把它简单的封装了一下 , 然后很方便的就可以到处调用了 !

          下面我就把我的那个类发上来你们可以直接拷过去用 . 具体有哪些不懂 , 里面传的东西不清楚可以在下方留言 , 我会给你们讲解.

        emmmm~很久没发博客了 , 现在给大家带来些福利 .

    下面就是这个类:

     

    public class LatYuYin {
        private static String TAG = "IatDemo";
        // 语音听写对象
        private SpeechRecognizer mIat;
        // 语音听写UI
        private RecognizerDialog mIatDialog;
    
        // 用HashMap存储听写结果
        private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
    
        private Toast mToast;
    
        private Context mContext;
        private SharedPreferences mSharedPreferences;
        private boolean mTranslateEnable = false;
        private EditText mEditText;
    
    
        public LatYuYin(Context context) {
            mContext = context;
            // 初始化识别无UI识别对象
            // 使用SpeechRecognizer对象,可根据回调消息自定义界面;
            mIat = SpeechRecognizer.createRecognizer(mContext, mInitListener);
            // 初始化听写Dialog,如果只使用有UI听写功能,无需创建SpeechRecognizer
            // 使用UI听写功能,请根据sdk文件目录下的notice.txt,放置布局文件和图片资源
            mIatDialog = new RecognizerDialog(mContext, mInitListener);
            mToast = Toast.makeText(context, "", Toast.LENGTH_SHORT);
            mSharedPreferences = mContext.getSharedPreferences(IatSettings.PREFER_NAME, Activity.MODE_PRIVATE);
        }
    
        public void cancelmLat() {
            mIat.cancel();
            showTip("取消听写");
        }
    
        public void stopmLat() {
            mIat.stopListening();
            showTip("停止听写");
        }
    
        int ret = 0;// 函数调用返回值
    
        //开始听写
        public void startmLat(View view) {
            mEditText = (EditText) view.findViewById(R.id.activity_chat_et_text);
            mEditText.setText(null);
            mIatResults.clear();
            // 设置参数
            setParam();
            boolean isShowDialog = mSharedPreferences.getBoolean(mContext.getString(R.string.pref_key_iat_show), true);
            if (isShowDialog) {
                // 显示听写对话框
                mIatDialog.setListener(mRecognizerDialogListener);
                mIatDialog.show();
                showTip(mContext.getString(R.string.text_begin));
            } else {
                // 不显示听写对话框
                ret = mIat.startListening(mRecognizerListener);
                if (ret != ErrorCode.SUCCESS) {
                    showTip("听写失败,错误码:" + ret);
                } else {
                    showTip(mContext.getString(R.string.text_begin));
                }
            }
    
        }
    
        private void showTip(final String str) {
            Toast.makeText(mContext, str, Toast.LENGTH_SHORT).show();
        }
    
        /**
         * 参数设置
         *
         * @return
         */
        public void setParam() {
            // 清空参数
            mIat.setParameter(SpeechConstant.PARAMS, null);
            String lag = mSharedPreferences.getString("iat_language_preference", "mandarin");
            // 设置引擎
            mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
            // 设置返回结果格式
            mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
    
            this.mTranslateEnable = mSharedPreferences.getBoolean(mContext.getString(R.string.pref_key_translate), false);
            if (mTranslateEnable) {
                Log.i(TAG, "translate enable");
                mIat.setParameter(SpeechConstant.ASR_SCH, "1");
                mIat.setParameter(SpeechConstant.ADD_CAP, "translate");
                mIat.setParameter(SpeechConstant.TRS_SRC, "its");
            }
    
            if (lag.equals("en_us")) {
                // 设置语言
                mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");
                mIat.setParameter(SpeechConstant.ACCENT, null);
    
    
                if (mTranslateEnable) {
                    mIat.setParameter(SpeechConstant.ORI_LANG, "en");
                    mIat.setParameter(SpeechConstant.TRANS_LANG, "cn");
                }
            } else {
                // 设置语言
                mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
                // 设置语言区域
                mIat.setParameter(SpeechConstant.ACCENT, lag);
    
                if (mTranslateEnable) {
                    mIat.setParameter(SpeechConstant.ORI_LANG, "cn");
                    mIat.setParameter(SpeechConstant.TRANS_LANG, "en");
                }
            }
    
            // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
            mIat.setParameter(SpeechConstant.VAD_BOS, mSharedPreferences.getString("iat_vadbos_preference", "4000"));
    
            // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
            mIat.setParameter(SpeechConstant.VAD_EOS, mSharedPreferences.getString("iat_vadeos_preference", "1000"));
    
            // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
            mIat.setParameter(SpeechConstant.ASR_PTT, mSharedPreferences.getString("iat_punc_preference", "1"));
    
            // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
            mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
            mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/iat.wav");
            //此处engineType为“local”
            mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);
            if (SpeechConstant.TYPE_LOCAL.equals(SpeechConstant.TYPE_LOCAL)) {
                // 设置本地识别资源
                mIat.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());
            }
        }
    
        private String getResourcePath() {
            StringBuffer tempBuffer = new StringBuffer();
            //识别通用资源
            tempBuffer.append(ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "iat/common.jet"));
            tempBuffer.append(";");
            tempBuffer.append(ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "iat/sms_16k.jet"));
            //识别8k资源-使用8k的时候请解开注释
            return tempBuffer.toString();
        }
    
        /**
         * 初始化监听器。
         */
        private InitListener mInitListener = new InitListener() {
    
            @Override
            public void onInit(int code) {
                Log.d(TAG, "SpeechRecognizer init() code = " + code);
                if (code != ErrorCode.SUCCESS) {
                    showTip("初始化失败,错误码:" + code);
                }
            }
        };
    
        /**
         * 听写UI监听器
         */
        private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {
            public void onResult(RecognizerResult results, boolean isLast) {
                Log.d(TAG, "recognizer result:" + results.getResultString());
                if (mTranslateEnable) {
                    printTransResult(results);
                } else {
                    String text = JsonParser.parseIatResult(results.getResultString());
                    mEditText.append(text);
                    mEditText.setSelection(mEditText.length());
                }
            }
    
    
            /**
             * 识别回调错误.
             */
            public void onError(SpeechError error) {
                if (mTranslateEnable && error.getErrorCode() == 14002) {
                    showTip(error.getPlainDescription(true) + "\n请确认是否已开通翻译功能");
                } else {
                    showTip(error.getPlainDescription(true));
                }
            }
    
        };
        /**
         * 听写监听器。
         */
        private RecognizerListener mRecognizerListener = new RecognizerListener() {
    
            @Override
            public void onBeginOfSpeech() {
                // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
                showTip("开始说话");
            }
    
            @Override
            public void onError(SpeechError error) {
                // Tips:
                // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
                if (mTranslateEnable && error.getErrorCode() == 14002) {
                    showTip(error.getPlainDescription(true) + "\n请确认是否已开通翻译功能");
                } else {
                    showTip(error.getPlainDescription(true));
                }
            }
    
            @Override
            public void onEndOfSpeech() {
                // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
                showTip("结束说话");
            }
    
            @Override
            public void onResult(RecognizerResult results, boolean isLast) {
                if (mTranslateEnable) {
                    printTransResult(results);
                } else {
                    String text = JsonParser.parseIatResult(results.getResultString());
                }
    
                if (isLast) {
                    //TODO 最后的结果
                }
            }
    
            @Override
            public void onVolumeChanged(int volume, byte[] data) {
                showTip("当前正在说话,音量大小:" + volume);
                Log.d(TAG, "返回音频数据:" + data.length);
            }
    
            @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 printTransResult(RecognizerResult results) {
            String trans = JsonParser.parseTransResult(results.getResultString(), "dst");
            String oris = JsonParser.parseTransResult(results.getResultString(), "src");
    
            if (TextUtils.isEmpty(trans) || TextUtils.isEmpty(oris)) {
                showTip("解析结果失败,请确认是否已开通翻译功能。");
            }
    
        }
    }

    以上就是这个类的代码 , 基本你们拷过去就能用 .  同时你们附加了这两个类你们需要科大讯飞里面的开发包里面拷出来.

    然后具体调用很简单如下:

    以上就是调用的代码简单吧  然后你们不知道还要考哪些东西就把这几个文件都拷进去 , 或者看官方文档

    好了  .........基本就是这些 , 如果还是没成功就在底下留言 , 我看到我会很快的回复你的!

              希望大家工作顺利!!!!!!!

    展开全文
  • 离线语音识别以及语音评价功能,支持中文英文,支持单词,单字(中文),句子的评价,支持短句,单词,单字(中文)的识别
  • 博文配套的源码,初稿,用java调用科大讯飞的离线语音识别dll实现离线识别,只要路径对了,就绝对能运行,跟机型无关,操作系统windows
  • 离线语音识别Demo

    2020-07-27 23:30:44
    离线语音识别Demo
  • 离线语音识别,树莓派语音识别科大讯飞语音识别离线包。
  • 本项目是做出的产品是一个很大的一个Windows下的增强现实系统,产品功能已经基本完善,考虑到给用户带来更好的体验,故综合评估后采用讯飞语音识别方案进行嫁接。 项目介绍:1)打开系统时启动语音识别,检测到用户...
  • Unity 接入讯飞离线SDK , 有一些坑记录一下。 在开发者平台注册之后,申请应用,下载SDK包。这个sdk包和你的appid是对应的,不能使用别人的sdk包,然后用自己的appid 这是SDK文件夹,sample是一个示例工程,将...
  • 基于科大讯飞语音识别demo(离线

    热门讨论 2020-07-30 11:41:16
    基于科大讯飞语音识别的demo(离线版的)。源码是从官demo提取出来的,简单明了,项目可以直接运行。依赖讯飞语音的apk和离线语音包(demo中可直接下载)
  • 百度离线语音识别

    万次阅读 2019-01-11 15:56:24
    百度离线语音识别简介百度语音离线识别集成离线识别实现合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...
  • 讯飞语音离线识别.apk

    2020-07-30 23:32:18
    简单的离线识别 语音识别.apk 。下载后请替换自己的appid,就是在讯飞官网下载demo时给的appid
  • 关于讯飞开发平台的注册以及SDK下载: 请参考: ... · 离线名命令词 ...· 离线语音合成 · 离线唤醒 · 语音在线听写 准备工作: 1、jar包 地址:https://pan.baidu.com/s/1hsanJBe 密码:523
  • Android 第三方SDK开发视频教程,给课程结合讯飞语音这个第三方SDK进行实战教学,实现在线语音合成,将文字信息转化为声音信息,给应用配上“嘴巴;语音听写,将连续语音识别为文字,给应用配上“耳朵”。
  • 想去开发一款商用的语音识别,比如智能家具之类的,因此会遇到大量的访问(如果遭受黑客攻击,你所购买的语音包可能会在几分钟之内被调用完)。 并且在线的语音识别价格并不客观,百度云每个要0.0011元/次,华为云更...
1 2 3 4 5 ... 20
收藏数 677
精华内容 270
关键字:

离线语音识别 讯飞