2014-07-01 22:57:10 joey_su 阅读数 4355
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

课程网址


原文地址:http://blog.csdn.net/joey_su/article/details/36414877

转载请注明出处,欢迎交流。


课程用书:Jurafsky & Martin (2008), Speech and Language Processing,Pearson Education (2nd edition). (J&M)


目录

  1. 统计语音识别介绍
  2. 原理
    • 语音信号处理
    • HMM声学模型
    • 发音与语言模型
    • 研究
  3. 前沿话题
    • 自适应
    • (深度)神经网络
    • 区分性训练


第一课主要介绍了对语音识别进行概述,回答了三个问题:什么是语音识别?语音识别有哪些分类?怎样实现?


什么是语音识别(ASR)?语音识别实际上是一个语音到文本的转换过程。


语音识别有哪些分类?根据语料库大小,分为大词汇量和小词汇量语音识别;根据说话人,可分为特定说话人和说话人无关;根据识别类型,可分为连续语音和孤立词识别等。此外,语音识别还跟发声环境有关,如环境的噪音,有几个人同时说话等。


怎样实现?有两种方法,一种是根据语法知识,另一种是利用机器学习的方法。世界上有太多的语言,它们的语法规则也不同,所以第一种方法是非常困难的;而数据驱动的机器学习可从大量的语音数据(数千小时的录音)中建立简单的模型,所以一般采用机器学习的方法。


统计语音识别的基本公式:

其中,

表示声学特征向量序列(观察序列),

表示单词序列,

表示最可能的单词序列。


根据贝叶斯定理:


统计语音识别框图:


其中,声学模型为隐马尔科夫模型,Lexicon表示词典,语言模型为n-gram模型。


语音的分层建模:


语句->单词->子单词(单词的各个音素)->对每个音素建立HMM->每个状态对应一些声学特征。


因为统计语音识别是数据驱动的,所以语料库对于识别系统来说非常重要。

TIMIT语料库(1986年)——仍可用的第一个广泛使用的语料库

  • 来自630个北美说话人的话音
  • 语音转录,时间对齐
  • 标准化的训练与测试集,一致的评估指标(音素错误率)
  • 许多在TIMIT后发布的标准语料库:DARPA资源管理,阅读报纸文本(Wall Street Journal),人机对话(ATIS),广播新闻(Hub4),电话对话语音(Switchboard),多方会议(AMI)

评估

Substitution——替换

Deletion——删除

Insertion——插入

N——单词数目

单词错误率(WER)就是对三种错误类型进行累加


国际上有个著名的NIST评估


下节课将讨论信号分析。


阅读资料

  • Jurafsky and Martin (2008). Speech and Language Processing (2nd ed.): Chapter 9 to end of sec 9.3.
  • Renals and Hain (2010). “Speech Recognition”, Computational Linguistics and Natural Language Processing Handbook, Clark, Fox and Lappin (eds.), Blackwells. (on website)
2019-07-24 22:34:45 demongwc 阅读数 25
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

1 任务介绍

语音识别是通往真正的人工智能的不可缺少的技术。尽管能真正听懂人类说话的智能机器任然在未来不可捉摸的迷雾之中,但我们必须先解决如何识别出人类语音中包含的自然语言信息的问题。而数字信号处理技术将为这一任务赋能。在本课程项目的任务之中,我们面对的是一个简化的语音识别场景——即孤立词识别。

我们针对 20 个关键词,采集了所有参与课程的同学朗读每个词 20 遍的语音。我将以此为数据集来构建一个能正确识别这 20 个关键词的孤立词识别系统。

点击此处下载文档和源码

 

2014-03-26 11:34:19 u010384318 阅读数 15023
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

   最近看到一个ASR的课程,很不错吧。网址:http://www.inf.ed.ac.uk/teaching/courses/asr/。大家有时间可以去看下……

   接下来就开始说dnn-hmm系统吧。所谓的这个就是把之前gmm这部分换成dnn,基于这个我们可以认为,深度学习模型可以更好的去模拟我们的语音信号吧。先上个总图吧:


看到这个图大家应该都可以很清楚地去理解了。下面分开介绍:

1.特征部分:一般在深度学习系统里用Filter bank 作为特征,这个就是在做MFCC时去掉最后二步。在论文里说,这样得到的效果比MFCC效果好几个点吧。具体的稍后贴图 (右 图)。见文章:RECENT ADVANCES IN DEEP LEARNING FOR SPEECH RESEARCH AT MICROSOFT。

2014.8.26更新:为什么采用Filter bank 作为特征?因为dnn模型里不需要来去相关性的操作。所以我们可以跳过dct变换。这个感觉还是跟数学有关。觉得dnn应该可以做这种去相关性的操作。


