论坛首页 编程语言技术论坛

关于语音语别的相关知识

浏览 2996 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-04-15   最后修改:2011-04-15
C++

最近,想开发一个关于语音识别的软件,现在在资料搜集中。

 

基础知识

 

隐马尔科夫模型(HMM) , 这个资料我看了好多资料还不是很完全明白。

 

http://zh.wikipedia.org/zh/%E9%9A%90%E9%A9%AC%E5%B0%94%E5%8F%AF%E5%A4%AB%E6%A8%A1%E5%9E%8B

 

http://blog.csdn.net/caohao2008/archive/2007/05/12/1606220.aspx

 

http://www.360doc.com/content/07/0710/11/11966_603345.shtml

 

http://www.52nlp.cn/hmm-learn-best-practices-four-hidden-markov-models

 

http://www.xactad.org/wenzhang/20100906100659311.pdf

 

 Baum-Welch算法,Incomplete data problem ,Maximum a posteriori decoding;极大似然度

 

编程知识

1.如何播放音频信号?

 

wave的播放方法很多,可以用dsound,dshow,甚至是sndPlay,sendMciString等等方法都可以实现。但是这都是对于windows平台下的音频播放,如果换到windows mobile平台,就未必支持以上几种方式,这时就必须用到低级的wave系列的API了。

步骤1: 
申请二个或二个以上的WAVEHDR结构,m_WaveHdr1,m_WaveHdr2 
填充WAVEHDR结构, 如下: 
m_WaveHdr1.lpData           = (LPTSTR)_pWaveData + 44; 
m_WaveHdr1.dwBufferLength  = PLAY_BUFFE_SIZE; 
m_WaveHdr1.dwBytesRecorded = 0; 
m_WaveHdr1.dwUser          = 0; 
m_WaveHdr1.dwFlags         = WHDR_BEGINLOOP | WHDR_ENDLOOP; 
m_WaveHdr1.dwLoops         = 1; 
m_WaveHdr1.lpNext          = NULL; 
m_WaveHdr1.reserved        = 0; 
// 第二个的数据起止位置一定要大于第一个数据的播放缓冲大小,否则可能会声音不正常。 
m_WaveHdr2.lpData          = (LPTSTR)_pWaveData + 44 + PLAY_BUFFE_SIZE; 
m_WaveHdr2.dwBufferLength  = PLAY_BUFFE_SIZE; 
m_WaveHdr2.dwBytesRecorded = 0; 
m_WaveHdr2.dwUser          = 0; 
m_WaveHdr2.dwFlags         = WHDR_BEGINLOOP | WHDR_ENDLOOP; 
m_WaveHdr2.dwLoops         = 1; 
m_WaveHdr2.lpNext          = NULL; 
m_WaveHdr2.reserved        = 0; 

步骤2: 
在回调函数、回调线程或回调窗口的 WOM_DONE 响应里,作以下操作, 
LPWAVEHDR pWaveHeader  = (LPWAVEHDR)dwParam1;   // 系统自动识别是哪一个WAVEHDR播放完毕 
waveOutUnprepareHeader(hwo, pWaveHeader, sizeof(WAVEHDR)); // 清空设备缓存 
   pWaveHeader->lpData     += (5 * PLAY_BUFFE_SIZE); 
   pWaveHeader->dwBufferLength = pThis->m_lLeaveSize < PLAY_BUFFE_SIZE ? pThis->m_lLeaveSize : PLAY_BUFFE_SIZE;   // 得到正确的缓冲大小. 
   waveOutPrepareHeader(hwo, pWaveHeader, sizeof(WAVEHDR)); 
   waveOutWrite(hwo, pWaveHeader, sizeof(WAVEHDR)); 

完成以上步骤,及可实现多段缓冲播放。 

 

如何获得音频信号:

 

 

2.如何处理音频信号?

 

3.如何分析音频信号?

 

 

相关公式

 

窗函数类型矩型窗 RN(n)

汉明窗 0.54-0.46*cos[2*PI*n/(N-1)]         0≤n≤N-1

汉宁窗 0.5*[1-cos[2*PI*n/(N-1)]]             0≤n≤N-1

布莱克曼窗 0.42-0.5*cos[2*PI*n/(N-1)]+0.08cos[4*PI*n/(N-1))*RN(n)

计算功率 h(i)=sqrt(re(i)*re(i)+im(i)*im(i))

计算分贝 dBh(i)=20*log (h(i))

 

 

 

 

   发表时间:2011-06-25  
只是简单的说两句,我也不怎么懂,

1,音频捕获并实时处理,win32上可以用directshow,建立一个流图从音频源直接连到自己的过滤器上,Linux 的话尝试一下 gstreamer吧;
2,处理音频信号,先在 dshow filter 上胡乱变换一下,找点感觉吧,再 fft 了 play around 看看找点频域的感觉吧;要去噪、分割的话,在音频这一块儿估计难度会很大。
3,语音分析,我手头有一本也是关于马氏应用的,翻了1/3感觉难度太大。祝LZ好运!
0 请登录后投票
   发表时间:2011-07-25   最后修改:2011-07-25
如果你的问题是卡在HMM的话。我真诚的建议你还是考虑使用现有的程序库吧。现在语音识别已经是很成熟的技术了,现成的SDK也是很多的。不要把你的宝贵生命,浪费在别人已经做完了的事情上。要把有限的精力,放在力所能及的地方,比较划算啊。当然,我的建议,只是针对你是程序员,想做自己产品的假设上。如果你是学生,以在现有研究的基础上有所创新为目的,有大把的时间去做理论上的学习,也有老师带你。那又完全不同。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics