2015-12-05 19:16:43 yangzhaomuma 阅读数 5638
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    6094 人正在学习 去看看 杨波

Android语音识别,简单的理解就是把语音转化为文字。

在日常中,语音识别,车载导航、语音输入等,虽然不一定准确,但用途广泛。

这里就介绍下谷歌原生的语音识别与百度的语音识别

谷歌语音识别

谷歌语音识别做法很简单

1、首先检测本地是否有语音识别工具,比如谷歌语音搜索,如果没有就结束;

2、用intent意图表示语音识别;

3、发送这个intent,并等待返回;

4、显示返回的内容;

具体的代码如下:

package com.example.speak_csdn;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;

public class MainActivity extends Activity {

	final int RESPONCERESULT=99;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button btnButton=(Button)findViewById(R.id.mybtn);
		btnButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				speak();
			}
		});
	}

	public void speak()
	{
            try{  
             //通过Intent传递语音识别的模式,开启语音  
             Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);  
             //语言模式和自由模式的语音识别  
             intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);  
             //提示语音开始  
             intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "开始语音");  
             
             //开始语音识别  
             startActivityForResult(intent, RESPONCERESULT);  
             }catch (Exception e) {  
                 // TODO: handle exception  
                 e.printStackTrace();  
                 Toast.makeText(getApplicationContext(), "找不到语音设备", 1).show();  
             }  
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		
		//回调获取从谷歌得到的数据   
        if(requestCode==RESPONCERESULT && resultCode==RESULT_OK){  
            //取得语音的字符  
            ArrayList<String> results=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);  
            //谷歌可能有许多语音类似的返回,越往上优先级越高,这里列出所有的返回并拼接成字符串   
            String resultString="";  
            for(int i=0;i<results.size();i++){  
                resultString+=results.get(i);  
            }  
            Toast.makeText(this, resultString, 1).show();  
        }  
		super.onActivityResult(requestCode, resultCode, data);
	}
	
	

}

代码完成了,注意要加上网络访问权限,因为这个是在线语音识读,代码关键的语句在以下几句:

 //通过Intent传递语音识别的模式,开启语音  
             Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);  
             //语言模式和自由模式的语音识别  
             intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);  
             //提示语音开始  
             intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "开始语音");  
             
             //开始语音识别  
             startActivityForResult(intent, RESPONCERESULT);  


对应这个的布局语句很简单,只有一个button按钮。给这个按钮绑定事件,点击运行...


这和我们预料的不同啊,网络没有问题,测试了WIFI和GPRS都是同样的结果。最终这只能归结为谷歌后台服务无法连接,你或者可以通过翻墙来看到效果。

悲伤。

那现在我们看看中国本地的语音识别,百度语音。

百度语音识别

百度语音识别,应用的是百度提供的SDK来实现。这个在百度的开放平台上可以看到很详细的说明。
应用它的步骤如下:
1、下载jar包;
2、添加权限;
3、在代码中,用给定的API来做语音识别;
4、显示返回内容;

jar包、so文件下载

以下是从百度开放平台上下载的jar包以及so文件,用于后续的开发使用

权限添加

AndroidManifest.xml中添加需要的权限,如下:
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 蓝牙录音 -->
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <!-- 某些手机启动SCO音频连接需要此权限 -->
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <!-- 蓝牙录音检测耳机状态 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />

代码中使用API

这个就是使用API的过程,如下代码:
package com.example.baiduspeak_csdn;

import java.util.ArrayList;

import com.baidu.voicerecognition.android.ui.BaiduASRDigitalDialog;
import com.baidu.voicerecognition.android.ui.DialogRecognitionListener;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.app.Activity;

public class MainActivity extends Activity {

