2018-12-06 18:37:39 H2SbF7 阅读数 633
  • 嵌入式开发知识体系与开发入门

    介绍什么是嵌入式技术,嵌入式技术在现实生活中的应用,嵌入式的开发过程,嵌入式学习的知识体系,步骤。 适合对象: 1.嵌入式相关专业学生 2.嵌入式学习爱好者 学习条件: 1.有计算机,电子相关基础知识 2.C语言相关知识

    11793 人正在学习 去看看 沈寒

基于ARMstm32开发板的语音识别技术的实现代码或者相关思路,希望大家提供一下

2015-01-10 12:53:47 liufuliang163 阅读数 840
  • 嵌入式开发知识体系与开发入门

    介绍什么是嵌入式技术,嵌入式技术在现实生活中的应用,嵌入式的开发过程,嵌入式学习的知识体系,步骤。 适合对象: 1.嵌入式相关专业学生 2.嵌入式学习爱好者 学习条件: 1.有计算机,电子相关基础知识 2.C语言相关知识

    11793 人正在学习 去看看 沈寒

语音识别之自我总结


1.进入语音识别领域
因为各种原因,之前单位不想继续了,打算换工作,正好在加入的技术群里面有招聘相关职位,看了下,比较符合(主要是用ARM汇编写过程序,做过代码优化等),顺利进到新公司,开始接触语音识别领域。

2.工作和学习过程
       工作吗,首先看公司安排,公司打算做一款嵌入式语音识别引擎,经过评估,确定用 CMU Sphinx,之前同事已经做几个月,经过评估,项目需要优化,需要经核心代码汇编化,以满足速度要求,这也是本人进入这家公司的主要原因。

        虽然之前同事已经做过,但是经了解,其并不是完全自己移植到手机端,是利用了网上的一些东西,所以导致版本很老,而且好多JNI和JAVA层代码不相符的情况,所以在一周之后决定全部从头开始做。结合网上的资料,搭建环境,生成代码,然后建立android平台工程(在这块上完全不能按网上的资料做,还好自己以前弄过相关的东西),提取自带模型,测试,确实,实时率,识别率都不甚理想。

首先解决速度的问题,经过近两个多月的测试,汇编化,浮点计算转定点等工作,实时率基本上在0.12以内,性能基本满足。

        其次是识别率的问题,查资料,找方法,经过N多弯路,最后确定自己做模型,包括语言模型,语音模型,又是三个多月,终于识别率到了90%以上。

最后是商品化工作,将模型从内存加载,并作加密保护(毕竟是公司,公司要靠这个赚钱的。。。),两个月,测试后终于出了第一版DEMO,呵呵,没错,就是DEMO,毕竟只有一个人做,速度确实不够快。这还是在WINDOWS上建立的同步代码的工程,好多问题比较好定位,查找,不然就在ANDROID平台,估计还需两个月。。。,苦逼啊

3.成果
  就是对语音识别整个过程有了全方位的了解,包括识别引擎,模型训练,性能提升,当然,有些细节的东西还是不太明白,没关系,用华云大哥的话说,我已经站在了一个很高的平台之上了,总算是没有白熬那么长时间啊

  好了,说了这么多,给大家展示一下我成果,DEMO.APK,直接安装到手机上即可,

下面是测试数据,可以按下按钮说话,抬起之后会出最后的结果,中间结果忽略

打开空调
车内循环
车外循环
关闭空调
打开天窗
关闭天窗
接听
挂断
打电话
打开导航
关闭导航
打开本地音乐
关闭音乐
播放
暂停
收藏
随机播放
单曲循环
全部循环
播放收藏音乐
上一台
下一台
打开新闻
打开电台
关闭收音机
自动搜台
内循环
外循环
通讯录
导航
本地音乐
关闭广播
电台
播放收藏列表
广播
上一曲
下一曲
有声读物
上一个
下一个
上一条
下一条
新闻
上一首
下一首
打开收音机
打开广播
关闭电台
收音机

稍后会详细记录,总结在这个项目中碰到的问题

发不了附件,奇怪,有对语音识别有兴趣的朋友可以加我QQ,275453043,我们一起学习,讨论问题。。。

DEMO.apk 链接
http://download.csdn.net/detail/liufuliang163/8347299

