离线语音识别_离线语音识别 讯飞 - CSDN
  • 百度离线语音识别

    万次阅读 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

    展开全文
  • 树莓派——科大讯飞离线语音识别

    千次阅读 2019-01-06 09:42:04
    申请到树莓派库后,下载SDK,基本配置如 Linux 在运行之前,要先进行如下配置: 要将libmsc.so 复制到 /usr/local/lib/ 下, 方便编译的可执行文件时寻找 sudo cp libs/x86/libmsc.so /usr/local/lib/ ...

    申请到树莓派库后,下载SDK,基本配置如 Linux

    在运行之前,要先进行如下配置:

    要将libmsc.so 复制到 /usr/local/lib/ 下,  方便编译的可执行文件时寻找

    sudo cp libs/x86/libmsc.so /usr/local/lib/
    sudo ldconfig

    否则,运行程序时,将出现如下错误:

    ./test: error while loading shared libraries: libmsc.so: cannot open shared object file: No such file or directory

    然后测试录音文件。

    发现之前的录音方法可以识别,   成功~

    展开全文
  • 微软.Net离线语音识别

    2020-07-22 14:43:25
    微软.net framework自带离线语音识别引擎,可以支持多种语言的离线识别。在使用时注意添加对system.speech的引用,默认是不引用的,如果没有请注意.net版本,最好在4.5以上。另外添加using命名空间。以下为简单的...

    微软.net framework自带离线语音识别引擎,可以支持多种语言的离线识别。该引擎具有免费、无需网络、针对性强、运算量小、兼容windows的特点,对于固定语境的语音识别具有不可比拟的优势。

    在使用时注意添加对system.speech的引用,默认是不引用的,如果没有请注意.net版本,最好在4.5以上。另外添加using命名空间。以下为简单的控制台例子。

    using System;
    using System.Speech.Recognition;
    
    namespace 语音识别
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                // Create an in-process speech recognizer for the en-US locale.  
                using (
                SpeechRecognitionEngine recognizer =
                  new SpeechRecognitionEngine(
                    new System.Globalization.CultureInfo("zh-CN")))
                {
                    Choices choices = new Choices(new string[] { "你好", "123","木头人","我是"});
                    GrammarBuilder gb = new GrammarBuilder(choices);
    
                    // Create and load a dictation grammar.  
                    recognizer.LoadGrammar(new Grammar(gb));
    
                    // Add a handler for the speech recognized event.  
                    recognizer.SpeechRecognized +=
                      new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
    
                    // Configure input to the speech recognizer.  
                    recognizer.SetInputToDefaultAudioDevice();
    
                    // Start asynchronous, continuous speech recognition.  
                    recognizer.RecognizeAsync(RecognizeMode.Multiple);
    
                    // Keep the console window open.  
                    while (true)
                    {
                        Console.ReadLine();
                    }
                }
            }
    
            // Handle the SpeechRecognized event.  
            static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            {
                Console.WriteLine("Recognized text: " + e.Result.Text);
            }
        }
    }

    可以直接下载我的例程https://download.csdn.net/download/u010622265/12649885

    需要注意的是CultureInfo,默认情况下中文的操作系统只有"Zh-CN",使用其他的会报错,除非系统安装了其他的语音识别包,win10可在设置里安装:

    语法可以有多种形式,具体参考.net文档。

    下面列举一种以SRGS(Speech Recognition Grammar Specification)规范定义的语法文件(格式遵循xml)。

    该文件中root是main规则,而main规则中又可以包含其他规则(part1-5)定义的语法,最终包含的句式有:

    我/你/他+是+学生/老师/工人
    我/你/他+喜欢/讨厌+打球/读书/音乐
    我/你/他+今年+12/24/36/50+岁

    <?xml version="1.0" encoding="UTF-8" ?>
    <grammar version="1.0" xml:lang="zh-CN"
             xmlns="http://www.w3.org/2001/06/grammar"
             tag-format="semantics/1.0" root="Main">
    
      <rule id="Main">
        <one-of>
          <item>
            <ruleref uri="#Part1"/> 是 <ruleref uri="#Part2"/>
          </item>
          <item>
            <ruleref uri="#Part1"/> <ruleref uri="#Part3"/> <ruleref uri="#Part4"/>
          </item>
          <item>
            <ruleref uri="#Part1"/>
            今年
            <ruleref uri="#Part5"/>
            岁
          </item>
        </one-of>
      </rule>
    
      <rule id="Part1" scope="public">
        <one-of>
          <item> 我 </item>
          <item> 你 </item>
          <item> 他 </item>
        </one-of>
      </rule>
    
      <rule id="Part2" scope="public">
        <one-of>
          <item> 学生 </item>
          <item> 老师 </item>
          <item> 工人 </item>
        </one-of>
      </rule>
      
      <rule id="Part3" scope="public">
        <one-of>
          <item> 喜欢</item>
          <item> 讨厌</item>
        </one-of>
      </rule>
    
      <rule id="Part4" scope="public">
        <one-of>
          <item> 打球</item>
          <item> 读书</item>
          <item> 音乐</item>
        </one-of>
      </rule>
    
      <rule id="Part5" scope="public">
        <one-of>
          <item> 12</item>
          <item> 24</item>
          <item> 36</item>
          <item> 50</item>
        </one-of>
      </rule>
    </grammar>

     调用这种SRGS文件定义的语法:

    recognizer.LoadGrammar(new Grammar("Grammar.xml"));

    SRGS格式详细参考https://www.w3.org/TR/speech-grammar/

    展开全文
  • 基于android的离线语音识别,实现没有网络的情况下把语音转换成文字信息。 对程序内容进行了简化,内容简单明了,容易看懂。 包含了离线语音需要的所有离线包
  • 五款免费开源的语音识别工具

    万次阅读 2018-03-23 15:41:51
    按:本文原作者 Cindi Thompson,美国德克萨斯大学奥斯汀分校(University of Texas at Austin)计算机科学博士,数据科学咨询公司硅谷数据科学...作为 SVDS 研究团队的成员,我们会经常接触各种不同的语音识别...

    按:本文原作者 Cindi Thompson,美国德克萨斯大学奥斯汀分校(University of Texas at Austin)计算机科学博士,数据科学咨询公司硅谷数据科学(Silicon Valley Data Science,SVDS)首席科学家,在机器学习、自然语言处理等领域具有丰富的学术研究和产业界从业经验。雷锋网编译。


    作为 SVDS 研究团队的成员,我们会经常接触各种不同的语音识别技术,也差不多见证了语音识别技术近几年的发展。直到几年之前,最先进的语音技术方案大多都是以语音为基础的(phonetic-based),包括发音模型(Pronunciation models),声学模型(Acoustic Modelling)和语言模型(Language Model)等。通常情况下,这些模型大多都是以隐马尔可夫模型(HMM)和 N-gram 模型为核心的。未来,我们希望以这些传统模型为基础,探索一些诸如与百度 Deep Speech 等最新的语音识别系统相结合的新技术。当然,目前互联网上可以找到许多针对这些基础模型进行解释、汇总的文章和资料,但针对它们之间的差别和特点展开阐述的却并不多。

    为此,我们对比了五款基于 HMM 和 N-gram 模型的语音识别工具:CMU Sphinx,Kaldi,HTK,Julius 和 ISIP。它们都是开源世界的顶级项目,与 Dragon 和 Cortana 等商业语音识别工具不同,这些开源、免费的工具可以为开发者提供更大的自由度以及更低的开发成本,因此在开发圈始终保持着强大的生命力。

    需要提前说明的是:以下分析大多来源于我们的主观经验,同时也参考了互联网上的其他信息。而且这篇文章也并非一个覆盖所有语音识别开源工具的汇总类文章,我们只是对比了其中五款相对更主流的产品。另外,HTK 并不是严格开源的,它的代码并不能重新组织发布,也不能用于商业用途。

    想知道更多语音识别工具的用户请点击以下链接,其中列出了几乎所有开源/非开源的语音识别工具,非常全面。

    https://en.wikipedia.org/wiki/List_of_speech_recognition_software 


      编程语言:

    根据你对不同编程语言的熟悉程度,你可能会更偏爱某一种工具。如上图所示,这里列出的五款工具中,除了 ISIP 只支持 C++ 之外,全都支持 Python。你可以直接在它们的官网找到不同语言对应的下载链接。不过,Python 版有可能并不会覆盖工具包的全部功能,有些功能还可能是为其他语言的特性单独设计的。另外值得注意的是,CMU Sphinx 还支持 Java、C 和其他更多语言。

      开发者活跃度:

    这里列出的五个项目均源于学术研究。

    从名字也能看出,CMU Sphinx 是一款源于卡内基梅隆大学的产品。它的研发历史大约可以追溯到 20 年前,目前在 GitHub 和 SourceForge 平台同步更新。在 GitHub 平台有 C 和 Java 两个版本,而且据说分别只有一个管理员维护。但在 SourceForge 平台却有 9 个管理员和十几个开发者。

    Kaldi 源于 2009 年的一场研讨会,代码目前在 GitHub 平台开源,共有 121 位贡献者。 

    HTK 始于 1989 年的剑桥大学,曾一度商业化,但目前又回归剑桥。如前所述 HTK 现在并不是一款严格意义的开源工具,而且更新缓慢(虽然它的最新版本更新于 2015 年 12 月,但前一个版本的更新时间却是 2009 年,中间隔了差不多 6 年时间)。

    Julius 始于 1997 年,最后一个主要版本更新于 2016 年 9 月,据称其 GitHub 平台有三名管理员维护。

    ISIP 是第一个比较先进的开源语音识别系统,起源于密西西比州。它主要在 1996 年到 1999 年之间研发,最后一个版本发布于 2011 年,在 GitHub 平台出现之前就已经停止更新了。


      社区活跃度:

    这一部分我们考察了上述五个工具的邮件和社区讨论情况。

    CMU Sphinx 的论坛讨论热烈,回帖积极。但其 SourceForge 和 GitHub 平台存在许多重复的 repository。相比之下,Kaldi 的用户则拥有更多交互方式,包括邮件、论坛和 GitHub repository 等。HTK 有邮件列表,但没有公开的 repository。Julius 官网上的论坛链接目前已经不可用,其日本官网上可能有更详细的信息。ISIP 主要用于教育目的,其邮件列表目前已不可用。

      教程和示例:

    CMU Sphinx 的文档简单易读,讲解深入浅出,且贴近实践操作。

    Kaldi 的文档覆盖也很全面,但是在我看来更难理解。而且,Kaldi 同时包括了语音识别解决方案中的语音和深度学习方法。

    如果你并不熟悉语音识别,那么可以通过对 HTK 官方文档(注册后可以使用)的学习对该领域有一个概括的认识。同时,HTK 的文档还适用于实际产品设计和使用等场景。

    Julius 专注于日语,其最新的文档也是日语,但团队正在积极推动英文版的发布。

    以下链接提供了一些基于 Julius 的语音识别样例。

    https://github.com/julius-speech/dictation-kit 

    最后是 ISIP,虽然它也有一些文档,但是并不系统。

      预训练模型:

    即使你使用这些开源工具的主要目的是想要学习如何去训练一个专业的语音识别模型,但一个开箱即用的预先训练好的模型仍然是一个不可忽略的优点。

    CMU Sphinx 包括英语、法语、西班牙语和意大利语在内的诸多可以直接使用的模型,详情可以参考它的说明文档。

    Kaldi对现有模型进行解码的指令深藏在文档中,不太容易找到,但我们仍然发现了贡献者在 egs/voxforge 子目录下基于英文 VoxForge 语料库训练好的一个模型,并且还可以通过 online-data 子目录下的一个脚本直接运行。详情可以参考 Kaldi 项目的 repository。

    我们没有深入挖掘其他三个软件包的模型训练情况,但它们应该至少包含一些简单可用的预训练模型,而且与 VoxForge 兼容(VoxForge 是一个非常活跃的众包语音识别数据库和经过训练的模型库)。

    展开全文
  • win+python实现离线语音识别

    千次阅读 2018-12-05 19:28:29
    安装SpeechRecognition模块 使用recognize_sphinx(),安装PocketSphinx 使用测试: import speech_recognition as sr # obtain audio from the microphone r = sr.Recognizer() print(r) ...pri...
  • 从科大讯飞官方Demo中提取的语音识别部分代码加以修改,可实现在线与离线语音识别,下载后需要填写自己的APPID以及修改成与ID相匹配的讯飞SDK,实测可运行。
  • 离线语音识别Demo

    2020-07-27 23:30:44
    离线语音识别Demo
  • 用java调用科大讯飞的离线语音识别dll实现离线识别(JNA实现) 本人接的任务,做离线语音识别,用的是科大讯飞的离线识别,java不支持离线了,所以下载了windows的离线包,用JNA进行调用。之前用的是jni,但是一直...
  • 本项目是做出的产品是一个很大的一个Windows下的增强现实系统,产品功能已经基本完善,考虑到给用户带来更好的体验,故综合评估后采用讯飞语音识别方案进行嫁接。 项目介绍:1)打开系统时启动语音识别,检测到用户...
  • Hololens 离线中文语音识别

    千次阅读 2019-03-04 17:34:26
    Hololens 离线中文语音识别 Hololens自从去年11月份首推中文系统后,Hololens本身已经支持中文语音识别了 Hololens 中文系统升级 既然系本身已经支持,我们就可以像Win10一样简单方便的使用小娜,再也不用使用第三方...
  • 离线语音识别,树莓派语音识别科大讯飞语音识别离线包。
  • 基于科大讯飞语音识别demo(离线

    热门讨论 2020-07-30 11:41:16
    基于科大讯飞语音识别的demo(离线版的)。源码是从官demo提取出来的,简单明了,项目可以直接运行。依赖讯飞语音的apk和离线语音包(demo中可直接下载)
  • 离线进行谷歌的语音识别
  • 博文配套的源码,初稿,用java调用科大讯飞的离线语音识别dll实现离线识别,只要路径对了,就绝对能运行,跟机型无关,操作系统windows
  • 框架看法:智能音箱大战全面开火,那么问题来了:如何成为一名全栈语音识别工程师?
  • Unity3d百度语音识别项目 基于百度语音识别API,C#语言可用,项目较为简单
  • C# 开发的离线语音识别,语音转文字,可以识别短语音,指定识别库,程序已测试运行成功,识别速度快,需要的可以自行修改使用
  • Android 第三方SDK开发视频教程,给课程结合讯飞语音这个第三方SDK进行实战教学,实现在线语音合成,将文字信息转化为声音信息,给应用配上“嘴巴;语音听写,将连续语音识别为文字,给应用配上“耳朵”。
  • windows平台语音识别

    2020-07-30 23:30:19
    windows平台的语音识别程序,调用讯飞接口,能实现离线语音识别
1 2 3 4 5 ... 20
收藏数 112,811
精华内容 45,124
关键字:

离线语音识别