	//百度自定义对话框
	 private BaiduASRDigitalDialog mDialog = null;
	 //对话框监听
	 private DialogRecognitionListener mRecognitionListener;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Button btnButton=(Button)findViewById(R.id.mybtn);
		btnButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				speak_Baidu();
			}
		});
		
		mRecognitionListener = new DialogRecognitionListener() {

            @Override
            public void onResults(Bundle results) {
                ArrayList<String> rs = results != null ? results.getStringArrayList(RESULTS_RECOGNITION) : null;
                if (rs != null && rs.size() > 0) {
                	Toast.makeText(MainActivity.this, rs.get(0), 1).show();
                }

            }
        };
	}
    //百度语音识别
	public void speak_Baidu()
	{
		if (mDialog != null) {
            mDialog.dismiss();
        }
        Bundle params = new Bundle();
        //设置注册百度开放平台得到的值 API_KEY,SECRET_KEY
        params.putString(BaiduASRDigitalDialog.PARAM_API_KEY, Constants.API_KEY);
        params.putString(BaiduASRDigitalDialog.PARAM_SECRET_KEY, Constants.SECRET_KEY);
        //设置对话框模式
        params.putInt(BaiduASRDigitalDialog.PARAM_DIALOG_THEME, Config.DIALOG_THEME);
        //根据设置新建对话框
        mDialog = new BaiduASRDigitalDialog(this, params);
        //设置对话框的监听
        mDialog.setDialogRecognitionListener(mRecognitionListener);
        //对话框设置
	    mDialog.getParams().putInt(BaiduASRDigitalDialog.PARAM_PROP, Config.CURRENT_PROP);
	    mDialog.getParams().putString(BaiduASRDigitalDialog.PARAM_LANGUAGE, Config.getCurrentLanguage());
	    mDialog.getParams().putBoolean(BaiduASRDigitalDialog.PARAM_START_TONE_ENABLE, Config.PLAY_START_SOUND);
	    mDialog.getParams().putBoolean(BaiduASRDigitalDialog.PARAM_END_TONE_ENABLE, Config.PLAY_END_SOUND);
	    mDialog.getParams().putBoolean(BaiduASRDigitalDialog.PARAM_TIPS_TONE_ENABLE, Config.DIALOG_TIPS_SOUND);
	    mDialog.show();
	}
	 @Override
	    protected void onDestroy() {
	        if (mDialog != null) {
	            mDialog.dismiss();
	        }
	        super.onDestroy();
	    }

}
代码也只是简单的定义一个按钮,按钮绑定一个事件。
事件发起时,我们设定了挺多参数,重要的有平台分配的APP_KEY,SECRET_KEY,PROP,语言的选择等。
根据这些,百度对我们发出的声音,在服务端,得到匹配的内容并返回前端。
效果如下:


这个效果我们是能看到的。简单的用法就是这样的。类似谷歌语音,一个请求即可。

源码

源码包括以上的谷歌和百度语音识别,可供下载:

2016-04-17 13:56:32 lihaitao000 阅读数 2990
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    6094 人正在学习 去看看 杨波
语音识别中基于规则的语言模型
一 语言模型的选择