源码 github 地址
https://github.com/liufuliang/AndroidCMUSphinx
欢迎有兴趣的朋友一起学习
2013-04-21 23:29:47 zhandoushi1982 阅读数 26627
  • 嵌入式开发知识体系与开发入门

    介绍什么是嵌入式技术,嵌入式技术在现实生活中的应用,嵌入式的开发过程,嵌入式学习的知识体系,步骤。 适合对象: 1.嵌入式相关专业学生 2.嵌入式学习爱好者 学习条件: 1.有计算机,电子相关基础知识 2.C语言相关知识

    11793 人正在学习 去看看 沈寒

        Android语音识别,借助于云端技术可以识别用户的语音输入,包括语音控制等技术,下面我们将利用Google提供的Api实现这一功能。功能点为:通过用户语音将用户输入的语音识别出来,并打印在列表上。

       首先建立如下的一个activity,并在button下建立一个listview控件(用来回显语言识别到的项目)。

      代码如下:

package com.example.speechreg;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;   //用于查找本地应用软件包相关的类
import android.content.pm.ResolveInfo;      //从系统IntentFilter返回的信息
import android.os.Bundle;
import android.speech.RecognizerIntent;     //语音识别类
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;         //相同数据用数组存储的匹配转化类
import android.widget.Button;
import android.widget.ListView;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * Sample code that invokes the speech recognition intent API.
 */
public class MainActivity extends Activity implements OnClickListener {
    private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;   //startActivityForResult操作要求的标识码
    private ListView mList;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.voice_recognition);
        Button speakButton = (Button) findViewById(R.id.btn_speak);
        mList = (ListView) findViewById(R.id.listView1);    
 
        PackageManager pm = getPackageManager();
        List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(
                RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);  //通过全局包管理器及特定intent,查找系统是否有语音识别的服务程序
        if (activities.size() != 0) {
            speakButton.setOnClickListener(this);	//如果存在该activity
        } else {
            speakButton.setEnabled(false);
            speakButton.setText("Recognizer not present");    //否则将BUTTON显示值修改,并设置成不可选
        }
    }
 
    public void onClick(View v) {    //OnClickListener中的要override的函数
        if (v.getId() == R.id.btn_speak) {
            startVoiceRecognitionActivity();
        }
    }
 
    private void startVoiceRecognitionActivity() {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
                "Speech recognition demo");    //设置语音识别Intent调用的特定属性参数
        startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);   启动一个要求有返回值的activity调用
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  //该函数非接口内也非抽象函数,为何会Override?
        if (requestCode == VOICE_RECOGNITION_REQUEST_CODE
                && resultCode == RESULT_OK) {
            // Fill the list view with the strings the recognizer thought it
            // could have heard
            ArrayList<String> matches = data
                    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);  //解析存储识别返回的结果
            mList.setAdapter(new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, matches));  //在listview中显示结果
        }
 
        super.onActivityResult(requestCode, resultCode, data);
    }
}

     运行结果如下,它会自动调用谷歌语音识别的服务activity,并返回特定activity执行的结果。

=========================================讯飞平台语音识别语音播报==========================

在网上看到一篇中文语音识别、控制,语音合成的好文章。分享地址http://blog.csdn.net/gao_chun/article/details/46377505



参考原文:http://blog.csdn.net/comkingfly/article/details/7359987

参考原文:http://software.intel.com/zh-cn/articles/developing-android-applications-with-voice-recognition-features/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=intelandroid-yuyinshibie

2017-08-29 09:33:53 xpp012 阅读数 4131
  • 嵌入式开发知识体系与开发入门

    介绍什么是嵌入式技术,嵌入式技术在现实生活中的应用,嵌入式的开发过程,嵌入式学习的知识体系,步骤。 适合对象: 1.嵌入式相关专业学生 2.嵌入式学习爱好者 学习条件: 1.有计算机,电子相关基础知识 2.C语言相关知识

    11793 人正在学习 去看看 沈寒

第一次接触语音识别还是2010年的时候,我帮一个靠语音算法创业的同学移植了他的语音引擎到一款嵌入式产品上去。

当时他做的引擎识别率还可以,但不够智能还需要找一些人来录音学习,也是那个时候知道了科大讯飞;


总结下刚刚移植的这个语音机器人(android平台)

因为用到了图灵的知识库,百度的语音识别和语音合成,所以需要去申请相应的key和下载相应的SDK库代码

1)去图灵注册申请一个key和secret