2014.8.13更新:看到一个图,贴在这里,方便大家理解。


                      此外,有些人在研究其他的特征,最多的就是bottleneck feature.这个现在很多人在研究,寻找一个很多的特征,肯定会使我们最后的识别率得到提高吧。至于这个 bottleneck feature,稍后贴出几篇文章。

                              

2.dnn部分:至于深度学习,相信了解的人都知道:从最初的bp算法,到现在的rbm,dbn,cnn,rnn等等模型。当然,注意的是,语音不在像图像,在做第一个rbm时应该用                        grbm。我们应该用连续的就是高斯了来做这个假设。下面还是继续贴图:



这里的大概是以dbn为框架的,其他的就可以以此类推。具体的实现可以参考kaldi里的nnet2这部分,在rm和wsj数据上的。

3.hmm部分:这部分跟gmm-hmm一样。还是弄一个图:

       


最后,上面的右图就是bottleneck feature的示意图。

就这样,似乎不是很好的去理解吧。大家多实践,多看代码。希望对你有用……

最近一样在看用深度学习模型去学习特征,然后用于分类或者识别吧。只是为了用到语音里,也希望用到毕设里,这里附上一个链接:http://www.liacs.nl/~dmus/api2011.html。主要内容是: to use Deep Belief Networks to learn a feature hierarchy from unlabeled speech data.

欢迎探讨,kaldi学习 语音深度学习群:367623211。欢迎您的加入,欢迎探讨和学习……


2018-09-14 13:36:41 Suan2014 阅读数 698
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

    因工作需要,准备开始做语音问答系统,之前对语音和自然语言处理(NLP)没接触过,所以开头还是很难的,历时两周做了一个大概的了解,适合像我这样的新手入门,里边借鉴了n多大神的内容,并给出了讲得比较好的网页、课程等等,如侵权请联系删除。。。

一 对话系统框架

二 调研内容

  1. 语音识别-- Speech Recogniton, SR
  2. 闲聊型问答系统--Chitchat-bot
  3. 知识库问答--Knowledge base Question Answering,KB-QA
  4. 垂直领域QA

三 循环神经网络(RNN)基本类型

    在语音识别和问答系统中,必不可少的就是循环神经网络(RNN)了,这里不对算法做详细介绍,只给出基本类型及应该学习了解的网络结构及其较好的学习资源。

    上图是RNN的基本类型,下边对其输入输出及其作用做一个大概的说明

  • one to one: 给一个输入,得到一个输出,就是基本的网络结构,不含序列信息,比如我们常用的图像分类
  • one to many:给一个输入,得到一系列输出,可用于image caption generation,输入一张图像,输出对该张图像的文字描述
  • many to one: 给一系列输入,得到一个输出,可用于文本情感分类,如分析文本是积极的还是消极的
  • many to many: 第四幅图像,输入和输出的序列数不一定相同,可用于机器翻译、问答系统等
  • many to many: 第五幅图像,输入和输出的序列数相同,可用于字符预测、对视频的帧打标签等

  需要提前了解的网络结构有RNN、 LSTM、 Attention机制,推荐李宏毅老师的课程:
http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLSD15_2.html    

四 语音识别的前世今生

前世

    从1990年到2010年,语音识别多采取上述框架,下边对上述框架的部分做一简要解析

预处理:
1. 首尾端的静音切除,降低对后续步骤造成的干扰,静音切除的操作一般称为VAD(语音激活检测);
2. 声音分帧,也就是把声音切开成一小段一小段,每小段称为一帧,使用移动窗函数来实现,不是简单的切开,各帧之间一般是有交叠的;

特征提取:
主要算法有线性预测倒谱系数( LPCC)和Mel 倒谱系数( MFCC),目的是把每一帧波形变成一个包含声音信息的多维向量;


声学模型( AM):
通过对语音数据进行训练获得,输入是特征向量,输出为音素信息;常用算法为GMM+HMM;

字典:
字或者词与音素的对应, 简单来说, 中文就是拼音和汉字的对应,英文就是音标与单词的对应;
语言模型( LM) :
通过对大量文本信息进行训练,得到单个字或者词相互关联的概率;常用算法为: n-gram模型;
解码:
就是通过声学模型、字典、 语言模型对提取特征后的音频数据进行文字输出; 

上述模块中涉及到很多知识,在此列出本人觉得比较好的链接,部分内容我也已经转载,但是为了尊重原创,还是给出原文链接:

                                        https://blog.csdn.net/xueyingxue001/article/details/53183757

今生

    今生主要得益于神经网络,主要思想就是用DNN取待原有模块,或做最后的大融合

    上述涉及到的知识如果想要详细了解请参考以下链接:

