2020-03-09 22:48:58 weixin_44532659 阅读数 90
  • C++语音识别开篇

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

    6112 人正在学习 去看看 杨波

语音识别技术(Automatic Speech Recognition, ASR)是计算机听觉领域中重要的研究方向之一。其目标是就是让机器把语音信号转变为相应的文本,进而达到机器自动识别和理解语音内容。语音识别作为一种基础层感知类技术,既可以作为核心技术直接应用于终端产品,也可以仅作为一种感知类辅助技术集成于语音助手、车载系统、智慧医疗、智慧法院等场景的产品中。
在这里插入图片描述—语音识别系统原理—

目前语音识别的技术成熟度已经有了较大的提升,但还无法达到100%的准确度。其主要瓶颈在于语音交互受背景噪音、语速等多重因素影响,不同场景识别率差别较大;语音识别缺乏通过上下文来纠正文字的能力;语义不全等。尽管现在顶级的语音识别系统正确率普遍超过95%,即每20个字错一个字。但是这些错字有可能是关键字错误,比如说少了一个“不”字。这类错误会导致语义产生严重变化。此外,还有如何解决方言口音和语音系统快速迁移等都是语音识别工程中需要考虑的问题。

目前现有的语音系统对于这些问题缺少很好的解决手段,解决这个问题既需要改善算法本身,也需要大量的有效的数据进行算法训练,从而使算法达到一定的成熟度。
在这里插入图片描述

朗读类语音数据

普通话
1505小时普通话手机采集语音数据
849小时普通话家居交互手机语音数据
662小时中文重口音手机采集语音数据
132小时中文重口音手机采集语音数据
1026小时中文重口音手机采集语音数据
203人噪音环境口音普通话手机采集语音数据_朗读

方言:
1044小时闽南语手机采集语音数据
1652小时粤语手机采集语音数据
1032小时上海方言手机采集语音数据
250人苏州方言手机语音采集数据
400人杭州方言手机语音采集数据
1000小时长沙方言手机采集语音数据
794小时四川方言手机采集语音数据
1000小时武汉方言手机采集语音数据
1000小时昆明方言手机采集语音数据
312人东北方言手机采集语音数据
463人河南方言手机采集语音数据
738小时维语手机采集语音数据
1000小时藏语手机采集语音数据
204人台湾普通话手机采集语音数据_朗读

英语:
201小时北美英语手机采集语音数据
215小时美式英语手机采集语音数据_朗读
800小时美式英语手机采集语音数据_交互场景
199小时英式英语手机采集语音数据_朗读
800小时英式英语手机采集语音数据
1000小时印度英语手机采集语音数据
593小时中国人说英语手机采集语音数据
500小时中国人说英语手机采集语音数据
500小时西班牙人说英语手机采集语音数据
520小时法国人说英语手机采集语音数据
535小时德国人说英语手机采集语音数据
200小时意大利人说英语手机采集语音数据
200小时葡萄牙人说英语手机采集语音数据
200小时拉丁美洲人说英语手机采集语音数据
500小时日本人说英语手机采集语音数据
500小时韩国人说英语手机采集语音数据
500小时俄罗斯人说英语手机采集语音数据
200小时巴西人说英语手机采集语音数据
500小时澳大利亚英语手机采集语音数据
500小时加拿大英语手机采集语音数据
300小时新加坡英语手机采集语音数据
200小时马来西亚英语手机采集语音数据

欧洲语系:
211小时德语手机采集数据_朗读
1800小时德语手机采集语音数据
215小时意大利语手机采集语音数据_朗读
347小时意大利语手机采集语音数据
1440小时意大利语手机采集语音数据
232小时法语手机采集语音数据_朗读
768小时法语手机采集语音数据
227小时西班牙语手机采集语音数据_朗读
338小时西班牙语手机采集语音数据
435小时西班牙西班牙语手机采集语音数据
780小时墨西哥哥伦比亚西班牙语手机采集语音
1000小时欧洲葡萄牙语手机采集语音数据
800小时俄语手机采集语音数据

亚洲语系:
241小时印地语手机采集语音数据_朗读
824小时印地语手机采集语音数据
235小时日语手机采集语音数据
265小时日语手机采集语音数据
514小时日语手机采集语音数据
197小时韩语手机采集语音数据_朗读
357小时韩语手机采集语音数据
500小时韩语手机采集语音数据
292小时泰语手机采集数据_朗读
360小时印尼语手机采集语音数据_朗读
640小时印尼语手机采集语音数据
156人马来西亚语手机采集数据_朗读
365小时马来语手机采集语音数据
500小时越南语手机采集语音数据

