2015-01-10 12:53:47 liufuliang163 阅读数 849
  • 海思平台上USB WIFI的移植与局域网无线调试和视频流...

    本季课程在开发板上移植USB WIFI模块(套装附带的MT7601模块),工作在ap模式下,并且用电脑通过WIFI去连接开发板实现主机和开发板的无线网络局域网通信,这样就可以用WIFI网络取代板载ethernet有线网络方式来进行调试和局域网视频预览。现在很多的视频摄像头产品都要求支持无线网络连接功能,本季课程主要是针对这方面开发技术讲解的。 随着通信行业发展,网速越来越快,网络也从文本时代发展越过语音时代到了现在视频时代,“优酷、爱奇艺”、“微视频”、“直播”等的出现也是视频逐步成为主流媒体的证据和表现。航拍、视频监控、刷脸过关检测、汽车ADAS系统等应用也是视频在主流行业中的应用,因此视频的采集、编解码、传输、识别等技术变得越来越有价值,涌现出了“海康威视”、“大华股份”、“深圳英飞拓”等一批明星企业,名扬海内外,动辄市值几百亿。同时在芯片级,国产华为海思HI35XX系列视频编解码方案也逐步取代进口芯片(如TI、安霸)成为主流方案。 视频行业技术含量高、难度大、学习周期长、发展变化快而资料少,因此行业比较缺人、工资较高。如海康威视,普通高校硕士研究生应届进入年薪普遍高于15-20万,在嵌入式linux领域也算高工资技术方向了。 本项目是朱老师及其团队推出的一个嵌入式linux领域重量级企业级实战项目,选用华为海思HI3518E方案,结合OV9712/AR0130 Sensor实现图像采集和H.264编码压缩,并通过ethernet和WIFI,以socket实时流和RTSP等方式,实现720P/960P高清视频传输。本项目共分11季,从海思SDK开发环境搭建,到sample程序讲解、SDK中API函数解析,到H.264编解码、RTSP流媒体传输、MP4文件打包,到图像IQ调试、图像识别等视频领域高阶内容,可以说从零基础入手,对图像采集、编解码、网络传输、图像存储和识别做了全方位的详细讲解和代码分析,是目前市面上**一套系统讲解图像和视频技术的视频课程。

    691 人正在学习 去看看 朱有鹏

语音识别之自我总结


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
欢迎有兴趣的朋友一起学习
2019-01-02 09:00:08 kongxx 阅读数 1476
  • 海思平台上USB WIFI的移植与局域网无线调试和视频流...

    本季课程在开发板上移植USB WIFI模块(套装附带的MT7601模块),工作在ap模式下,并且用电脑通过WIFI去连接开发板实现主机和开发板的无线网络局域网通信,这样就可以用WIFI网络取代板载ethernet有线网络方式来进行调试和局域网视频预览。现在很多的视频摄像头产品都要求支持无线网络连接功能,本季课程主要是针对这方面开发技术讲解的。 随着通信行业发展,网速越来越快,网络也从文本时代发展越过语音时代到了现在视频时代,“优酷、爱奇艺”、“微视频”、“直播”等的出现也是视频逐步成为主流媒体的证据和表现。航拍、视频监控、刷脸过关检测、汽车ADAS系统等应用也是视频在主流行业中的应用,因此视频的采集、编解码、传输、识别等技术变得越来越有价值,涌现出了“海康威视”、“大华股份”、“深圳英飞拓”等一批明星企业,名扬海内外,动辄市值几百亿。同时在芯片级,国产华为海思HI35XX系列视频编解码方案也逐步取代进口芯片(如TI、安霸)成为主流方案。 视频行业技术含量高、难度大、学习周期长、发展变化快而资料少,因此行业比较缺人、工资较高。如海康威视,普通高校硕士研究生应届进入年薪普遍高于15-20万,在嵌入式linux领域也算高工资技术方向了。 本项目是朱老师及其团队推出的一个嵌入式linux领域重量级企业级实战项目,选用华为海思HI3518E方案,结合OV9712/AR0130 Sensor实现图像采集和H.264编码压缩,并通过ethernet和WIFI,以socket实时流和RTSP等方式,实现720P/960P高清视频传输。本项目共分11季,从海思SDK开发环境搭建,到sample程序讲解、SDK中API函数解析,到H.264编解码、RTSP流媒体传输、MP4文件打包,到图像IQ调试、图像识别等视频领域高阶内容,可以说从零基础入手,对图像采集、编解码、网络传输、图像存储和识别做了全方位的详细讲解和代码分析,是目前市面上**一套系统讲解图像和视频技术的视频课程。

    691 人正在学习 去看看 朱有鹏

前一篇博客说了一下怎么在 Windows 平台使用 pocketsphinx 做中文语音识别,今天看看在 Linux 上怎办实现。

由于 pocketsphinx 没有提供 Linux 的二进制包,因此我们需要自己根据源码编译。

下载

从下面地址下载源代码

https://sourceforge.net/projects/cmusphinx/files/

这里,我使用的是 sphinxbase-5prealpha.tar.gz 和 pocketsphinx-5prealpha.tar.gz。

编译

  • 编译 sphinxbase
    tar zxvf sphinxbase-5prealpha.tar.gz
    mv sphinxbase-5prealpha sphinxbase
    cd sphinxbase
    ./configure
    make
    sudo make install
    
  • 编译 pocketsphinx
    tar zxvf pocketsphinx-5prealpha.tar.gz
    cd pocketsphinx-5prealpha
    ./configure
    make clean all
    sudo make install
    

下载模型文件

模型文件下载地址

