离线语音识别实现_ubuntu+python实现离线语音识别 - CSDN
  • 用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实现)(二)

    展开全文
  • 百度离线语音识别

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

    简介

    本文记录百度离线识别与讯飞离线语音识别,针对的是应用本身级别的。

    百度语音离线识别集成

    1. 首先下载开发架包:bdasr_V3_20180801_d6f298a.jar,这个是离在线融合的SDK ;

    2. 导入so库:可在下载的demo中找到,复制到自己工程中同名的路径下
      在这里插入图片描述

    3. 需要百度开放平台上去申请 API Key 和 Secret Key,这是认证权限的必备信息,只有认证通过才可以继续使用语音功能,如语音唤醒,在线识别,离线识别等等。首先需要百度开放平台上去申请 API Key 和 Secret Key,这是认证权限的必备信息,只有认证通过才可以继续使用语音功能,如语音唤醒,在线识别,离线识别等等。
      在这里插入图片描述
      而鉴权认证就是要成功获取到AccessToken(Access Token 是用户身份验证和授权的凭证),而这个认证过程需要自己在应用中编写,之后会提到。
      将获取到的AppID、API Key 和 Secret Key添加到项目的配置文件中去;

    4. AndroidManifest.xml 文件的配置:
      设置权限(如果是Android 6.0 以上还需要获取动态权限,之后会说到)

        <uses-permission android:name="android.permission.RECORD_AUDIO" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    设置APP_ID, APP_KEY, APP_SECRET

        <meta-data android:name="com.baidu.speech.APP_ID"
            android:value="9788136" />
        <meta-data
            android:name="com.baidu.speech.API_KEY"
            android:value="0GjQNO5H4pGPf9HyA3AmZEbz" />
        <meta-data
            android:name="com.baidu.speech.SECRET_KEY"
            android:value="db981ef3ec647ba8a09b599ad7447a24" />
    
    1. 注意事项:在申请API Key时需要设置应用包名,并且保证官网申请时的与app/bulid.gradle里的applicationId一致,否则会导致离线命令词或是唤醒报“no licenece”的错误。

    离线识别实现

    1.可以先准备本地词库和唤醒词库

    2.基于SDK的使用:

    • 初始化EventManager类
     EventManager  asr = EventManagerFactory.create(context, "asr");//语音识别器
     EventManager  wp = EventManagerFactory.create(context, "wp");//语音唤醒器
    
    • 定义输出事件类
    public class RecogResultManager implements EventListener{
        ...........
        
         /**
         * 回调事件
         */
        @Override
        public void onEvent(String name, String params, byte[] data, int offset, int length) {
            String logMessage = "name:" + name + "; params:" + params;
            Log.d(TAG, logMessage);
            switch (name) {
                case SpeechConstant.CALLBACK_EVENT_ASR_READY:
                    // 引擎准备就绪,可以开始说话              
                    break;
                case SpeechConstant.CALLBACK_EVENT_ASR_BEGIN:
                    // 检测到用户的已经开始说话
                    break;
                case SpeechConstant.CALLBACK_EVENT_ASR_END:
                    // 检测到用户的已经停止说话
                    break;
                case SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL:
                    // 临时识别结果, 长语音模式需要从此消息中取出结果
                    break;
                  case SpeechConstant.CALLBACK_EVENT_ASR_FINISH:
                    // 识别结束, 最终识别结果或可能的错误
                    break;
                case SpeechConstant.CALLBACK_EVENT_ASR_LONG_SPEECH:
                    // 长语音
                    break;
                case SpeechConstant.CALLBACK_EVENT_ASR_VOLUME:
                    //音量值 
                    break;
                case SpeechConstant.CALLBACK_EVENT_ASR_AUDIO:
                    if (data.length != length) {
                     //可能出错的地方:回调返回的数据有问题
                       Log.d(TAG, "internal error: asr.audio" +
                                " callback data length is not equal to length param");
                     .....
                    }
                    break;
                case SpeechConstant.CALLBACK_EVENT_WAKEUP_SUCCESS:
                    //语音唤醒成功 
                    break;
                case SpeechConstant.CALLBACK_EVENT_WAKEUP_ERROR:
                    //语音唤醒失败
                    break;
                .......
    
                default:
                    break;
            }
        }
    }    
    
    
    
    • 注册自己的输出事件类
    asr.registerListener(eventListener);
    wp.registerListener(eventListener);
    
    • 加载唤醒词库与离线词库
     /**
     - 加载唤醒词库
      */
        private void loadWakeup() {
            Map<String, Object> params = new HashMap<>();
            params.put(SpeechConstant.WP_WORDS_FILE, "assets://WakeUp.bin");
            //开始识别语音唤醒
            mWakeup.start(params);
        }
        
     /**
     - 加载离线词库
      */
        private void loadWakeup() {
           Map<String, Object> params = new LinkedHashMap<>();
           //设置此参数使用与语音唤醒后进入语音识别模式
            params.put(SpeechConstant.VAD, SpeechConstant.VAD_DNN);
            params.put(SpeechConstant.DECODER, 2);
            params.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, "assets://baidu_speech_grammar.bsg");
           //设置唤醒到识别的停顿时间
            if (backTrackInMs > 0) {
                params.put(SpeechConstant.AUDIO_MILLS, System.currentTimeMillis() - backTrackInMs);
            }
            mRecognizer.cancel();
            //开始进行识别
            mRecognizer.start(params);
        }
         注:对于语音唤醒到识别有两种方案:
         方案1: backTrackInMs > 0,唤醒词说完后,直接接句子,中间没有停顿,
                开启回溯,连同唤醒词一起整句识别,推荐4个字 1500ms,backTrackInMs 最大 15000,即15s.
         方案2: backTrackInMs = 0,唤醒词说完后,中间有停顿,不开启回溯。唤醒词识别回调后,正常开启识别。
                官方demo里采用默认设置的是1500,本人demo中选择的是方案2,因为测试结果方案2的识别效果好一些,详见下面测试结果。
    
    • 查询权限,获取AccessToken
    public void check() {
            appendLogMessage("try to check appId " + appId + " ,appKey=" + appKey + " ,secretKey" + secretKey);
            if (appId == null || appId.isEmpty()) {
                  errorMessage = "appId 为空";
                  fixMessage = "填写appID";
              }
            if (appKey == null || appKey.isEmpty()) {
                    errorMessage = "appKey 为空";
                    fixMessage = "填写appID";
              }
            if (secretKey == null || secretKey.isEmpty()) {
                     errorMessage = "secretKey 为空";
                      fixMessage = "secretKey";
             }
            try {
                    checkOnline();
            } catch (UnknownHostException e) {
                    infoMessage = "无网络或者网络不连通,忽略检测 : " + e.getMessage();
            } catch (Exception e) {
                    errorMessage = e.getClass().getCanonicalName() + ":" + e.getMessage();
                    fixMessage = " 重新检测appId, appKey, appSecret是否正确";
             }
     }
    
    /**
     *  获取并校验token
     */
      public void checkOnline() throws Exception {
                String urlpath = "http://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id="
                        + appKey + "&client_secret=" + secretKey;
                URL url = new URL(urlpath);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(1000);
                InputStream is = conn.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                StringBuilder result = new StringBuilder();
                String line = "";
                do {
                    line = reader.readLine();
                    if (line != null) {
                        result.append(line);
                    }
                } while (line != null);
               String res = result.toString();
               if (!res.contains("audio_voice_assistant_get")) {
                    errorMessage = "appid:" + appId + ",没有audio_voice_assistant_get 权限,请在网页上开通\"语音识别\"能力";
                    fixMessage = "secretKey";
                    return;
                }
                appendLogMessage("openapi return " + res);
                JSONObject jsonObject = new JSONObject(res);
                String error = jsonObject.optString("error");
                if (error != null && !error.isEmpty()) {
                    errorMessage = "appkey secretKey 错误" + ", error:" + error + ", json is" + result;
                    fixMessage = " 重新检测appId对应的 appKey, appSecret是否正确";
                    return;
                }
               String token = jsonObject.getString("access_token");
               if (token == null || !token.endsWith("-" + appId)) {
                    errorMessage = "appId 与 appkey及 appSecret 不一致。
                    appId = " + appId + " ,token = " + token;
                    fixMessage = " 重新检测appId对应的 appKey, appSecret是否正确";
                }
            }
        }
    
    • 加载动态权限(Android 6.0以上需要)
      在主Activity中添加:
    
     private void initPermission() {
            String[] permissions = {Manifest.permission.RECORD_AUDIO,
                    Manifest.permission.ACCESS_NETWORK_STATE,
                    Manifest.permission.INTERNET,
                    Manifest.permission.READ_PHONE_STATE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
            };
            ArrayList<String> toApplyList = new ArrayList<>();
           for (String perm : permissions) {
                if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) {
                    toApplyList.add(perm);
                    // 进入到这里代表没有权限.
                }
            }
            String[] tmpList = new String[toApplyList.size()];
            if (!toApplyList.isEmpty()) {
                ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123);
            }
        }
        
    @Override
       public void onRequestPermissionsResult(int requestCode,
                                               @NonNull String[] permissions,
                                               @NonNull int[] grantResults) {
            // 此处为android 6.0以上动态授权的回调,用户自行实现。
        }
    
    • 控制识别/唤醒
       /**
        * 语音唤醒开始
        */
        public void start(Map<String, Object> params) {
            String json = new JSONObject(params).toString();
            wp.send(SpeechConstant.WAKEUP_START, json, null, 0, 0);
        }
        
        /**
         * 停止语音唤醒
         */
        public void stop() {
            wp.send(SpeechConstant.WAKEUP_STOP, null, null, 0, 0);
        }
    
        /**
         * 开始识别
         */
        public void start(Map<String, Object> params) {
            String json = new JSONObject(params).toString();
            asr.send(SpeechConstant.ASR_START, json, null, 0, 0);
        }
        
        /**
         * 提前结束录音等待识别结果。
         */
        public void stop() {
            if (!isInited) {
                throw new RuntimeException("release() was called");
            }
            asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0);
        }
        
        /**
         * 取消本次识别,取消后将立即停止不会返回识别结果。
         * cancel 与stop的区别是 cancel在stop的基础上,完全停止整个识别流程,
         */
        public void cancel() {
            if (!isInited) {
                throw new RuntimeException("release() was called");
            }
            asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0);
        }
    
    • 事件管理器退出,回收资源,不能一直占用着mic资源。
        /**
         * 释放语音唤醒资源
         */
        public void release() {
           if (wp== null) {
                return;
            }
            stop();
            wp.unregisterListener(eventListener);
            wp = null;
            isInited = false;
        }
       
        /**
         * 释放语音识别资源
         */
          public void release() {
            if (asr == null) {
                return;
            }
            cancel();
            asr.send(SpeechConstant.ASR_KWS_UNLOAD_ENGINE, null, null, 0, 0);
            asr.unregisterListener(eventListener);
            asr = null;
            isInited = false;
        }
    

    添加动作识别:

    之前考虑是用数据库匹配识别结果,来找到相应的组件,但是demo里做得着急,只是通过管理activity,以activity和name为媒介来找到相应的组件,从而执行相应的动作。

    public abstract class BaseActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            VrApplication.getInstance().addActivity(this);
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            VrApplication.getInstance().removeActivity(this);
        }
    }
    
    public class VrApplication extends Application {
    
        private static final VrApplication INSTANCE = new VrApplication();
    
        private  List<BaseActivity> mActivities;
    
        private VrApplication() {}
    
        public static VrApplication getInstance() {
            return VrApplication.INSTANCE;
        }
    
        public  void addActivity(BaseActivity activity){
            if(mActivities == null){
                mActivities = new ArrayList<>();
            }
            mActivities.add(activity);
        }
        
          public  void removeActivity(BaseActivity activity){
            mActivities.remove(activity);
        }
    
        public List<BaseActivity> getActivities() {
            return mActivities;
        }
    
        /**
         * 关闭应用后需要清空管理
         */
         public  void finishAll(){
            for(BaseActivity activity : mActivities){
                if(! activity.isFinishing()){
                    activity.finish();
                }
            }
        }
    }
    

    所有的界面activity需要继承BaseActivity,初始化组件时保存起来,界面销毁时clear()。

     private void initView() {
            mViews = new HashMap<>();
            EditText etCode = (EditText) findViewById(R.id.tv_point_code);
            Button action = (Button) findViewById(R.id.btn_action);
            mViews.put(etCode.getHint().toString(), etCode);
            mViews.put(action.getText().toString(), action);
        }
    

    回调监听处理结果,进行确认组件去执行相应的动作:

    public class RecogResultManager implements EventListener, IStatus {
         ...............
         
        /**
         * 回调事件
         */
        @Override
        public void onEvent(String name, String params, byte[] data, int offset, int length) {
               switch (name) {
                    ........
                    case SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL:
                         // 临时识别结果, 长语音模式需要从此消息中取出结果
                         handlePartial(params, data, offset, length);
                         break;
                    case SpeechConstant.CALLBACK_EVENT_ASR_FINISH:
                         // 识别结束, 最终识别结果或可能的错误
                         handleFinish(params);
                         break;
                    ........
                    case SpeechConstant.CALLBACK_EVENT_WAKEUP_SUCCESS:
                         //语音唤醒成功
                         handleWpSuccess(name, params);
                         break;
                    case SpeechConstant.CALLBACK_EVENT_WAKEUP_ERROR:
                         handleWpErro(name, params);
                         break;
              }
        } 
        ........
    }               
    

    处理语音唤醒,语音唤醒后,要切换开始进行语音识别:

    private void handleWpMsg() {
            Map<String, Object> mParams = new LinkedHashMap<>();
            mParams.put(SpeechConstant.VAD, SpeechConstant.VAD_DNN);
            mParams.put(SpeechConstant.DECODER, 2);
            mParams.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, BSGPATH);
             if (mBackTrackInMs > 0) {
                mParams.put(SpeechConstant.AUDIO_MILLS, System.currentTimeMillis() - mBackTrackInMs);
            }
            mRecognizer.cancel();
            mRecognizer.start(mParams);
     }
    

    处理语音识别结果:

    private void analysData(RecogResult recogResult) {
            String results = recogResult.getBestResult();
            //从缓存中获取当前的Activity
            BaseActivity activityInstance = UiUtil.getActivityInstance(mContext);
            if (activityInstance == null) {
                return;
            }
            Map<String, View> views = activityInstance.getViews();
            for (Map.Entry<String, View> entry : views.entrySet()) {
                if (results.contains(entry.getKey())) {
                    action(entry.getValue(), results);
                }
            }
      }
    

    执行动作:

     private void action(View value, String results) {
            if (value instanceof Button) {
                value.performClick();
            } else if (value instanceof EditText) {
                ((EditText) value).setText(results);
            }
     }
    

    注意事项

    1.即使只进行离线操作,第一次也需要进行联网进行认证授权才可以进行接下来的语音识别。
    2. 不用时要及时释放,不能一直占用mic资源,影响其他使用。
    3. 环境嘈杂时,识别率会很低,需要依赖降噪算法。
    4.本demo针对一个应用来说,通过语音识别命令,并执行操作,跳转界面,点击操作,选择操作等,有一定的局限性,因为离线时,只能识别词库中的词,所以EditText或是TextView填写值的时候,可能没有用户所说的那个值,目前只是依赖在线识别来控制这块,还有待进一步研究。

    demo下载地址:

    链接: https://download.csdn.net/download/weixin_44328479/10910474.
    Alt

    展开全文
  • 离线语音识别Demo

    2020-07-27 23:30:44
    离线语音识别Demo
  • 博文配套的源码,初稿,用java调用科大讯飞的离线语音识别dll实现离线识别,只要路径对了,就绝对能运行,跟机型无关,操作系统windows
  • 讯飞离线语音识别.zip

    2020-07-30 23:31:29
    基于android的离线语音识别实现没有网络的情况下把语音转换成文字信息。 对程序内容进行了简化,内容简单明了,容易看懂。 包含了离线语音需要的所有离线包 speechapp.java文件第22行修改成自己在讯飞网站申请的id...
  • 基于android的离线语音识别实现没有网络的情况下把语音转换成文字信息。 对程序内容进行了简化,内容简单明了,容易看懂。 包含了离线语音需要的所有离线包
  • C# 开发的离线语音识别,语音转文字,可以识别短语音,指定识别库,程序已测试运行成功,识别速度快,需要的可以自行修改使用
  • 关于Android的离线语音识别的技术,遍观若干厂家唯有科大讯飞和百度有离线的语音识别功能,但是科大讯飞是收费的,百度的离线语音识别就是关键词唤醒,但是只接受3个自定义的唤醒词,而且必须经过评定3分以上唤醒词...

           关于Android的离线语音识别的技术,遍观若干厂家唯有科大讯飞和百度有离线的语音识别功能,但是科大讯飞是收费的,百度的离线语音识别就是关键词唤醒,但是只接受3个自定义的唤醒词,而且必须经过评定3分以上唤醒词才可以成功提交,内容限制和数量限制都是很大的局限,可用性很低,大公司的开源技术全部Pass掉了。这个pocketSphinx经过实践准确率还是很不错的,根本上讲实际操作还是关键词唤醒识别,但是能利用pocketSphinx其自定义的语音模型和声音模型的特性,随心所欲的定制想识别的关键词。

           关于PocketSphinx的学习主要是根据这篇文章来的,集成方面很详细很具体:https://www.jianshu.com/p/4310ae932fdd,照着这个来就可以了,其实对于实际开发来说,中文唤醒词仅仅只需要替换language Model(.lm文件)语言模型,和字典模型(.dic文件) 这两个文件就行了,将想要监听的唤醒词txt根据上面贴出的教程链接,上传到网站并下载压缩包,就得到了这两个文件,但是要注意的是,.dic文件并不是想当然的拼音而已,比如设置这个词,其实是:  设置   sh e zh ib,如果碰到这个词了不按照官方的字典文档,pocketsphinx-0.7\model\lm\zh_CN/mandarin_notone.dic去找实际的拼音的话(压缩包解压完的文件夹名是pocketsphinx-0.7),很可能是不能看到正确是识别效果的。

            最重要的一点:dic文件中文字和拼音之间相隔2个空格,字母之间间隔是一个空格,间距不对很可能也不能如预期所愿。

            自己做了个Demo,里面有4个自定义的唤醒词:“下一个界面”,“下一个页面”,“设置界面”,“设置页面”, 画了2个Layout:红色的下一个界面和白色的设置界面, 当说前两个唤醒词,识别之后跳转到红色的界面,当说后两个唤醒词,识别之后跳转到白色的界面,效果如下:

                                                                        

     

           

    实际操作其实便是中规中矩的集成,集成进PocketSphinx后换成自己的字典模型和语言模型,仅仅替换dic和lm两个文件,然后在按钮的长按监听中打开语音识别引擎,在识别后的回调中关闭引擎并根据内容跳转

    public AudioRecordButton(final Context context, AttributeSet attrs) {
    		super(context, attrs);
    		dialogManager = new AudioRecordDialog(getContext());
    
    		setOnLongClickListener(new OnLongClickListener() {
    
    			@Override
    			public boolean onLongClick(View v) {
    			    //开启语音识别引擎
                    PocketSphinxUtil.get(context).start();
    				isReady = true;
    				dialogManager.showDialog();
    				isSpeaking = true;
    				return false;
    			}
    		});
    	}
       @Override
        public void onPartialResults(String b) {
            //一次识别之后,停止语音引擎,下次长按再开启
            PocketSphinxUtil.get(context).stop();
            if(b.contains("下一个界面")||b.contains("下一个页面"))
            {
                Intent intent = new Intent(context,NextActivity.class);
                startActivity(intent);
            }else if(b.contains("设置界面")||b.contains("设置页面"))
            {
                Intent intent = new Intent(context,SettingActivity.class);
                startActivity(intent);
            }
        }

      Demo已上传:https://download.csdn.net/download/crystal_xing/10843721

     

    ----------------------------

    2020.4.16

    总有人下载这快2年前的Demo评论说崩了不好使,挺无奈的,都是半小时就能调通的小问题,今天花时间调通重新往Github上传了源码,上面的Demo别下载了,小米9(Android9.0)和Sony Sov38(Android 9.0)测试过都能跑通

    github: https://github.com/crystalyf/PocketSphinx

    展开全文
  • win+python实现离线语音识别 2018年12月05日 19:28:29 面-包 阅读数:38更多 个人分类: python学习 安装SpeechRecognition模块 使用recognize_sphinx(),安装PocketSphinx使用测试: import speech_...

    win+python实现离线语音识别

    2018年12月05日 19:28:29 面-包 阅读数:38更多

    个人分类: python学习

    安装SpeechRecognition模块
    使用recognize_sphinx(),安装PocketSphinx
    在这里插入图片描述使用测试:

    import speech_recognition as sr
    
    # obtain audio from the microphone
    r = sr.Recognizer()
    print(r)
    harvard = sr.AudioFile('input.wav')
    print(harvard)
    with harvard as source:
        audio = r.record(source)
    # recognize speech using Sphinx
    try:
        print("Sphinx thinks you said " + r.recognize_sphinx(audio))
    except sr.UnknownValueError:
        print("Sphinx could not understand audio")
    except sr.RequestError as e:
        print("Sphinx error; {0}".format(e))
    
    

    参考文献:
    https://blog.csdn.net/zhangbijun1230/article/details/83420031

    展开全文
  • **关于离线语音识别的相关问题 最近在看关于AI音箱相关的资料,想请教大牛们, 关于离线语音识别,好多文章说的是使用神经网络技术进行特征提取和建模等来识别指令,那离线识别和云识别不知道是不是都是这一个模型,...
  • 最近Boss让我开发一个离线语音听写功能 , 可是我发现科大讯飞的离线版本下架了 , 也看了很多地方如百度语音.......  都没发现有离线版本 , 然而今天突然发现科大讯飞的离线听写又上架了 这就让我很开心 . 我就...
  • 基于android的离线语音识别实现没有网络的情况下把语音转换成文字信息。 对程序内容进行了简化,内容简单明了,容易看懂。 包含了离线语音需要的所有离线包 speechapp.java文件第22行修改成自己在讯飞网站申请的id...
  • linux离线语音识别

    2020-07-30 23:31:42
    是一个linux下的离线语音识别, 包含win64, X86等so库文件
  • 离线语音识别,树莓派语音识别科大讯飞语音识别离线包。
  • 首先本文要说的两个前提1.android平台离线语音识别 2.小范围语音 小范围语音指的是相对固定的命令。本文的例子大概实现了20条语音命令,超出范围的无法识别。因此本文中离线语音的使用范围也有限,对于一
  • 上一篇的地址手把手的操作——用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现)(一) 上一篇讲到了最难的地方,参数的转换,这里单独写出来 ** 三、参数的转换(难点) ** 注:本文是以讯飞提供的C语言...
  • Ubuntu16.04实现Sphinx离线语音识别   版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/boke14122621/article/details/79871224 自带Python2.7或3.0+版本都可以 使用的是3.5编译 ...
  • 前言:因为在学校要做语音相关的开发,并且应用环境多数是在无网络状态下,故要用到离线语音识别。经过一番查阅,发现目前在做离线语音识别的,尤其是android环境下的离线语音识别的人确实很少。(插一句如果想要...
  • Android 第三方SDK开发视频教程,给课程结合讯飞语音这个第三方SDK进行实战教学,实现在线语音合成,将文字信息转化为声音信息,给应用配上“嘴巴;语音听写,将连续语音识别为文字,给应用配上“耳朵”。
1 2 3 4 5 ... 20
收藏数 7,391
精华内容 2,956
关键字:

离线语音识别实现