2) 去百度注册申请一个key和secret


同时只要在图灵上下载SDK包就可以,第一次移植不用去下载更新百度的库,不然可能会带来一些其他问题,代码也非常简单,有相应注释一看基本上都明白大概意思。

MainActivity.java

package com.turing.demo;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.TextView;

import com.turing.androidsdk.HttpRequestListener;
import com.turing.androidsdk.RecognizeListener;
import com.turing.androidsdk.RecognizeManager;
import com.turing.androidsdk.TTSListener;
import com.turing.androidsdk.TTSManager;
import com.turing.androidsdk.TuringManager;

public class MainActivity extends Activity {

    private final String TAG = MainActivity.class.getSimpleName();
    private TTSManager mTtsManager;
    private RecognizeManager mRecognizerManager;
    private TuringManager mTuringManager;
    private TextView mStatus;
    /** 返回结果,开始说话 */
    public static final int MSG_SPEECH_START = 0;
    /** 开始识别 */
    public static final int MSG_RECOGNIZE_RESULT = 1;
    /** 开始识别 */
    public static final int MSG_RECOGNIZE_START = 2;

    /**
     * 申请的turing的apikey(测试使用)
     * **/
    private final String TURING_APIKEY = "d975f8141aa550cea27b7f48dd50c48d";
    /**
     * 申请的secret(测试使用)
     * **/
    private final String TURING_SECRET = "4145a1cb5f92901b";
    // 百度key(测试使用)
    private final String BD_APIKEY = "ZC2NNfFUkg8rxgmVkfBC6ycX";
    // 百度screte(测试使用)
    private final String BD_SECRET = "9a98e53b2ef7339bf03793f0b53fc7e4";

    private Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case MSG_SPEECH_START:
                mStatus.setText("开始讲话:" + (String) msg.obj);
                mTtsManager.startTTS((String) msg.obj);
                break;
            case MSG_RECOGNIZE_RESULT:
                mStatus.setText("识别结果:" + msg.obj);
                mTuringManager.requestTuring((String) msg.obj);
                break;
            case MSG_RECOGNIZE_START:
                mStatus.setText("开始识别");
                mRecognizerManager.startRecognize();
                break;
            }
        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mStatus = (TextView) findViewById(R.id.tv_status);

        init();

    }

    /**
     * 初始化turingSDK、识别和tts
     * 
     */
    private void init() {
       
        mRecognizerManager = new RecognizeManager(this, BD_APIKEY, BD_SECRET);
        mTtsManager = new TTSManager(this, BD_APIKEY, BD_SECRET);
        mRecognizerManager.setVoiceRecognizeListener(myVoiceRecognizeListener);
        mTtsManager.setTTSListener(myTTSListener);
        mTuringManager = new TuringManager(this, TURING_APIKEY,
                TURING_SECRET);
        mTuringManager.setHttpRequestListener(myHttpConnectionListener);
        mTtsManager.startTTS("你好啊");
    }

    /**
     * 网络请求回调
     */
    HttpRequestListener myHttpConnectionListener = new HttpRequestListener() {

        @Override
        public void onSuccess(String result) {
            if (result != null) {
                try {
                    Log.d(TAG, "result" + result);
                    JSONObject result_obj = new JSONObject(result);
                    if (result_obj.has("text")) {
                        Log.d(TAG, result_obj.get("text").toString());
                        mHandler.obtainMessage(MSG_SPEECH_START,
                                result_obj.get("text")).sendToTarget();
                    }
                } catch (JSONException e) {
                    Log.d(TAG, "JSONException:" + e.getMessage());
                }
            }
        }

        @Override
        public void onFail(int code, String error) {
            Log.d(TAG, "onFail code:" + code + "|error:" + error);
            mHandler.obtainMessage(MSG_SPEECH_START, "网络慢脑袋不灵了").sendToTarget();
        }
    };

    /**
     * 语音识别回调
     */
    RecognizeListener myVoiceRecognizeListener = new RecognizeListener() {

       

        @Override
        public void onStartRecognize() {
            // 仅针对百度回调
        }

        @Override
        public void onRecordStart() {

        }

        @Override
        public void onRecordEnd() {

        }

        @Override
        public void onRecognizeResult(String result) {
            Log.d(TAG, "识别结果:" + result);
            if (result == null) {
                mHandler.sendEmptyMessage(MSG_RECOGNIZE_START);
                return;
            }
            mHandler.obtainMessage(MSG_RECOGNIZE_RESULT, result).sendToTarget();
        }

        @Override
        public void onRecognizeError(String error) {
            Log.e(TAG, "识别错误:" + error);
            mHandler.sendEmptyMessage(MSG_RECOGNIZE_START);
        }
    };

    /**
     * TTS回调
     */
    TTSListener myTTSListener = new TTSListener() {

        @Override
        public void onSpeechStart() {
            Log.d(TAG, "onSpeechStart");
        }

        @Override
        public void onSpeechProgressChanged() {

        }

        @Override
        public void onSpeechPause() {
            Log.d(TAG, "onSpeechPause");
        }

        @Override
        public void onSpeechFinish() {
            Log.d(TAG, "onSpeechFinish");
            mHandler.sendEmptyMessage(MSG_RECOGNIZE_START);
        }

        @Override
        public void onSpeechError(int errorCode) {
            Log.d(TAG, "onSpeechError:" + errorCode);
            mHandler.sendEmptyMessage(MSG_RECOGNIZE_START);
        }

        @Override
        public void onSpeechCancel() {
            Log.d(TAG, "TTS Cancle!");
        }
    };
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.turing.demo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />
    <!-- SDK必须 -->
    <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.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>






