• 百度离线语音识别

    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-11 20:55:51
    离线语音识别Demo
  • Hololens 离线中文语音识别 Hololens自从去年11月份首推中文系统后,Hololens本身已经支持中文语音识别了 Hololens 中文系统升级 既然系本身已经支持,我们就可以像Win10一样简单方便的使用小娜,再也不用使用第三方...

    Hololens 离线中文语音识别

    Hololens自从去年11月份首推中文系统后,Hololens本身已经支持中文语音识别了
    Hololens 中文系统升级

    既然系本身已经支持,我们就可以像Win10一样简单方便的使用小娜,再也不用使用第三方服务(百度/讯飞/必应…)了

    下面就是在Unity中简单的一种应用

    using UnityEngine;
    using UnityEngine.Windows.Speech;
    
    public class STTManager : MonoBehaviour
    {
        public ConfidenceLevel Level;
        public string[] Keywords;
    
        private KeywordRecognizer _Recognizer;
    
        private void Start()
        {
            Keywords = new string[]
            {
                "你好",
                "Hello",
                "你好 World"
            };
    
            _Recognizer = new KeywordRecognizer(Keywords, Level);
            _Recognizer.OnPhraseRecognized += OnPhraseRecognized;
    
            StartRecognizer();
        }
    
        private void StartRecognizer()
        {
            _Recognizer.Start();
        }
    
        private void StopRecognizer()
        {
            _Recognizer.Stop();
        }
    
        private void OnDestroy()
        {
            StopRecognizer();
        }
    
        private void OnPhraseRecognized(PhraseRecognizedEventArgs args)
        {
            //StringBuilder builder = new StringBuilder();
            //builder.AppendFormat("{0} ({1}){2}", args.text, args.confidence, Environment.NewLine);
            //builder.AppendFormat("\tTimestamp: {0}{1}", args.phraseStartTime, Environment.NewLine);
            //builder.AppendFormat("\tDuration: {0} seconds{1}", args.phraseDuration.TotalSeconds, Environment.NewLine);
    
            Debug.Log(args.text);
        }
    
        public void Show() { }
    }
    

    需要注意的是需要在Unity里面开启麦克风权限

    Edit -> Project Settings -> Player -> Publishing Settings -> Capabilities -> 勾选Microphone
    show

    展开全文
  • 用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实现)(二)

    展开全文
  • C# 开发的离线语音识别,语音转文字,可以识别短语音,指定识别库,程序已测试运行成功,识别速度快,需要的可以自行修改使用
  • 离线语音识别,树莓派语音识别科大讯飞语音识别离线包。
  • linux离线语音识别

    2020-06-30 17:55:32
    是一个linux下的离线语音识别, 包含win64, X86等so文件
  • android离线语音识别

    2020-07-07 15:59:04
    data需要放到sd卡中,然后再程序中配置路径,2910.dic和2910.lm可用
  • 离线语音识别以及语音评价功能,支持中文英文,支持单词,单字(中文),句子的评价,支持短句,单词,单字(中文)的识别
  • 讯飞离线语音识别.zip

    2020-06-29 12:40:41
    基于android的离线语音识别,实现没有网络的情况下把语音转换成文字信息。 对程序内容进行了简化,内容简单明了,容易看懂。 包含了离线语音需要的所有离线包 speechapp.java文件第22行修改成自己在讯飞网站申请的id...
  • 博文配套的源码,初稿,用java调用科大讯飞的离线语音识别dll实现离线识别,只要路径对了,就绝对能运行,跟机型无关,操作系统windows
  • 基于android的离线语音识别,实现没有网络的情况下把语音转换成文字信息。 对程序内容进行了简化,内容简单明了,容易看懂。 包含了离线语音需要的所有离线包
  • 讯飞离线语音命令识别测试, 做的DEMO测试, 想交流的可以联系我。
  • 最近有开发语音识别功能的需求,但是因为各种原因(主要是收费)不能用国内大厂(百度,讯飞)已有的sdk,于是在网上搜了很多android离线语音识别,主要有两种: 1.android自带的SpeechRecognizer,但是试了好几...

    最近有开发语音识别功能的需求,但是因为各种原因(主要是收费)不能用国内大厂(百度,讯飞)已有的sdk,于是在网上搜了很多android离线的语音识别,主要有两种:

    1.android自带的SpeechRecognizer,但是试了好几种手机,都是提示没有语音识别服务,最终无果,没办法解决,部分代码如下:

     private SpeechRecognizer mSpeechRecognizer;
     mSpeechRecognizer=SpeechRecognizer.createSpeechRecognizer(this);
    mSpeechRecognizer.setRecognitionListener(this);
    
     public void doSpeechRecognition(Context context){
            if(isRecognitionAvailable(context)){
                Intent recognitionIntent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                recognitionIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS,true);
                recognitionIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,"zh-CN");
                this.mSpeechRecognizer.startListening(recognitionIntent);
            }else{
                Toast.makeText(context,"没有语音识别服务",Toast.LENGTH_SHORT).show();
            }
    
        }
    
     @Override
        public void onReadyForSpeech(Bundle params) {
            Log.i("SpeechRecognition","onReadyForSpeech");
        }
    
        @Override
        public void onBeginningOfSpeech() {
            Log.i("SpeechRecognition","onBeginningOfSpeech");
        }
    
        @Override
        public void onRmsChanged(float rmsdB) {
            Log.i("SpeechRecognition","onRmsChanged");
        }
    
        @Override
        public void onBufferReceived(byte[] buffer) {
            Log.i("SpeechRecognition","onBufferReceived");
        }
    
        @Override
        public void onEndOfSpeech() {
            Log.i("SpeechRecognition","onEndOfSpeech");
        }
    
        @Override
        public void onError(int error) {
            Log.i("SpeechRecognition","onError");
        }
    
        @Override
        public void onResults(Bundle results) {
            ArrayList<String> partialResults=results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            if(partialResults!=null && partialResults.size()>0) {
                String bestResult = partialResults.get(0);
                Log.i("SpeechRecognition","onResults bestResult="+bestResult);
                //result.setText(bestResult);
            }
        }
    

    2.PocketSphinx,不多说,目前感觉是唯一的救命稻草,基本能用,单个短语容易误识别

    参考文章:https://www.cnblogs.com/elecdog/p/7235235.html

    https://www.jianshu.com/p/82ffb90cc463

    参考demo如下:https://download.csdn.net/download/android_xc/12274142

    展开全文
  • 基于android的离线语音识别,实现没有网络的情况下把语音转换成文字信息。 对程序内容进行了简化,内容简单明了,容易看懂。 包含了离线语音需要的所有离线包 speechapp.java文件第22行修改成自己在讯飞网站申请的id...
  • 经过多方查找资料,发现需要装一个Google语音的插件,运行语音识别的时候要用到。如果没有就提示没有找到设备。 下载地址:http://download.csdn.net/detail/wojiao555555/6014985 代码如下: ...

    开始做这个的时候,从网上当了一段代码,但后来测试老是提示没有找到设备。。。非常烦人。。。

    经过多方查找资料,发现需要装一个Google语音的插件,运行语音识别的时候要用到。如果没有就提示没有找到设备。

    下载地址:http://download.csdn.net/detail/wojiao555555/6014985

    代码如下:

    1. public class RecognizerIntentActivity extends Activity {  
    2.   
    3.     private Button btnReconizer;  
    4.     private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;  
    5.     @Override  
    6.     protected void onCreate(Bundle savedInstanceState) {  
    7.         // TODO Auto-generated method stub  
    8.         super.onCreate(savedInstanceState);  
    9.         setContentView(R.layout.reconizer);  
    10.           
    11.         btnReconizer=(Button) this.findViewById(R.id.btnRecognizer);  
    12.         btnReconizer.setOnClickListener(new OnClickListener() {  
    13.               
    14.             @Override  
    15.             public void onClick(View v) {  
    16.                 // TODO Auto-generated method stub  
    17.                 try{  
    18.                 //通过Intent传递语音识别的模式,开启语音  
    19.                 Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);  
    20.                 //语言模式和自由模式的语音识别  
    21.                 intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);  
    22.                 //提示语音开始  
    23.                 intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "开始语音");  
    24.                 //开始语音识别  
    25.                 startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);  
    26.                 }catch (Exception e) {  
    27.                     // TODO: handle exception  
    28.                     e.printStackTrace();  
    29.                     Toast.makeText(getApplicationContext(), "找不到语音设备"1).show();  
    30.                 }  
    31.             }  
    32.         });  
    33.           
    34.     }  
    35.       
    36.     @Override  
    37.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    38.         // TODO Auto-generated method stub  
    39.         //回调获取从谷歌得到的数据   
    40.         if(requestCode==VOICE_RECOGNITION_REQUEST_CODE && resultCode==RESULT_OK){  
    41.             //取得语音的字符  
    42.             ArrayList<String> results=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);  
    43.               
    44.             String resultString="";  
    45.             for(int i=0;i<results.size();i++){  
    46.                 resultString+=results.get(i);  
    47.             }  
    48.             Toast.makeText(this, resultString, 1).show();  
    49.         }  
    50.         super.onActivityResult(requestCode, resultCode, data);  
    51.     }  
    52. }  


    上边的那个需要连网,因为是把语音信号发送到google服务器上进行比对、识别的。所以这次打算弄个离线的demo,就是开着航班模式也能识别的。demo。

    参考如下:

    http://www.cnblogs.com/yin52133/archive/2012/07/12/2588201.html#2611619

    代码可以从这里下载:

    http://download.csdn.net/detail/wojiao555555/6015003

    展开全文
  • **关于离线语音识别的相关问题 最近在看关于AI音箱相关的资料,想请教大牛们, 关于离线语音识别,好多文章说的是使用神经网络技术进行特征提取和建模等来识别指令,那离线识别和云识别不知道是不是都是这一个模型,...
  • win+python实现离线语音识别 2018年12月05日 19:28:29 面-包 阅读数:38更多 个人分类: python学习 安装SpeechRecognition模块 使用recognize_sphinx(),安装PocketSphinx使用测试: import speech_...
  • 最近Boss让我开发一个离线语音听写功能 , 可是我发现科大讯飞的离线版本下架了 , 也看了很多地方如百度语音.......  都没发现有离线版本 , 然而今天突然发现科大讯飞的离线听写又上架了 这就让我很开心 . 我就...
  • 讯飞离线语音命令词识别 1、注册并下载sdk 2、创建工程 3、权限 4、拷贝jar包 5、初始化引擎 6、功能代码 7、打赏1、注册并下载sdk讯飞官网地址:http://www.xfyun.cn/*选择立即开通并登录* 弹出对话框,选择创建...
1 2 3 4 5 ... 20
收藏数 7,387
精华内容 2,954