五 闲聊型问答系统

Seq2Seq

    在闲聊型问答系统介绍之前不得不先请出该系统的明星:Seq2Seq

   其模型结果如下所示:

 

  •   每个单元是循环神经网络,如: RNN、 LSTM、 GRU等, LSTM居多;
  • seq2seq属于encoder-decoder结构中的一种, encoder将一个可变长度的信号序列变为固定长度的向量表达, Decoder将这个固定长度的向量变成可变长度的目标信号序列。
  • 该模型有很多变体,如加入注意力机制、记忆力模型等

   

说明: 上上一个模型为训练模式,即decoder的输入为ground truth,上个模型为部署模式,在测试时, decoder的输入为其上一时刻的输出

闲聊式问答系统框架

分词
 概念
a) 中文分词指的是将一个汉字序列切分成一个一个单独的词。 分词就是将连续的字序
列按照一定的规范重新组合成词序列的过程。
 中文分词方法
a) 基于字符串匹配的分词方法
b) 基于理解的分词方法 ( 处于试验阶段)
c) 基于统计的分词方法
d) 实际使用时结合a)和c)
 中文分词工具
jieba分词、 SnowNLP、 THULAC、 NLPIR

词嵌入( Word Embedding)
 概念
a) 是一种词的类型表示, 具有相似意义的词具有相似的表示, 是将词汇映射到实数向
量的方法总称。
 独热码( one-hot encoding)
a) 将词表示为很长的向量, 词的维度是词表大小, 绝大多数维度为0, 只有一个维度为
1
b) “ 可爱” [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ……]
 常用算法
a) word2vec:详细算法请参看http://www.dataguru.cn/article-13488-1.html Skip-gram及CBOW算法详解及训练过程请参看cs224d视频的第2节课的内容

Seq2Seq
 工具
a) Tensorflow embedding_attention_seq2seq的API接口
b) 接口参数请参看http://www.shareditor.com/blogshow?blogId=136
c) 该接口融合了word embedding 和attention机制

d) seq2seq详细算法讲解请参看 https://blog.csdn.net/Irving_zhang/article/details/78889364

自然语言生成( Word Embedding)
 算法
a) 贪婪搜索:输出序列的每一步中输出最有可能的单词
b) 集束搜索( beam search) :返回可能性最大的输出序列列表
c) 详细讲解请参看: https://www.sohu.com/a/159397046_206784

知识库问答系统(KB-QA)

  • 概念

给定自然语言问题,通过对问题进行语义理解和解析,进而利用知识库进行查询、推理得出答案。

  • 应用场景

适合回答when,what等事实性问题,回答的答案是知识库中的实体或实体关系

  • 知识库

利用三元组存储(实体entity, 实体关系relation, 实体entity),如(姚明,出生地,上海)

  • 主流方法

 语义解析
思想在于将人类使用的自然语言句子转化为机器可以理解的逻辑形式,通过数据库得出答案。
 信息抽取
思想在于通过抽取句子中的特征信息和知识库中相关实体的特征信息,用以上特征训练分类器对候选答案排序得出答案。
 向量建模
思想在于将知识库的实体和自然语言句子都映射到同一个向量空间中,通过比较相似度寻找答案。

 深度学习
应用于语义解析、向量建模;采用记忆网络、 Attention机制
 动态模型
思想在于预定义一些网络模块,通过对问题进行解析,针对问题使用不同的
模块组合出动态模型进行回答。
 参考资料
知乎专栏 https://zhuanlan.zhihu.com/p/27141786

垂直领域QA

对话系统

基于检索的对话系统 (面向具体任务的问答新系统) 

 模式: s1,s2->R, 即字符串s1和s2符合一定的规则
 将回复使用的数据预先存储, 优点为回复的内容不会有语
法和语义的错误;
 缺点:不会创造新的回答, 无法对未训练的问题作出回答

  •  基于生成的对话系统 ( chitchat-bot, KB-QA)

 模式: s1->s2, 即由字符串s1得到s2

  • 趋势

具有上述两种功能的混合对话系统

说明

总结

  • 相关知识比较庞杂,基础知识比较欠缺的情况下,刚开始学起来可能成就感较低,弄清楚一个知识点可能需要查阅许多资料;
  • 传统方法比较多,比较难理解; 但是不要灰心,不断学习总能掌握
2018-05-29 11:41:08 qq_41185868 阅读数 9811
  • C++语音识别开篇

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

    5927 人正在学习 去看看 杨波

Python之GUI:基于Python的GUI界面设计的一套AI课程学习(机器学习、深度学习、大数据、云计算等)推荐系统(包括语音生成、识别等前沿黑科技)