美洲语系:
1000小时巴西葡萄牙语手机采集语音数据

2017-03-01 00:03:25 wr132 阅读数 10663
  • C++语音识别开篇

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

    6112 人正在学习 去看看 杨波

目前,语音识别,即将语音内容转换为文字的技术已经比较成熟,遥想当时锤子发布会上展示的讯飞输入法语音识别,着实让讯飞火了一把。由于此类语音识别需要采集大量的样本,才能达到一定的准确度,个人很难从零开始搭建。但是,许多拥有语音识别技术的公司,或多或少会提供一些API或者SDK供开发者使用,这样就把语音识别的门槛降到了一个很低的程度,只需几行代码即可实现。下面我介绍以下如何使用Python调用百度的REST API实现一个简单的语音识别。

注册账号,并成为开发者

打开 http://yuyin.baidu.com/ ,并且使用你的百度账号登陆,如果你不是开发者,系统会自动引导你申请成为开发者。

创建应用

打开 http://yuyin.baidu.com/app ,点击创建应用,应用名称自己取,选择合适的应用类型。下一步,服务类型选择语音识别,继续点击下一步,然后就可以关闭了。

刷新当前页面,你就可以看到自己创建的应用,点击查看key,这些是进行身份识别的关键信息。

代码编写

http://yuyin.baidu.com/docs/asr/54 可以查看官方文档,百度提供了两种方法:隐式发送是将音频数据打包转换成一个字符串,放到json数据包中来发送;显示发送则是直接发送语音数据。本代码使用隐式发送。

注意:使用前要将你的应用信息填入适当位置

#!/usr/bin/env python
# coding: utf-8
import urllib2
import json
import base64
import  os

#设置应用信息
baidu_server = "https://openapi.baidu.com/oauth/2.0/token?"
grant_type = "client_credentials"
client_id = "" #填写API Key
client_secret = "" #填写Secret Key

#合成请求token的URL
url = baidu_server+"grant_type="+grant_type+"&client_id="+client_id+"&client_secret="+client_secret

#获取token
res = urllib2.urlopen(url).read()
data = json.loads(res)
token = data["access_token"]
print token

#设置音频属性,根据百度的要求,采样率必须为8000,压缩格式支持pcm(不压缩)、wav、opus、speex、amr
VOICE_RATE = 8000
WAVE_FILE = "test.wav" #音频文件的路径
USER_ID = "hail_hydra" #用于标识的ID,可以随意设置
WAVE_TYPE = "wav"

#打开音频文件,并进行编码
f = open(WAVE_FILE, "r")
speech = base64.b64encode(f.read())
size = os.path.getsize(WAVE_FILE)
update = json.dumps({"format":WAVE_TYPE, "rate":VOICE_RATE, 'channel':1,'cuid':USER_ID,'token':token,'speech':speech,'len':size})
headers = { 'Content-Type' : 'application/json' } 
url = "http://vop.baidu.com/server_api"
req = urllib2.Request(url, update, headers)

r = urllib2.urlopen(req)


t = r.read()
result = json.loads(t)
print result
if result['err_msg']=='success.':
    word = result['result'][0].encode('utf-8')
    if word!='':
        if word[len(word)-3:len(word)]==',':
            print word[0:len(word)-3]
        else:
            print word
    else:
        print "音频文件不存在或格式错误"
else:
    print "错误"
2018-07-26 22:32:01 juwairen_yangfeng 阅读数 947
  • C++语音识别开篇

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

    6112 人正在学习 去看看 杨波

摘要:语音识别作为人工智能下很火爆的一门学科,是当下研究的一个重要领域。大多数的语音识别是基于市面上已有的语音识别模块,成本较高,本系统是孤立词语语音识别,考虑到成本以及可实现性,笔者选择了STM32F1系列MCU的最小系统,通过TFT彩屏实现人机交互,搭建音频采集模块,从而完成语音识别系统的硬件部分。软件设计采用A/D采样、预加重、加窗、端点检测、MFCC特征提取、特征匹配几个步骤,技术相对成熟,识别率较高。