语音识别一般分为两个阶段:
1)语音识别阶段:这个阶段利用语音的声学模型,把自然的声音信号转换为机器可以处理的数字表达的音节形式。
2)语音理解阶段:这个阶段把上阶段的结果即音节转换成汉字,这一阶段需使用语言模型的知识进行理解。
而在语音识别中最重要的一部就是建立语言模型,提高语音识别的准确率。
语言模型现在常用的一般可以分为两种:一种是基于大规模语料库的统计语言模型。这种方法的特点是适合处理大规模真实语料 , 数据准备的一致性好,鲁棒性强 , 但由于其实现受系统的空间和时间所限 , 因而只能反映语言的紧邻约束关系,无法处理语言的长距离递 归现象 。 
一种是基于规则的语言模型。这种方法是在对汉语词汇系统按语法语义进行分类 的基础上 , 通过确定 自然语言的词法 、 句法及语义关系 , 试图达到同音词的大范围的基本唯一识别 。 其特点是适于处理封闭语料 , 能够反映语言的长距离约束关系和递归现象 , 但这种方法的鲁棒性差 , 不适合处理开放性语料 , 知识表达的一致性不好 。
二 词汇分类体系的建立
词类的划分是 自然语言理解的基础 , 分类是人类认识事物 的一种结果 , 也是人类认识
事物的一 种手段 。 只有对汉语词汇进行系统的语法语义分类 , 才能对整个词汇系统有完
整 的认识 , 进行合理的属性标注 , 并在此基础上 , 建立完整系统的规则体系 , 这也会给实际工作带来极大的方便。
按语法进行分类 , 划分 比较简单 , 它和句法关系密切 , 只关心基本词性 , 基本上不关
心被表达知识的意义 。 
) 按语法进行划分 , 把词划分成十一大类 : 名词 、 动词 、 形容词 、 数词 、 量词 、 代词 、副词 、 介词 、 连词 、 助词和语气词 。
2 ) 在语法分类 的基础上 , 按照语义对名词类 、 形容词类 、 量词类 以及动词类进行更深层次的分类 , 分类时尽量考虑建立各种规则的需要 , 视具体情况 , 语义类可分到一
至六层
三 规则的表示
规则表示的是汉 语句子 内各成分之间的结合关系 , 包括语法和语义上的关系 。 规则由
产生式来表示 。 这样一 个规则体系就是一个产生式体系 。 上 下文无关文法最适合用来描述
自然语言 , 我们采用它来描述系统的产生式规则 。
在我们的系统中 , 用下列符号来表示各种语法语义成分 :
S 是起始符 , 代表整个句子 ;
N 、 V 、 A 、 D 、 M 为非终结符 , 分别代表名词 、 动词 、 形容词 、 副词和量词等语法类:
N P 花 、 N P 动物 、 N P 车 、 A P 花 、 A P 动物 、 A P 车 、 V 打 、 V 吃 、 · 一等为非终结符 ,
分别代表名词 、 形容词 、 动词词性的语义类 ;
戮 为终结符 , 表示汉语单词 。
四 规则的获取
规则的获取就是使计算机获得关于语言的知识 , 利角 这些知识来理解句子 , 以区别汉
字输入 中出现 的大量候选字 。 规则的获取同其他知识获取一样主要有两种途径 :
l ) 人工 编辑方式: 由人直接对语言知识进行编辑加工 , 形成规则 , 构成基本知识库 .
2 ) 机器 自动获取 : 使系统具有机器学习功能 , 在使用过程中, 根据经验不断学习 , 自
动获取规则 , 逐步完善和丰富知识库 .
我们首先采用人工编辑的方式获取规则以建立基本规则库 , 在此基础上使系统具有机
器学习 的功能
五 规则模型的实现
我 们 首先在拼音一汉字转换系统 中成功实现 了基于规则的语言模型 。 实现时先把各音节
的同音字归纳成一棵语法 、 语义树 , 根据 匹配规则在树 中选择满足条件 的汉字串作为音字
转换的结果 3 [ ] 。 设有这样一组规则 :
M + % 个十 N P 人一> N P 人
N P 人+ % 是+ N甲 人

S ( * )
我们输入拼音串 “ w o s i h i y g e b ig n ” , 系统将生成如图 1 所示的树结构