导读
基于Python的GUI界面设计的一套AI课程学习(机器学习、深度学习、大数据、云计算等)推荐系统,(包括目标检测、人脸识别,语音生成、识别等前沿黑科技)。本款系统软件归Jason Niu本人所有,严禁盗用,谢谢合作!

 

 

目录

输出结果

核心代码


 

 

输出结果


 

 

核心代码

def niu_read_docx(filename):
     doc=docx.Document(filename)
     fulltext=[]
     for para in doc.paragraphs:
         fulltext.append(para.text)
     return '\n'.join(fulltext)

class dialog(QDialog, Ui_dialog):
    """
    Class documentation goes here.
    """
    def __init__(self, parent=None):
        """
        Constructor
        
        @param parent reference to the parent widget
        @type QWidget
        """
        super(dialog, self).__init__(parent)
        self.setupUi(self)
        
        time.sleep(2) #使开机画面停留2秒 
    
    @pyqtSlot()
    def on_pushButton_clicked(self):
        """
        Slot documentation goes here.
        """
        my_str_2=self.lineEdit_2.text()
        my_str_3=self.lineEdit_3.text()
        my_str_4=self.lineEdit_4.text()
        
        print(my_str, my_str_2, my_str_3, my_str_4)
        Button1_1=QMessageBox.information(self, u'提示信息框', u'输入的s所有信息已经存储到数据库中!', ) #提示对话信息框
        print('OK')
        self.close() #关闭当前界面

    
    @pyqtSlot()
    def on_pushButton_2_clicked(self):
        """
        Slot documentation goes here.
        """
        print('Cancel')

class MainWindow(QMainWindow, Ui_MainWindow):
    """
    Class documentation goes here.
    """
    def __init__(self, parent=None):
        """
        Constructor
        @param parent reference to the parent widget
        @type QWidget
        """
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.graphicsView.mousePressEvent=self.my_clicked
        
    def my_clicked(self, e):
        print('自定义的点击事件函数')
        webbrowser.open('www.baidu.com') #默认浏览器打开指定网址

    @pyqtSlot()
    def on_pushButton_clicked(self):
        """
        Slot documentation goes here.
        """
        print(self.textBrowser.toPlainText()) 
    
    @pyqtSlot()
    def on_pushButton_2_clicked(self):
        """
        Slot documentation goes here.
        这是测试按钮的槽函数
        """
        self.lineEdit.setText( "")  #清除单行文本框内容
        self.lineEdit_2.setText( "")
        self.textBrowser.setText( "") #清除多行文本框内容
        print("清除登陆账号信息!")
    
    @pyqtSlot()
    def on_pushButton_3_clicked(self):
        """
        Slot documentation goes here.
        """
        my_str=self.lineEdit.text()+":"+self.lineEdit_2.text() #获取单行文本框的内容
        self.textBrowser.append(my_str) #向多行文本添加内容
        print(my_str)
        
    @pyqtSlot()
    def on_pushButton_4_clicked(self):
        """
        Slot documentation goes here.
        该按钮命令调用的预定义的函数,退出的命令
        """

    @pyqtSlot()
    def on_pushButton_5_clicked(self):
        """
        Slot documentation goes here.
        """
        Button5=QMessageBox.question(self, u'提示信息框', u'是否全部保存到数据库中?')
        if Button5==0:
            print('全部保存中……')
        else:
            print('没有保存')
            
        
    @pyqtSlot()
    def on_pushButton_6_clicked(self):
        """
        Slot documentation goes here.
        """
        Button6=QMessageBox.warning(self, u'提警告信息框', u'没有警告信息,请继续输入!')
        
    @pyqtSlot()
    def on_pushButton_7_clicked(self):
        """
        Slot documentation goes here.
        """
        Button7=QMessageBox.critical(self, u'严重警告!', u'没有严重警告信息,请继续输入!')
   

    @pyqtSlot()
    def on_pushButton_9_clicked(self):
        """
        Slot documentation goes here.
        """
        self.graphicsView.setStyleSheet("border-image: url(:/im/image/AI (4).jpg);")
        
        

 
#    @pyqtSlot(QUrl)
    def on_textBrowser_anchorClicked(self, p0):
        """
        Slot documentation goes here.
        
        @param p0 DESCRIPTION
        @type QUrl
        """

    @pyqtSlot()
    def on_radioButton_clicked(self):
        """
        Slot documentation goes here.
        """
        print('同时选择其他三个首个radioButton')
        self.radioButton_12.setChecked(True)
        self.radioButton_16.setChecked(True)
        self.radioButton_20.setChecked(True)
        self.label_4.setStyleSheet("border-image: url(:/im/image/AI (4).jpg);")

 

 


 

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