主题词:孤立词语、音频采集模块、端点检测、MFCC特征提取、特征匹配

 

一、引言:语音识别的发展最早开始于上世纪50年代的贝尔实验室,Davis等科学家研究出可以识别出10个英文数字的实验装置。60年代的一系列数字信号处理方法推动了语音识别的发展,如FFT。同时,伴随着计算机技术的发展,语音识别逐渐从硬件工作转移到软件工作,这时的语音识别发展 很快,但人们很快就意识到语音识别的困难加深。此后,70年代日本学着提出的动态时间规整技术(DTW)解决不等长语音的对整匹配问题,以及80年代提出的隐马尔可夫模型法(HMM),都是现阶段语音识别的重要算法。

二、正文:

音频采集电路:首先是对于语音信号的采集,本系统使用电容式咪头采集音频,但MIC的输出电压只有几毫伏到十几毫伏,所以需要加放大电路,可采用三极管或者运放放大。本系统采用三极管阻容耦合二级放大电路,需要注意的是咪头需要一个工作电压,所以直接将VCC接到咪头的正极,然后第一级的耦合电容设置为10uf,这个对三极管基极充电时间有影响,它和集电极的电阻一同构成了RC充电电路,且10uf的电容会把音频信号耦合到基极上,咪头采集到的信号控制在3.3V以内。单片机是无法识别模拟电信号的,所以需要用到A/D采样;人说话的语音信号大多数有效信号集中在100HZ-3400HZ,所以根据香农采样定理,只要A/D采样频率大于等于6800HZ即可,这对于我们STM32F1系列单片机来说是完全可以实现的,接着考虑A/D精度,STM32F1ZET6拥有1~3个12 位逐次逼近型的模拟数字转换器,对于Vref=3.3v来说其最小误差为0.8mv,这是完全可以接受的,这就实现了语音模拟信号的采样量化。

高频补偿:经过研究,人的发生器官也相当于一个时变线性系统,在8000HZ以上频率时,会有大约6dB/倍频的频率衰减,所以为了平滑频率,需要对信号进行高频预加重,即 运用一个6dB/倍频的一阶数字滤波器。

语音信号的加窗处理:语音信号有一个很强的特性,那就是短时性,但从另一方面看,由于语音的形成过程是与发音器官的运动密切相关的,这种物理性的运动比起声音振动速度来说是缓慢的,所以在一个短时间范围内可以认为其变化很小,借此,我们对语音信号进行短时分析(分帧),一般语音信号在10ms-30ms之间保持稳定,我们去每帧长度为20ms,且为了使语音信号的连续性,每一帧之间混叠窗长的一半;窗函数的选择大致有矩形窗、汉宁窗、哈明窗等,而窗函数的选择要求一般包含两点:①尽量减少窗函数的旁瓣高度,使能量集中在主瓣②主瓣宽度尽量窄,以获得较陡的过渡带;介于以上条件,我们选择哈明窗。由于帧与帧连接处的信号因为加窗而弱化,如果没有帧移,这部分信息就丢失了。

端点检测:当系统接收到一段完整的语音信号时,去除语音段前后的噪声对于我们语音参数提取具有重要意义。经研究,当我们在发出语音时,清音和浊音会不断的出现,发现浊音的短时能量明显比环境噪声高,清音的短时平均过零率与环境噪声也有明显的区别,所以利用这个特性,设定短时能量和短时平均过零率的门限值,当某一帧的短时能量或短时平均过零率大于门限值,则可认为进入有效语音段,设定为语音起点,当某一帧的短时能量和短时平均过零率都小于门限值时,认为这是语音末点。

特征提取算法在语音识别系统中,模拟语音信号在完成 A/D 转换后成为数字信号。此时的语音信号为时域的信号,时域的信号难以进行分析和处理,而且数据量庞大。通常的做法是对时域信号进行变换,提取其中某种特定的参数,通过一些更加能反映语音本质特征的参数来进行语音识别。进过几十年的发展,语音特征提取算法大致有三类:

基于线性预测分析的提取方法 (LPCC)、基于频谱分析的提取方法(MFCC)、基于其它数字信号处理技术的特征分析方法,本系统采用基于频谱分析的提取方法,Mel频率倒谱频系数MFCC。