系统根据规则 ) 搜索此树 , 生成汉字 串: “ 我是一个兵 ” 。 ( *
单纯使用规则进行匹配存在这样 的问题 : 可 能有多个汉字 串对应该语义树 , 即存在多

个同音字或 同音词属于同一语义类 。 这种问题可 以用统计方法来解决


参考文献:哈尔滨工业大学计算机科学与工程系 《语音识别中基于规则的语言模型的研究》

2018-07-31 17:08:50 yibuerbusanbu 阅读数 3914
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    6094 人正在学习 去看看 杨波

1.前言:
本科毕业之后,开始了北漂,一直想从事一些偏上层方面的工作,开始找工作期间各种碰壁。可能自己c语言的基础还可以的原因,被现在的单位的引擎组招了过来,起初只是被用来干一些引擎的支持和测试,慢慢的开始接触到了语音识别等引擎的开发,所以利用自己在工作中所了解得在这里班门弄斧地谈谈语音识别,也是想工作进行总结。也欢迎大家指出错误和不足。
1.语音识别简介:
语音识别技术即AutomaticSpeechRecognition(简称ASR),是指将人说话的语音信号转换为可被计算机程序所识别的信息,从而识别说话人的语音指令及文字内容的技术。目前语音识别被广泛的应用于客服质检,导航,智能家居等领域。
2.语音识别过程:
在这里插入图片描述
语音识别大体上包含前端处理,特征提取,模型训练,解码四个模块。其中前端处理包括了,语音转码,高通滤波,端点检测等。
上图目前语音识别的基本流程,输入的语音数据流经过前端处理(语音格式转码,高通,端点检测),语音格式转码是将输入的语音数据转成pcm或者wav格式的语音,端点检测是检测出转码后语音中的有效语音,这样对解码速度和识别率上都会改善。经过前端处理之后的得到的分段语音数据送入特征提取模块,进行声学特征提取。最后解码模块对提取的特征数据进行解码,解码过程中利用发音字典,声学模型,语言模型等信息构建WFST搜索空间,在搜索空间内寻找匹配概率最大的最优路径,便得到最优的识别结果。
在其他章节中会详细介绍以上四个模块。
3.语音识别的学习:
由于语音识别本事就是一个非常大并且繁琐的工程,设计到知识面很广,目前我也在想如何把这个学习过程更加系统化,简单化。希望这一块能得到前辈的指点。
目前我再看这些书籍:
1).数学之美,这本书对整个语音识别过程以及各个模块讲的很详细,也很通俗易懂,是一本不错的语音识别入门的书。
2).语音信号处理,这本书对前端处理模块的学习有很大的帮助,由于是一本教材书籍,自己在有些地方看起来也很晦涩,目前也想在网上找一些相关网课看看,这样更加深理解,找到的话也会第一时间分享。
3).关于特征提起模块,网上有很多帖子写的都很详细,后面我也会整理一下。
4).解码和模型训练…未完!!!

2019-05-22 00:45:34 zhinengxuexi 阅读数 1294
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    6094 人正在学习 去看看 杨波

随着AI快速发展的今天,语音识别也成为众多设备的标配,语音识别开始被越来越多人的关注,国外微软、苹果、谷歌,国内的科大讯飞、思必弛、云知声等厂商都在研发语音识别新策略新算法,似乎人类与语音的自然交互渐行渐近。

语音识别是以语音的研究为对象,通过语音信号处理和模式识别让机器自动识别和理解人类口述的语言。

语音识别系统本质上是一种模式识别系统,包括特征提取、模式匹配、参考模式库等三个基本单元。

一套完整的语音识别系统,工作过程分为7步:

1.对语音信号进行分析和处理,除去冗余信息。

2.提取影响语音识别的关键信息和表达语言含义的特征信息。

3.紧扣特征信息,用最小单元识别字词。

4.按照不同语言的各自语法,依照先后次序识别字词。

5.把前后意思当作辅助识别条件,有利于分析和识别。

6.按照语义分析,给关键信息划分段落,取出所识别出的字词并连接起来,同时根据语句意思调整句子构成。

7.结合语义,仔细分析上下文的相互联系,对当前正在处理的语句进行适当修正

语音识别、图像识别均为模式识别中的主要应用,有兴趣的可以多学习一下

人工智能、大数据、云计算和物联网的未来发展值得重视,均为前沿产业,多智时代专注于人工智能和大数据的入门和科谱,在此为你推荐几篇优质好文:
人工智能与语音识别技术
http://www.duozhishidai.com/article-3157-1.html
人工智能快速发展的今天,语音识别现在发展到什么阶段了?
http://www.duozhishidai.com/article-2278-1.html
语音的识别过程主要分哪几步,常用的识别方法是什么?
http://www.duozhishidai.com/article-1739-1.html


多智时代-人工智能大数据学习入门网站|人工智能、大数据、物联网云计算的学习交流网站

多智时代-人工智能大数据学习入门网站|人工智能、大数据、云计算、物联网的学习服务的好平台

Python 实时语音识别

阅读数 1494

百度语音识别

阅读数 84

语音识别

阅读数 790

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