但是提供的文档里面有两个接口函数如下的定义描述实际上是搞反了

需要注意下

//停止语音识别操作,代表手动触发用户发音结束事件

- (void)stopRecognize;

//取消正在进行的语音识别操作

- (void)cancleRecognize;








2019-05-28 14:24:53 qq_33472146 阅读数 163
  • 嵌入式开发知识体系与开发入门

    介绍什么是嵌入式技术,嵌入式技术在现实生活中的应用,嵌入式的开发过程,嵌入式学习的知识体系,步骤。 适合对象: 1.嵌入式相关专业学生 2.嵌入式学习爱好者 学习条件: 1.有计算机,电子相关基础知识 2.C语言相关知识

    11793 人正在学习 去看看 沈寒

一 HTK简介
HTK(HMM Tools Kit)是一个剑桥大学开发的专门用于建立和处理HMM的实验工具包[1],主要应用于语音识别领域,也可以应用于语音合成、字符识别和DNA排序等领域。HTK经过剑桥大学、Entropic公司及Microsoft公司的不断增强和改进,使其在语音识别领域处于世界领先水平,另外,HTK还是一套源代码开放的工具箱,其基于ANSI C的模块化设计方式可以方便地嵌入到用户系统中。
二 HTK的使用方法
HTK目录结构
htk是一个开源的软件,解压之后的目录如下:
在这里插入图片描述
此外,几个重要的文件说明如下:
env:编译的环境变量设置。
HLMLib:HMM语言模型库。
HLMTools:HMM语言模型工具。
HTKBook:开发帮助文档。
HTKLib:HTK的声学库文件。
HTKTools:HTK的声学开发工具。
对于声学部分来说,比较重要两个文件夹是后面的两个文件夹。
HTK原理
HTK软件的体系结构如下图所示:
在这里插入图片描述
整个HTK是使用HMM作为语音识别的核心,当HMM应用于孤立词语音识别时,它用不同的隐含状态来描述不同的语音发音,对于连续语音识别系统,多个孤立词HMM子模型按一定的语言模型组成的复合HMM模型序列来刻画连续的语音信号,在序列中每个模型直接对应于相关的发音,并且每一个模型都有进入和退出状态,这两个状态没有对应的观察矢量,只用于不同模型的连接。

上图中的 HTK Tool周边的一些库都是HTKLib,这些库是语音信号处理时必须的资源或者通用库文件,HTK Tool正是利用HTKLib文件夹中的库文件(如HMem,HSigP等库文件),链接生成一些可执行程序。如HSigP库完成信号的预加重,信号加窗,FFT等方面的计算。
HTK工具使用
HTK工具的使用主要分布在使用过程中的四个阶段:
1.数据准备;
2.模型训练;
3.模式识别/结果测试;
4.模型分析
如图所示:
在这里插入图片描述
每一个HTK命令行工具都在特定的阶段完成特定的任务。整个入口就是原始的声音文件和对声音文件的文本记录信息。
恩,后续再补。。。

没有更多推荐了,返回首页