MFCC是Mel-Frequency Cepstral Coefficients的缩写,顾名思义MFCC特征提取包含两个关键步骤:转化到梅尔频率,然后进行倒谱分析。梅尔刻度是一种基于人耳对等距的音高(pitch)变化的感官判断而定的非线性频率刻度。和频率的赫兹的关系如下: M=2595log10(1+f/700)所以当在梅尔刻度上面上是均匀分度的话,对于的赫兹之间的距离将会越来越大。梅尔刻度的滤波器组在低频部分的分辨率高,高频部分分辨率低,这跟人耳的听觉特性是相符的。所以对于有效语音段,进行离散傅里叶变化(DFT),将频谱信号通过一组Mel尺度的三角形滤波器组,定义一个有M个滤波器的滤波器组,采用的滤波器为三角滤波器,中心频率为f(m),m=1,2,...,M。M通常取22-26。各f(m)之间在赫兹轴上的间隔随着m值的减小而缩小,随着m值的增大而增宽,但在梅尔刻度却是等距离。最后就是离散余弦变换,进行反傅里叶变换然后通过低通滤波器获得最后的低频信号,这样能量会集中在低频部分。每个三角滤波器会有一个输出,通过以上计算实现了每帧数据从N(FFT点数 )点到M点的降维,大大减小了计算量,减小了内存开销、缩减了运算时间。

特征匹配算法:现阶段,语音识别用到的模型匹配方法主要有动态时间规整(DTW)、隐马尔可夫模型(HMM)和人工神经网络。本系统用于孤立词识别,DTW 算法与 HMM 算法在相同的环境条件下,识别效果相差不大,但是 HMM 算法要复杂得多,这主要体现在HMM 算法在训练阶段需要提供大量的语音数据,通过反复计算才能得到模型参数,而 DTW 算法的训练中几乎不需要额外的计算。所以在孤立词语音识别中,DTW 算法得到更广泛的应用。笔者觉得,对于一个算法的理解,首先得从它的物理意义开始,在网上很多人的博客里都对这个算法有过通俗的解释,并配以实例,在这我就不多加说明了。主要步骤为初始化矩阵,计算每个数据之间的“距离”,计算累计匹配距离,匹配距离最小的特征模板与输入特征有最大的相似性。

单片机软件设计:首先,一段短时语音信号长度大约为2s以内,我们以8khz的ADC采用频率去采样得到的最大点数为16000,因为STM32F1为12位ADC,所以每个点的数据相当于两个字节,总的算来需要16000*2=32000字节,对于拥有64KB RAM的STM32F103ZET6来说在内存上是可以实现的。ST官方固件库提供的16位、1024点FFT用时2.138 ms,20ms为一帧,算下来总共有100帧,也就是100次1024点的FFT计算,总用时就是213.8ms,加上其他地方的指令、算法运算时间,识别一个指令应该在0.5s以内。至于每帧20ms,按照8khz的采样频率只能得到160个点,采用1024点FFT则需要在尾部补864个零,因为由公式(delta f)=fs/N 补零可以提高频率分辨率。且考虑到ADC采样次数比较多,所以采集到的数据采用DMA的方式传输到设定的数组,这样可以节省指令执行时间。从工程的初始化开始,代码如下……先是设定单片机运行频率(72MHZ),延时函数初始化(SysTick),ADC、DMA、按键函数部分以及需要用到的引脚的初始化,main()中的主要为一个按键函数来实现何时进行模板训练,何时进行语音识别。工程的主要部分为端点检测、MFCC语音特征提取、以及特征提算DTW的代码实现。想着重提出来说的是DTW算法,算法基于动态规划(DP)的思想,用于于长度不等的序列如何匹配。通俗理解也就是说怎么样的warping才是正确的?直观上理解,当然是warping一个序列后可以与另一个序列重合recover。这个时候两个序列中所有对应点的距离之和是最小的。所以从直观上理解,warping的正确性一般指“feature to feature”的对齐,我想这也是动态时间规整算法的核心。这个解释应该很宏观,理解了物理意义,这个算法也变的简单起来。

对于它的起源(DP)我们不去过多的诉说,而它广阔的应用前景,结合cpp面向对象的特性,我想我们可以把这个warping运用的很只能,就像对于人的情感、关系,将两个人综合特征的显现进行“匹配”,或是两代人之间的种种特征(貌似很像DNA检测,不过一个是唯物,一个是格物),这是对对象的一个小小改变。