https://sourceforge.net/projects/cmusphinx/files/Acoustic and Language Models/
其中 Mandarin 为中文普通话,下载之后我们可以看到

  • 声学模型:zh_broadcastnews_16k_ptm256_8000.tar.bz2 (需要解压)
  • 语言模型:zh_broadcastnews_64000_utf8.DMP
  • 拼音字典:zh_broadcastnews_utf8.dic

测试中文语音识别

  • 首先准备一个中文音频文件(要求:.wav 格式,采样频率 16000HZ,单声道)
  • 将下载的中文模型文件和解压后的 pocketsphinx 目录放到同一个目录下,这里假定就叫 “test”。
  • 进入“test”目录,然后运行下面的命令
pocketsphinx\bin\Release\x64\pocketsphinx_continuous.exe -hmm zh_broadcastnews_ptm256_8000 -lm zh_broadcastnews_64000_utf8.DMP -dict zh_broadcastnews_utf8.dic -infile myfile-16000.wav > myfile.txt
  • 运行完毕后,查看 myfile.txt 文件,内容即是程序识别出来的中文。
2017-08-29 09:33:53 xpp012 阅读数 4400
  • 海思平台上USB WIFI的移植与局域网无线调试和视频流...

    本季课程在开发板上移植USB WIFI模块(套装附带的MT7601模块),工作在ap模式下,并且用电脑通过WIFI去连接开发板实现主机和开发板的无线网络局域网通信,这样就可以用WIFI网络取代板载ethernet有线网络方式来进行调试和局域网视频预览。现在很多的视频摄像头产品都要求支持无线网络连接功能,本季课程主要是针对这方面开发技术讲解的。 随着通信行业发展,网速越来越快,网络也从文本时代发展越过语音时代到了现在视频时代,“优酷、爱奇艺”、“微视频”、“直播”等的出现也是视频逐步成为主流媒体的证据和表现。航拍、视频监控、刷脸过关检测、汽车ADAS系统等应用也是视频在主流行业中的应用,因此视频的采集、编解码、传输、识别等技术变得越来越有价值,涌现出了“海康威视”、“大华股份”、“深圳英飞拓”等一批明星企业,名扬海内外,动辄市值几百亿。同时在芯片级,国产华为海思HI35XX系列视频编解码方案也逐步取代进口芯片(如TI、安霸)成为主流方案。 视频行业技术含量高、难度大、学习周期长、发展变化快而资料少,因此行业比较缺人、工资较高。如海康威视,普通高校硕士研究生应届进入年薪普遍高于15-20万,在嵌入式linux领域也算高工资技术方向了。 本项目是朱老师及其团队推出的一个嵌入式linux领域重量级企业级实战项目,选用华为海思HI3518E方案,结合OV9712/AR0130 Sensor实现图像采集和H.264编码压缩,并通过ethernet和WIFI,以socket实时流和RTSP等方式,实现720P/960P高清视频传输。本项目共分11季,从海思SDK开发环境搭建,到sample程序讲解、SDK中API函数解析,到H.264编解码、RTSP流媒体传输、MP4文件打包,到图像IQ调试、图像识别等视频领域高阶内容,可以说从零基础入手,对图像采集、编解码、网络传输、图像存储和识别做了全方位的详细讲解和代码分析,是目前市面上**一套系统讲解图像和视频技术的视频课程。

    691 人正在学习 去看看 朱有鹏

第一次接触语音识别还是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 阅读数 226
  • 海思平台上USB WIFI的移植与局域网无线调试和视频流...

    本季课程在开发板上移植USB WIFI模块(套装附带的MT7601模块),工作在ap模式下,并且用电脑通过WIFI去连接开发板实现主机和开发板的无线网络局域网通信,这样就可以用WIFI网络取代板载ethernet有线网络方式来进行调试和局域网视频预览。现在很多的视频摄像头产品都要求支持无线网络连接功能,本季课程主要是针对这方面开发技术讲解的。 随着通信行业发展,网速越来越快,网络也从文本时代发展越过语音时代到了现在视频时代,“优酷、爱奇艺”、“微视频”、“直播”等的出现也是视频逐步成为主流媒体的证据和表现。航拍、视频监控、刷脸过关检测、汽车ADAS系统等应用也是视频在主流行业中的应用,因此视频的采集、编解码、传输、识别等技术变得越来越有价值,涌现出了“海康威视”、“大华股份”、“深圳英飞拓”等一批明星企业,名扬海内外,动辄市值几百亿。同时在芯片级,国产华为海思HI35XX系列视频编解码方案也逐步取代进口芯片(如TI、安霸)成为主流方案。 视频行业技术含量高、难度大、学习周期长、发展变化快而资料少,因此行业比较缺人、工资较高。如海康威视,普通高校硕士研究生应届进入年薪普遍高于15-20万,在嵌入式linux领域也算高工资技术方向了。 本项目是朱老师及其团队推出的一个嵌入式linux领域重量级企业级实战项目,选用华为海思HI3518E方案,结合OV9712/AR0130 Sensor实现图像采集和H.264编码压缩,并通过ethernet和WIFI,以socket实时流和RTSP等方式,实现720P/960P高清视频传输。本项目共分11季,从海思SDK开发环境搭建,到sample程序讲解、SDK中API函数解析,到H.264编解码、RTSP流媒体传输、MP4文件打包,到图像IQ调试、图像识别等视频领域高阶内容,可以说从零基础入手,对图像采集、编解码、网络传输、图像存储和识别做了全方位的详细讲解和代码分析,是目前市面上**一套系统讲解图像和视频技术的视频课程。

    691 人正在学习 去看看 朱有鹏

一 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命令行工具都在特定的阶段完成特定的任务。整个入口就是原始的声音文件和对声音文件的文本记录信息。
恩,后续再补。。。

HTK简介

阅读数 1673

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