2014-07-21 08:27:46 zpf8861 阅读数 4585
  • C++语音识别开篇

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

    6112 人正在学习 去看看 杨波

现在app的开发进程会集成一些语音识别功能,而一般开发者是不具备自己开发一套语音识别引擎的,因此大多数情况是选择一个已经成熟的语音识别引擎SDK集成到自己的app中。

通常情况下,这种集成分两种,一种是直接调用SDK为开发者设计好的弹出框,开发者不需要开发识别交互界面;还有一种是开发者只利用SDK提供的语音识别服务,自己开发一个属于自己的交互设计。

本文介绍最简单直接调起弹出框的方法。

首先,测试机需要安装如谷歌语音、百度语音、讯飞语音等产品的语音软件,这时可以在系统设置界面的语言与输入处找到相关的语音识别功能列表。然后就可以直接调用了。

下面是调用的步骤:

首先:在Activity中实例一个intent,intent的action设置为RecognizerIntent.ACTION_RECOGNIZE_SPEECH或者RecognizerIntent.ACTION_WEB_SEARCH,关于RecognizerIntent可以查看本博客之前的文章,然后调用一个带返回结果的操作

<pre name="code" class="java">@Override
        public void onClick(View v) {
           Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
	     //Intent intent=new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
           startActivityForResult(intent, 0);
        }




然后:在返回结果中取出携带字符串RecognizerIntent.EXTRA_RESULTS对应的结果,android语音识别服务统一将结果以ArrayList<String>形式返回,如下代码

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        ArrayList<String> results = data
                .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
        Log.i("zpf", results.get(0).toString());
    }

另外,需要在配置文件中添加:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />


2019-04-02 19:07:19 david_tym 阅读数 1678
  • C++语音识别开篇

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

    6112 人正在学习 去看看 杨波

春节后到现在近两个月了,没有更新博客,主要是因为工作的关注点正从传统语音(语音通信)转向智能语音(语音识别)。部门起了个新项目,要用到语音识别(准备基于Kaldi来做)。我们之前做的传统音频已基本成熟,就开始关注在语音识别上了。对于我们来说,这是个全新的领域(虽然都是语音相关的,但是语音通信偏信号处理,传统语音识别方法偏概率统计),需要学习的知识很多,所以这段时间主要是在学习新知识了,主要学习了数学(高数/线性代数/概率统计,这应该算复习)、机器学习基础知识、深度学习、语音识别传统方法等。由于刚开始学,还没实践,有的还是一知半解。学的过程中也要有输出(把自己学的知识讲给组内其他同学听,并一起讨论,让大家都快速入门),这也能促进把学的东西掌握的更好。我花了两周的时间学习了语音识别的传统方法(主要学习方式是看文档和博客),基本上掌握了其方法,也做了PPT给组内同学讲(做PPT时用了一些博客上的图,谢谢这些博主,这里就不一一列举了)。今天就把这个PPT share出来,给也想入门语音识别的朋友做个参考。由于还没实践,有什么不太准确或不准确的地方还请指出。

 

语音识别传统方法主要分两个阶段:训练和识别,训练阶段主要是生成声学模型和语言模型给识别阶段用。传统方法主要有五大模块组成,分别是特征提取(得到每帧的特征向量),声学模型(用GMM从帧的特征向量得到状态,再用HMM从状态得到音素)、发音字典(从音素得到单词)、语言模型(从单词得到句子)、搜索解码(根据声学模型、发音字典和语言模型得到最佳文本输出),即从帧得到特征向量(特征提取干的话),从特征向量得到状态(GMM干的话),从状态得到音素(HMM干的话),从音素得到单词(发音字典干的活),从单词得到句子(语言模型干的活)。传统方法除了在特征提取上用到信号处理知识,其余全都是概率统计等知识,所以说语音识别和语音通信是两个完全不同的领域。

 

经过近十年的发展,语音识别已经从传统方法演进到基于深度学习的方法,识别率也有了质的提升,而且还在快速的演变中,现在商用的语音识别系统都是基于深度学习实现的。对于传统方法而言,只会出现在文章教材中了,但作为新手,在入门时学习它还是很有必要的。只有了解了传统方法再去学习深度学习方法,才知道深度学习方法是怎么样基于传统方法一步步演变的。下面就是我的PPT。

 

 

 

 

 

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