基于HTK的命令字识别系统
- 格式:doc
- 大小:526.50 KB
- 文档页数:40
如何在C++中进行音频处理和语音识别在C++中进行音频处理和语音识别可以使用一些开源库和工具来实现。
以下将介绍一些常用的库和工具,以及它们的基本用法。
音频处理:1. PortAudio:PortAudio是一个跨平台的音频输入/输出库,可以用于音频的录制和播放。
在C++中使用PortAudio库,可以通过其API来实现音频数据的录制和处理。
2. libsndfile:libsndfile是一个用于处理音频文件的库,它支持多种常见音频格式。
你可以使用libsndfile库来读取、写入和处理音频文件。
3. FFTW:FFTW是一个非常高效的快速傅立叶变换库,可以用于音频的频域分析和处理。
使用FFTW库,你可以对音频数据进行频谱分析、滤波等操作。
语音识别:1. Kaldi:Kaldi是一个开源的语音识别工具包,使用C++编写,适用于语音识别和说话人识别等任务。
Kaldi提供了丰富的工具和算法,包括语音特征提取、声学模型训练、语音解码等功能。
2. HTK:HTK是一个广泛使用的语音识别工具包,支持多种语音识别模型和算法。
HTK提供了用于模型训练、语音解码和评估等功能的命令行工具。
3. CMU Sphinx:CMU Sphinx是一个开源的语音识别系统,包括多个组件,如语音特征提取、声学模型训练和语音解码等。
CMU Sphinx的API可用于在C++中进行语音识别。
以上是一些常用的音频处理和语音识别的库和工具,它们提供了丰富的功能和接口,可以帮助你在C++中进行音频处理和语音识别。
根据具体的需求,你可以选择适合的库和工具来实现相应的功能。
基于BP神经网络的字符识别系统(完整版)doc资料计算机与现代化2021年第1期J I S UANJ I Y U X I A NDA I HUA总第161期收稿日期:2020205211项目:河南省自然科学资助项目(0511011500作者简介:张可(19842,女,河南三门峡人,南京航空航天大学信息科学与技术学院硕士研究生,研究方向:图像处理;张高燕(19872,女,河南三门峡人,北京师范大学信息科学与技术学院硕士研究生,研究方向:图像与语音信号处理;吴苏(19872,男,河南南阳人,哈尔滨工程大学计算机科学与技术学院硕士研究生,研究方向:I nternet 应用软件;范海菊(19792,女,河南新乡人,河南师范大学计算机与信息技术学院讲师,研究方向:语音和图像信号处理。
基于BP 神经网络的字符识别系统张可1,张高燕2,吴苏3,范海菊4(1.南京航空航天大学信息科学与技术学院,江苏南京210016;2.北京师范大学信息科学与技术学院,北京100875;3.哈尔滨工程大学计算机科学与技术学院,黑龙江哈尔滨150001;4.河南师范大学计算机与信息技术学院,河南新乡453007摘要:基于BP 神经网络设计了一个字符识别系统。
首先,对字符图像进行二值化处理,构造输入向量矩阵。
其次,通过选取初始权值、隐层节点数和权值学习算法,创建BP 神经网络,对样本数据进行训练,之后对加有噪声的样本再次进行训练,以提高网络的鲁棒性。
最后进行仿真测试并制作图形用户界面G U I 来模拟与演示该系统。
仿真结果显示,该BP 网络对噪声系数小于0.8的字符识别率可达95%,且网络训练时间可接受。
关键词:BP 神经网络;G U I ;字符识别;鲁棒性中图分类号:TP311.52文献标识码:ASystem of Character Recogn iti on Ba sed on Back 2propaga ti on Neura l NetworkZHANG Ke 1,Z HANG Gao 2yan 2,WU Su 3,F AN Hai 2ju4(1.College of I nf or mati on Science and Technol ogy,Nanjing University of Aer onautics and Astr onautics,Nanjing 210016,China;2.College of I nf or mati on Science and Technol ogy,Beijing Nor mal University,Beijing 100875,China;3.College of Computer Science and Technol ogy,Harbin Engineering University,Harbin 150001,China;4.College of Computer and I nfor mati on Technol ogy,Henan Nor mal University,Xinxiang 453007,ChinaAbstract:This article designs a character recogniti on syste m based on the Back 2Pr opagati on neural net w ork .First,the character i m age is p r ocessed in binary t o construct the input vect or matrix .Second,by choosing the initial weight,the nu mber of hide nodes and the learning algorith m of weight,a perfect BP neural net w ork is created .And then the net w ork carries on the training t o the samp le data and after wards t o the sa mp le with noise once more,t o enhance the net w ork r obustness .Finally,it carries on the si m ulati on test and manufactures graphical user interface t o si m ulate and demonstrate this system.The si m ulati on result shows that the character recogniti on rate of thisBP net w ork is possible t o reach 95%with the noise fact or less than 0.8,and the training ti m e is accep table .Key words:BP neural net w ork;G U I ;character recogniti on;r obustness0引言为了解决计算机对字符的自动识别问题,使计算机达到真正智能化,人们对计算机的自动识别进行了多年研究,并取得了很大的进步。
HTK Book目录第一篇教程概览 1 HTK基础1.1 HMM基本原理1.2 孤立词识别1.3 输出概率说明1.4 Baum-Welch Re-Estimation1.5 识别和Viterbi解码1.6 连续语音识别1.7 ss说话者适应2 HTK工具包概览2.1 HTK软件架构2.2 HTK工具的通用属性2.3 工具包2.3.1 数据准备工具2.3.2 训练工具2.3.3 识别工具2.3.4 分析工具2.4 版本3.4中的更新2.4.1 版本3.3中的更新2.4.2 版本3.2中的更新2.4.3 版本3.1中的更新2.4.4 版本2.2中的更新2.4.5 版本2.1中的新特征3 一个教程示例3.1 数据准备3.1.1 步骤一任务语法3.1.2 步骤二字典3.1.3 步骤三录制语音数据3.1.4 步骤四创建脚本文件3.1.5 步骤五语音数据编码3.2 创建单元音HMM3.2.1 步骤六创建Flat start单元音3.2.2 步骤七确定Silence模型3.2.3 步骤八Realigning训练数据3.3 创建Tied-Stated三元音3.3.1 步骤九从单元音创建三元音3.3.2 步骤十创建Tied-Stated三元音3.4 识别器评估3.4.1 步骤十一识别测试数据3.5 运行识别器3.6 HMM自适应3.6.1 步骤十二准备自适应数据3.6.2 步骤十三生成Transforms(转移矩阵)3.6.3 自适应系统评估3.7 Semi-Stated和HLDA Transform3.8 总结第二篇深入HTK 4 操作环境4.1 命令行4.2 脚本文件4.3 配置文件4.4 标准选项4.5 错误报告4.6 字符串和命名4.7 内存管理4.8 基于管道和网络的I/O4.9 HTK数据文件的字节交换4.10 总结5 语音I/O5.1 通用机制5.2 语音信号处理5.3 线性预测分析(LPA)5.4 Filterbank分析5.5 V ocal Tract长度规范化5.6 Cepstral特征5.7 感知线性预测5.8 能量度量5.9 一阶二阶三阶差分系数5.10 参数文件的存储5.10.1 HTK格式参数文件5.10.2 Esignal格式参数文件5.11 波形文件格式5.11.1 HTK文件格式5.11.2 Esignal文件格式5.11.3 TIMIT文件格式5.11.4 NIST文件格式5.11.5 SCRIBE文件格式5.11.6 SDES1文件格式5.11.7 AIFF文件格式5.11.8 SUNAU8文件格式5.11.9 OGI文件格式5.11.10 WA V文件格式5.11.11 ALIEN和NOHEAD文件格式5.12 直接音频I/O5.13 多输入流5.14 向量量化5.15 使用HList观察语音5.16 使用HCopy拷贝和编码5.17 版本1.5的兼容性5.18 总结6 脚本和标签文件6.1 标签文件结构6.2 标签文件格式6.2.1 HTK标签文件6.2.2 ESPS标签文件6.2.3 TIMIT标签文件6.2.4 SCRIBE标签文件6.3 主标签文件(MLF)6.3.1 MLF的通用规则6.3.2 语法和语义6.3.3 MLF搜索6.3.4 MLF示例6.4 编辑标签文件6.5 总结7 HMM定义文件7.1 HMM参数7.2 基本HMM定义7.3 宏定义7.4 HMM集合7.5 Tied-Mixture系统7.6 离散概率HMM7.7 输入线性变换7.8 Tee模型7.9 二进制存储格式7.10 HMM定义语言8 HMM参数估算8.1 训练策略8.2 使用HInit进行初始化8.3 使用HCompV进行Flat Starting8.4 使用HRest进行独立单元重估8.5 使用HERest进行嵌入式训练8.6 Single-Pass 重训练8.7 Two-Model 重估8.8 参数重估公式8.8.1 Viterbi训练(HInit)8.8.2 前向和后向概率8.8.3 Single-Model重估(HRest)8.8.4 嵌入式模型重估(HERest)8.8.5 Semi-Tied Transform 估算(HERest)9 HMM自适应9.1 使用线性变换的模型自适应9.1.1 线性变换9.1.2 I/O父变换9.1.3 基础类定义9.1.4 回归类树9.1.5 线性变换格式9.1.6 变换的层次结构9.1.7 多流系统9.2 使用线性变换的适应训练9.3 使用MAP的模型自适应9.4 线性变换估算公式9.4.1 平均变换矩阵(MLLRMEAN)9.4.2 方差变换矩阵(MLLRV AR,MLLRCOV)9.4.3 约束MLLR变换矩阵(CMLLR)10 HMM系统优化10.1 使用HHed10.2 创建上下文依赖的模型10.3 参数Tying和Item List10.4 数据驱动的聚类10.5 基于树的聚类10.6 混合递增10.7 回归类树的构建10.8 其他操作11 离散和Tied-Mixture模型11.1 离散序列建模11.2 使用语音的离散模型11.3 Tied-Mixture系统11.4 参数平滑12 网络、字典和语言模型12.1 如何使用网络12.2 单词网络和标准Lattice格式12.3 使用HParse构建单词网络12.4 Bigram语言模型12.5 使用HBuild构建单词网络12.6 使用HSGen测试单词网络12.7 构建字典12.8 单词网络扩展12.9 其他种类的识别系统13 使用HVite解码13.1 解码操作13.2 解码组织13.3 使用测试数据库进行识别13.4 评估识别结果13.5 生成Forced Alignment13.6 直接语音输入识别13.7 N-Best列表和Lattice第三篇语言建模 14 语言建模基础14.1 n-gram语言模型14.1.1 Word n-gram模型14.1.2 等价类14.1.3 Class n-gram模型14.2 Statistically-derived Class Maps14.2.1 Word交换算法14.3 健壮模型估计14.3.1 概率估计14.3.2 概率平滑14.4 Perplexity(困惑)14.5 n-gram构建过程一览14.6 Class-Based语言模型15 语言模型构建教程15.1 数据库准备15.2 OOV Word Maps15.3 语言模型生成15.4 测试语言模型Perplexity15.5 生成、使用count-based模型15.6 模型插值15.7 Class-based模型15.8 如何解决问题15.8.1 文件格式问题15.8.2 命令语法问题15.8.3 Word map15.8.4 内存问题15.8.5 异常Perplexity16 语言模型参考16.1 Words和Classes16.2 数据文件的头部16.3 Word Map文件16.4 Class Map文件16.5 Frequence-of-frequence(FoF)文件16.6 Word 语言模型文件格式16.6.1 ARPA-MIT语言模型格式16.6.2 修改的ARPA-MIT语言模型格式16.6.3 二进制语言模型格式16.7 Class语言模型文件格式16.7.1 Class counts格式16.7.2 The class possibilities format16.7.3 The class LM three file format16.7.4 The class LM single file format16.8 语言建模跟踪16.8.1 LCMap16.8.2 LGBase16.8.3 Lmodel16.8.4 LPCalc16.8.5 LPMerge16.8.6 Lutil16.8.7 LWMap16.9 运行时参数配置16.9.1 USEINTID16.10 编译时参数配置16.10.1 LM_ID_SHORT16.10.2 LM_COMPACT16.10.3 LMPROB_SHORT16.10.4 INTERPOLATE_MAX16.10.5 SANITY16.10.6 INTEGRITY_CHECK第四篇参考 17 HTK工具17.1 Cluster17.2 Hbuild17.3 HcompV17.4 Hcopy17.5 HDMan17.6 Hdecode17.7 HERest17.8 Hhed17.9 Hinit17.10 Hled17.11 Hlist17.12 HLMCopy17.13 HLRescore17.14 HLStats17.15 HMMIRest17.16 Hparse17.17 Hqant17.18 Hrest17.19 Hresults17.20 HSGen17.21 HSLab17.22 Hsmooth17.23 Hvite17.24 Ladapt17.25 Lbuild17.26 Lfof17.27 LGCopy17.28 LGList17.29 LGPrep17.30 Llink17.31 Lmerge17.32 LnewMap17.33 Lnorm17.34 Lplex17.35 Lsubset18 变量配置18.1 库模块中的变量配置18.2 工具中的变量配置19 错误和警告编码19.1 一般错误19.2 工具和模块的错误总结20 HTK标准Lattice格式(SLF)20.1 SLF文件20.2 格式20.3 语法20.4 字段类型20.5 SLF文件示例。
应用HTK搭建语音拨号系统苏统华哈尔滨工业大学人工智能研究室2006年10月30日声明:版权所有,转载请注明作者和来源该系统能够识别连续说出的数字串和若干组姓名。
建模是针对子词(sub-word, eg. 音素),具有一定的可扩充性。
当加入一个新名字时,只需修改发音词典和任务语法即可。
模型为连续混合高斯输出,运用语音决策树聚类形成的绑定状态式三音素。
1. 数据准备需要录制训练数据和测试数据。
为进行校准,还需要数据的标注文本。
这里用任务语法(task grammar)产生真值文本(ground truth)。
为了处理训练数据,需要定义一个语音集合和一个字典用以涵盖训练和测试数据中涉及的单词。
[step 1]任务语法定义任务语法以包含变量的正则表达式形式定义,存储在文件gram里:文件名:gram$digit = ONE | TWO | THREE | FOUR | FIVE |SIX | SEVEN | EIGHT | NINE | OH | ZERO;$name = [ SUE ] LAW |[ JULIAN ] TYLER |[ DA VE ] WOOD |[ PHIL ] LEE |[ STEVE ] YOUNG;( SENT-START ( DIAL <$digit> | (PHONE|CALL) $name) SENT-END )上面的语法是高层表示,必须通过HParse转成HTK可用的底层表示。
底层表示存于文件wnet中:HParse gram wdnet文件名:wdnetVERSION=1.0N=31 L=62I=0 W=SENT-ENDI=1 W=YOUNG……J=0 S=2 E=0……J=61 S=0 E=29苏统华.哈尔滨工业大学人工智能研究室.2006[step 2]字典定义此例中利用BEEP语音字典,除去其中的重音符,并在每个发音后加入sp(short pause,小停顿)。
Http指纹识别技术引言Http指纹识别现在已经成为应用程序安全中一个新兴的话题,Http服务器和Http应用程序安全也已经成为网络安全中的重要一部分。
从网络管理的立场来看,保持对各种web服务器的监视和追踪使得Http指纹识别变的唾手可得,Http指纹识别可以使得信息系统和安全策略变的自动化,在基于已经设置了审核策略的特殊的平台或是特殊的web服务器上,安全测试工具可以使用Http 指纹识别来减少测试所需要的配置。
本文将介绍现有的Http指纹识别技术,同时也将讨论所遇到的一些问题并且拿出可行的解决方案。
一指纹识别理论指纹的定义是这样的:1是指任何表面上的指尖印象或者是在指尖上蘸上墨水而在纸上留下的的墨水印象;2是指可以用来识别的东西:如特色、痕迹或特性等揭露起源的东西,表示物体或物质的特色的证据。
指纹识别可以分为两步,一是对指纹进行收集和分类;二是将未知的指纹同被储存在数据库中的指纹进行比较,从而找出最符合的。
当采集指纹的时候,对物体的所有主要特性的抓取是必要的。
采集较多的细节,可以对第二步产生很大的帮助。
当比较指纹的时候,很有可能有几个指纹是被不合适的匹配的,因为可指纹之间微小的差别很容易使识别产生错误,这也要求指纹识别需要很高的技术。
指纹识别技术现在已经是网络安全的已知技术。
操作系统指纹识别在任何的网络评估中是一件通常的工作,现在也有很多操作系统指纹识别技术。
操作系统指纹识别为什么能成功?那是因为每个操作系统实现TCP/IP协议时有微小的差别,当前比较流行的是利用TCP/IP堆栈进行后操作系统识别,相关工具比如Nmap;还有的是利用ICMP进行操作系统识别,代表工具如Xprobe。
Http指纹识别的原理大致上也是相同的:记录不同服务器对Http协议执行中的微小差别进行识别。
Http指纹识别比TCP/IP堆栈指纹识别复杂许多,理由是定制Http服务器的配置文件、增加插件或组件使得更改Http的响应信息变的很容易,这样使得识别变的困难;然而定制TCP/IP堆栈的行为需要对核心层进行修改,所以就容易识别。
// 图像字符识别毕业设计View.cpp : CMyView 类的实现//#include "stdafx.h"#include "图像字符识别毕业设计.h"#include "图像字符识别毕业设计Doc.h"#include "图像字符识别毕业设计View.h"#include ".\图像字符识别毕业设计view.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// CMyViewIMPLEMENT_DYNCREATE(CMyView, CView)BEGIN_MESSAGE_MAP(CMyView, CView)// 标准打印命令ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) ON_COMMAND(ID_FILE_OPEN, OnFileOpen)ON_COMMAND(ID_IMAGE_PARAMENT, OnImageParament)ON_COMMAND(ID_FIND_CARNUMBER, OnFindCarnumber)ON_COMMAND(ID_COLOR_CRAY, OnColorCray)ON_COMMAND(ID_MEDIAN5, OnMedian5)ON_COMMAND(ID_LOG_BORDDETEC, OnLogBorddetec)ON_COMMAND(ID_OTSU_THRESHOLD, OnOtsuThreshold)ON_COMMAND(ID_CATCH_NUMBERONCE, OnCatchNumberonce) ON_COMMAND(ID_Lap_Borddetec, OnLapBorddetec)ON_COMMAND(ID_CATCH_BNUMBER, OnCatchBnumber)ON_COMMAND(ID_GET_CARNUMBER, OnGetCarnumber)ON_COMMAND(ID_GET_HCARNUMBER, OnGetHcarnumber)ON_COMMAND(ID_NUMBER_CUT, OnNumberCut)ON_COMMAND(ID_ADD_ALL, OnAddAll)ON_COMMAND(ID_NUMBER_STUDY, OnNumberStudy)ON_COMMAND(ID_FIRSTNUMBER_RECOGNISE, OnFirstnumberRecognise) ON_COMMAND(ID_SECONDNUMBER_RECOGNISE, OnSecondnumberRecognise) ON_COMMAND(ID_THIRDNUMBER_RECOGNISE, OnThirdnumberRecognise) ON_COMMAND(ID_FOURTHNUMBER_RECOGNISE, OnFourthnumberRecognise) ON_COMMAND(ID_FIFTHNUMBER_RECOGNISE, OnFifthnumberRecognise) ON_COMMAND(ID_SISTHNUMBER_RECOGNISE, OnSisthnumberRecognise) ON_COMMAND(ID_SEVENTHNUMBER_RECOGNISE, OnSeventhnumberRecognise) ON_COMMAND(ID_ZIMU_STUDY, OnZimuStudy)ON_COMMAND(ID_HANZI_STUDY, OnHanziStudy)ON_COMMAND(ID_ZHIFUSHIBIE_ZONGHE, OnZhifushibieZonghe)END_MESSAGE_MAP()// CMyView 构造/析构CMyView::CMyView(){// TODO: 在此处添加构造代码}CMyView::~CMyView(){}BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs){// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或// 样式return CView::PreCreateWindow(cs);}// CMyView 绘制void CMyView::OnDraw(CDC* pDC){CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码if (!m_Image.IsNull()){m_Image.Draw(pDC->m_hDC,0,0);}}// CMyView 打印BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo){// 默认准备return DoPreparePrinting(pInfo);}void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: 打印前添加额外的初始化}void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: 打印后添加清除过程}// CMyView 诊断#ifdef _DEBUGvoid CMyView::AssertValid() const{CView::AssertValid();}void CMyView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CMyDoc* CMyView::GetDocument() const // 非调试版本是内联的{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));return (CMyDoc*)m_pDocument;}#endif //_DEBUG// CMyView 消息处理程序void CMyView::OnFileOpen(){// TODO: 在此添加命令处理程序代码CString strFilter;CSimpleArray<GUID> aguidFileTypes;HRESULT hResult;// 获取CImage支持的图像文件的过滤字符串hResult =m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T( "AllImage Files") );if (FAILED(hResult)){MessageBox("GetExporterFilter调用失败!");return;}CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);if(IDOK != dlg.DoModal())return;m_Image.Destroy();// 将外部图像文件装载到CImage对象中hResult = m_Image.Load(dlg.GetFileName());if (FAILED(hResult)) {MessageBox("调用图像文件失败!");return;}// 设置主窗口标题栏内容CString str;str.LoadString(AFX_IDS_APP_TITLE); AfxGetMainWnd()->SetWindowText(str + " - " +dlg.GetFileName());Invalidate(); // 强制调用OnDraw}void CMyView::OnImageParament(){// TODO: 在此添加命令处理程序代码CClientDC dc(this);HBRUSH hBrush;HPEN hPen;int i,x,y,k,nYChar;CString str;TEXTMETRIC tm;char *textbuf[]={"像素行的存储顺序","像素宽度","像素高度","每像素位数","每行字节数"};x=775;y=120;hPen=(HPEN) GetStockObject(WHITE_PEN);hBrush=(HBRUSH) GetStockObject(WHITE_BRUSH);dc.SelectObject(hPen);dc.SelectObject(hBrush);dc.GetTextMetrics(&tm);dc.SetTextColor(RGB(0,0,0));nYChar=(tm.tmHeight+tm.tmExternalLeading)*3/2;dc.TextOut(x+60,y-nYChar*3/2,"图像特征参数");for(i=0;i<5;i++){dc.TextOut (x,y+nYChar*i,textbuf[i]);}x+=175;k=m_Image.GetPitch();if(k<0)dc.TextOut (x,y+nYChar*0,"自下而上");elsedc.TextOut (x,y+nYChar*0,"自上而下");str.Format ("%d",abs(k));dc.TextOut (x,y+nYChar*4,str,lstrlen(str));str.Format ("%d",m_Image.GetWidth ());dc.TextOut (x,y+nYChar*1,str);str.Format ("%d",m_Image.GetHeight ());dc.TextOut (x,y+nYChar*2,str);str.Format ("%d",m_Image.GetBPP ());dc.TextOut (x,y+nYChar*3,str);if(m_Image.GetMaxColorTableEntries ()){dc.TextOut (x-175,y+nYChar*6,"调色板单元数");k=m_Image.GetMaxColorTableEntries ();str.Format ("%d",k);dc.TextOut (x,y+nYChar*6,str);}elsedc.TextOut (x-175,y+nYChar*6,"真彩色图像,无调色板");}void CMyView::OnFindCarnumber(){// TODO: 在此添加命令处理程序代码}struct IMAGEPARAMENT {int nWidth;int nHeight;int nBitCount;int nBytesPerLine;int nBytesPerPixel;int nNumColors;int nSize;};void GetImageParament(CImage *pImg,struct IMAGEPARAMENT *ppImgParam){if (pImg->IsNull()) return;ppImgParam->nWidth = pImg->GetWidth();ppImgParam->nHeight = pImg->GetHeight();ppImgParam->nBitCount = pImg->GetBPP();ppImgParam->nBytesPerLine =(pImg->GetWidth()*pImg->GetBPP()+31)/32*4;ppImgParam->nBytesPerPixel = pImg->GetBPP()/8;if (pImg->GetBPP()<=8)ppImgParam->nNumColors= 1 << pImg->GetBPP();elseppImgParam->nNumColors= 0;ppImgParam->nSize =ppImgParam->nBytesPerLine*ppImgParam->nHeight;}void ImageCopy(CImage *pImgn,CImage *pImgm){struct IMAGEPARAMENT P;RGBQUAD ColorTab[256];CDC *pOrigDC,*pDC;GetImageParament(pImgm,&P);if (!pImgn->IsNull())pImgn->Destroy();pImgn->Create(P.nWidth,P.nHeight,P.nBitCount,0);if (P.nNumColors>0){pImgm->GetColorTable(0,P.nNumColors,ColorTab);pImgn->SetColorTable(0,P.nNumColors,ColorTab);}pOrigDC= CDC::FromHandle(pImgm->GetDC());pDC = CDC::FromHandle(pImgn->GetDC());pDC->BitBlt(0,0,P.nWidth,P.nHeight,pOrigDC,0,0,SRCCOPY);pImgm->ReleaseDC();pImgn->ReleaseDC();}void ColorToGray(CImage *pImgn,CImage *pImgm){int i, x, y;int gray[256];BYTE *cbuf,*gbuf;RGBQUAD ColorTab[256];CImage gpImg;CString str1;struct IMAGEPARAMENT P;GetImageParament(pImgm,&P);if (P.nBitCount<8) return;gpImg.Create(P.nWidth,P.nHeight,8,0);for (i=0; i<256; i++){ColorTab[i].rgbBlue = ColorTab[i].rgbGreen =ColorTab[i].rgbRed = i;}gpImg.SetColorTable(0,256,ColorTab);if (pImgm->GetBPP()<=8) { pImgm->GetColorTable(0,P.nNumColors,ColorTab);for (i=0; i<P.nNumColors; i++){gray[i] = (int) (0.11*ColorTab[i].rgbBlue +0.59*ColorTab[i].rgbGreen +0.30*ColorTab[i].rgbRed);}for (y=0; y<P.nHeight; y++) {cbuf = (BYTE*) pImgm->GetPixelAddress(0,y);gbuf = (BYTE*) gpImg.GetPixelAddress(0,y);for (x=0; x<P.nWidth; x++)gbuf[x] = (BYTE) gray[cbuf[x]];}}else {for (y=0; y<P.nHeight; y++) {cbuf = (BYTE*) pImgm->GetPixelAddress(0,y);gbuf = (BYTE*) gpImg.GetPixelAddress(0,y);for (x=0,i=0; x<P.nWidth; x++,i+=P.nBytesPerPixel) { gbuf[x] = (BYTE) (0.11*cbuf[i] + 0.59*cbuf[i+1] +0.30*cbuf[i+2]);}}}ImageCopy(pImgn,&gpImg);gpImg.Destroy();}void CMyView::OnColorCray(){// TODO: 在此添加命令处理程序代码CString str1;ColorToGray(&m_Image,&m_Image);str1.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str1 + " - " +"灰度图");Invalidate();}int MedValue(int *buf,int n,int m){int i,j,k,f;for(i=1;i<n;i++){for(j=n-1,f=0;j>=i;j--){if(buf[j]>buf[j+1]){k=buf[j];buf[j]=buf[j+1];buf[j+1]=k;f=1;}}if(f==0) break;}return(buf[m]);}int buff1[5];void Median5(BYTE **list0,BYTE**list1,int DX,int DY){int flag=5;for(int i=1;i<DY-1;i++){for(int j=1;j<DX-1;j++){buff1[0]=list1[i-1][j];buff1[1]=list1[i][j];buff1[2]=list1[i+1][j];buff1[3]=list1[i][j-1];buff1[4]=list1[i][j+1];list0[i][j]=(BYTE)MedValue(buff1,flag,flag/2);}}}BYTE** Create2DList(CImage *pImg){struct IMAGEPARAMENT P;int i;BYTE **list;GetImageParament(pImg,&P);list=(BYTE**)malloc(P.nHeight*sizeof(BYTE*));for (i=0;i<P.nHeight;i++)list[i]=(BYTE*) pImg->GetPixelAddress(0,i);return(list);}void CMyView::OnMedian5(){// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT PP;BYTE **list1,**list0;ImageCopy(&m_Image1,&m_Image);list1=(BYTE **)Create2DList(&m_Image);list0=(BYTE **)Create2DList(&m_Image1);GetImageParament(&m_Image,&PP);Median5(list0,list1,PP.nWidth,PP.nHeight);ImageCopy(&m_Image,&m_Image1);CString str2;str2.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str2 + " - " +"5点中值滤波");Invalidate();}int Mask[3][3],Mask5[5][5],Scale,Offset;void WINAPI Template(BYTE **list0,BYTE **list1,int Dx,int Dy){int i,j,g;for (i=1;i<Dy-1;i++) {for (j=1;j<Dx-1;j++) {g = (Mask[0][0]*list1[i-1][j-1]+Mask[0][1]*list1[i-1][j]+Mask[0][2]*list1[i-1][j+1]+Mask[1][0]*list1[i][j-1]+Mask[1][1]*list1[i][j] +Mask[1][2]*list1[i][j+1]+Mask[2][0]*list1[i+1][j-1]+Mask[2][1]*list1[i+1][j] +Mask[2][2]*list1[i+1][j+1])/Scale+Offset;if (g>0xff) g=0xff;else if (g<0) g=0;list0[i][j] = (BYTE) g;}}}void WINAPI TemplateB(BYTE **list0,BYTE **list1,int Dx,int Dy,int t) { // t x t 邻域处理共用程序 (t = 3 or 5)int i,j,g,m,n,*p;for (i=t/2;i<Dy-t/2;i++) {for (j=t/2;j<Dx-t/2;j++) {g=0;p=&Mask5[0][0];for (m=i-t/2;m<=i+t/2;m++) {for (n=j-t/2;n<=j+t/2;n++)g+=(*p++)*list1[m][n];}g=g/Scale+Offset;if (g>0xff) g=0xff;else if (g<0) g=0;list0[i][j] = g;}}}void WINAPI Laplacian(BYTE **list0,BYTE **list1,int Dx,int Dy)//拉普拉斯算法{Scale=1;Offset=1;Mask[0][0]=Mask[0][2]=Mask[2][0]=Mask[2][2]=-1;Mask[0][1]=Mask[2][1]=Mask[1][0]=Mask[1][2]=-1;Mask[1][1]=8;Template(list0,list1,Dx,Dy);Offset=0;}void CMyView::OnLapBorddetec(){// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT PP;BYTE **list1,**list0;ImageCopy(&m_Image1,&m_Image);list1=(BYTE **)Create2DList(&m_Image);list0=(BYTE **)Create2DList(&m_Image1);GetImageParament(&m_Image,&PP);Laplacian(list0,list1,PP.nWidth,PP.nHeight);ImageCopy(&m_Image,&m_Image1);CString str2;str2.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str2 + " - " +"laplacian变换");Invalidate();}void WINAPI LoG(BYTE **list0,BYTE **list1,int Dx,int Dy){ // 高斯型拉普拉斯算法int mask[25]={ 0, 0,-1, 0, 0,0,-1,-2,-1, 0,-1,-2,16,-2,-1,0,-1,-2,-1, 0,0, 0,-1, 0, 0};Scale=1; Offset=254;memcpy(Mask5,mask,25*sizeof(int));TemplateB(list0,list1,Dx,Dy,5);Offset=0;}void CMyView::OnLogBorddetec(){// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT PP;BYTE **list1,**list0;ImageCopy(&m_Image1,&m_Image);list1=(BYTE **)Create2DList(&m_Image);list0=(BYTE **)Create2DList(&m_Image1);GetImageParament(&m_Image,&PP);LoG(list0,list1,PP.nWidth,PP.nHeight);ImageCopy(&m_Image,&m_Image1);CString str2;str2.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str2 + " - " +"log变换");Invalidate();}int MaxMin(double *tab,int flag){double max,min;int i,p,q;max=min=tab[128];p=q=128;for (i=0;i<256;i++) {if (tab[i]>max) {max=tab[i];p=i;}if (tab[i]<min) {min=tab[i];q=i;}}if (flag==1) {for (i=0;i<256;i++)tab[i]=120*(max-tab[i])/(max-min);}else {for (i=0;i<256;i++)tab[i]=120*(tab[i]-min)/(max-min);p=q;}return(p);}void Release2DList(BYTE** list){free(list);}void SetAllPalette(CImage *pImg, RGBQUAD *ColorTab){struct IMAGEPARAMENT P;GetImageParament(pImg,&P);pImg->SetColorTable(0, P.nNumColors, ColorTab);}void SetPalette(CImage *pImg,int n,int r,int g,int b){RGBQUAD ColorTab;ColorTab.rgbBlue = b;ColorTab.rgbGreen = g;ColorTab.rgbRed = r;pImg->SetColorTable(n, 1, &ColorTab);}int WINAPI Otsu(long *pg) // 大津法取阈值{int i,j,p;double m0,m1,M0,M1,u,v,w[256];M0=M1=0;for (i=0;i<256;i++) {M0+=pg[i]; M1+=pg[i]*i;}for (j=0;j<256;j++) {m0=m1=0;for (i=0;i<=j;i++) {m0+=pg[i]; m1+=pg[i]*i;}if (m0) u=m1/m0;else u=0;if (M0-m0) v=(M1-m1)/(M0-m0);else v=0;w[j]=m0*(M0-m0)*(u-v)*(u-v);}p=MaxMin(w,1);return(p);}long pg[256];void Threshold(CImage *pImgm,double ff){struct IMAGEPARAMENT P;BYTE **list,*lpBuf;RGBQUAD ColorTab[256];int x,y,thre;//int t;//int tab[256],buf[20],bn;GetImageParament(pImgm,&P);list=(BYTE**) Create2DList(pImgm);//histog(list,pg,0,0,P.nWidth,P.nHeight);thre=Otsu(pg);for (y=0;y<P.nHeight;y++) {lpBuf=(BYTE*) pImgm->GetPixelAddress(0,y);for (x=0;x<P.nWidth;x++,lpBuf++) {if (*lpBuf>=thre) *lpBuf=1;else *lpBuf=0;}}memset(ColorTab,0,1024);SetAllPalette(pImgm,ColorTab);SetPalette(pImgm,1,255,255,255);Release2DList(list);}void CMyView::OnOtsuThreshold()//二值化响应函数{// TODO: 在此添加命令处理程序代码Threshold(&m_Image,0);CString str2;str2.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str2 + " - " +"OTSU法二值化");Invalidate();}int InImage(CImage *pImg,int x,int y){struct IMAGEPARAMENT P;GetImageParament(pImg,&P);if ((x<0)||(y<0)||(x>=P.nWidth)||(y>=P.nHeight)) return 0;else return 1;}DWORD GetPixelValue(CImage *pImg,int x,int y){struct IMAGEPARAMENT P;BYTE *lp;DWORD dd=0;GetImageParament(pImg,&P);if ((P.nBitCount<8)||(!InImage(pImg,x,y))) return 0;lp = (BYTE*) pImg->GetPixelAddress(x,y);memcpy(&dd,lp,P.nBytesPerPixel);return(dd);}void SetPixelValue(CImage *pImg,int x,int y,DWORD c){struct IMAGEPARAMENT P;BYTE *lp;GetImageParament(pImg,&P);if ((P.nBitCount<8)||(!InImage(pImg,x,y))) return;lp = (BYTE*) pImg->GetPixelAddress(x,y);memcpy(lp,&c,P.nBytesPerPixel);}void CMyView::OnCatchNumberonce()//白字法{// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT P4,P5;int a[300];GetImageParament(&m_Image,&P4);int i,D,Dmin=3,T=0,T1=0,Tmin=5, Numbery=0,Numberx=0;ImageCopy(&NumberOnce,&m_Image);for (int y=P4.nHeight-5;y>=0;y--){ i=0;for (int x=0;x<P4.nWidth;x++){if (GetPixelValue(&m_Image,x,y)==1)a[i++]=x;//取该行白点存数组a}for(int j=1;j<i;j++){D=a[j]-a[j-1];if(D>=Dmin&&D<=4*Dmin) T++;if(D>4*Dmin) T=0;//判断为字符间距if(T==Tmin){T1++;while(T1==3){Numbery=y;Numberx=a[j-Tmin];//free(a);break;}}}if(Numbery!=0)break;}ImageCopy(&m_Image,&NumberOnce);GetImageParament(&m_Image,&P5);for ( int y=0;y<P5.nHeight;y++){for ( int x=0;x<P5.nWidth;x++){ //if(x==Numberx||y==Numbery) SetPixelValue(&m_Image,x,y,1);//调试专用//elseif(x>0&&x<115+Numberx&&y<Numbery+5&&y>Numbery-15);else//if (GetPixelValue(&m_Image,x,y)==1)SetPixelValue(&m_Image,x,y,0);}}CString str4;str4.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str4+ " - " +"车牌粗定位");Invalidate();}void CMyView::OnCatchBnumber()//黑字法{// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT P4,P5;int a[300];GetImageParament(&m_Image,&P4);int i,D,Dmin=3,T=0,T1=0,Tmin=7,Numbery=0,Numberx=0;ImageCopy(&NumberOnce,&m_Image);for (int y=P4.nHeight-5;y>=0;y--){ i=0;for (int x=0;x<P4.nWidth;x++){if (GetPixelValue(&m_Image,x,y)==0)a[i++]=x;//取该行黑点存数组a}for(int j=1;j<i;j++){D=a[j]-a[j-1];if(D>=Dmin&&D<=4*Dmin) T++;if(D>4*Dmin) T=0;//判断为字符间距if(T==Tmin){T1++;while(T1==3){Numbery=y;Numberx=a[j-Tmin];//free(a);break;}}}if(Numbery!=0)break;}ImageCopy(&m_Image,&NumberOnce);GetImageParament(&m_Image,&P5);for ( int y=0;y<P5.nHeight;y++){for ( int x=0;x<P5.nWidth;x++){ //if(x==Numberx||y==Numbery) SetPixelValue(&m_Image,x,y,0);//调试专用// elseif(x>0&&x<115+Numberx&&y<Numbery+5&&y>Numbery-15);else//if (GetPixelValue(&m_Image,x,y)==1)SetPixelValue(&m_Image,x,y,0);}}CString str4;str4.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str4+ " - " +"车牌粗定位");Invalidate();}int x1,x2,y1,y2;void CMyView::OnGetCarnumber()//精定位{// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT P6,P7;int T=0,k=0,tabmin=3,Tmin=2,Dimin=3,Di;int tab[800];int b[800];GetImageParament(&m_Image,&P6);ImageCopy(&NumberOnce,&m_Image);for (int i=0;i<P6.nWidth ;i++) //统计每列像素数据{tab[i]=0;for(int j=0;j<P6.nHeight ;j++){if(GetPixelValue(&m_Image,i,j)==1)//统计白点数存tab[i]tab[i]++;}}for (int i=0;i<P6.nWidth ;i++)//生成等差数列b[i]{ if(tab[i]>=tabmin) T++;if(tab[i]<tabmin) T=0;b[i]=T;}int tmax1[50];int Numberx1=0,Numberx2=0;for (int i=1;i<P6.nWidth ;i++)//求b[i]局部最大值bmax1[50]对应下标tmax1【50】{if(b[i]>=Tmin&&b[i+1]==0){tmax1[k++]=i-b[i];}}int c=0,cmin=2;for(int i=0;i<k-1;i++)//精确定位左位置Numberx1{ Di=tmax1[i+1]-tmax1[i];if(Di>=Dimin&&Di<=8*Dimin)c++;elsec=0;while(c==cmin){Numberx1=tmax1[i+1-cmin];break;}int tmax2[50];k=0;for (int i=P6.nWidth-1;i>0 ;i--)//求b[i]局部最大值bmax2[50]对应下标tmax2【50】{if(b[i-1]>=Tmin&&b[i]==0){tmax2[k++]=i;}}c=0;for(int i=0;i<k-1;i++)//精确定位右位置Numberx2{ Di=tmax2[i]-tmax2[i+1];if(Di>=Dimin&&Di<=8*Dimin)c++;elsec=0;while(c==5){Numberx2=tmax2[i+1-5];break;}}if(Numberx2-Numberx1<100)Numberx2=Numberx1+120;x1=Numberx1;x2=Numberx2;ImageCopy(&m_Image,&NumberOnce);GetImageParament(&m_Image,&P7);for ( int y=0;y<P7.nHeight;y++){for ( int x=0;x<P7.nWidth;x++){ if(x>Numberx1&&x<Numberx2);//else SetPixelValue(&m_Image,x,y,0);}}CString str4;str4.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str4+ " - " +"车牌水平方向精定位Invalidate();}void CMyView::OnGetHcarnumber()//竖直方向定位{// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT P6,P7;int T=0,tabmin=14,Tmin=3,Numbery1=0,Numbery2=0;int tab[300];GetImageParament(&m_Image,&P6);ImageCopy(&NumberOnce,&m_Image);for (int i=0;i<P6.nHeight;i++) //统计每行像素数据{tab[i]=0;for(int j=0;j<P6.nWidth ;j++){if(GetPixelValue(&m_Image,j,i)==1)//统计白点数存tab[i]tab[i]++;}}for (int i=0;i<P6.nHeight;i++){ if(tab[i]>tabmin)T++;else T=0;if(T==Tmin){Numbery1=i-Tmin;break;}}T=0;for (int i=P6.nHeight-1;i>0;i--){ if(tab[i]>tabmin)T++;else T=0;if(T==Tmin){Numbery2=i+Tmin;break;}}if(Numbery2-Numbery1<10)y1=Numbery1;y2=Numbery2;ImageCopy(&m_Image,&NumberOnce);GetImageParament(&m_Image,&P7);for ( int y=0;y<P7.nHeight;y++){for ( int x=0;x<P7.nWidth;x++){ if(y>Numbery1&&y<Numbery2);//// else if((x1<=x&&x2>=x)&&(y==y1||y==y2))SetPixelValue(&m_Image,x,y,1);else SetPixelValue(&m_Image,x,y,0);}}CString str4;str4.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str4+ " - " +"车牌竖直方向精定位");Invalidate();}void CMyView::OnAddAll()//定位算法综合{// TODO: 在此添加命令处理程序代码CMyView::OnColorCray();CMyView::OnLapBorddetec();CMyView::OnOtsuThreshold();//二值化响应函数CMyView::OnCatchNumberonce();//白字法CMyView::OnGetCarnumber();//精定位CMyView::OnGetHcarnumber();//竖直方向定位}int N7[7];int N0=0,N1=10,N2=20,N3=30,N4=40,N5=50,N6=60;void CMyView::OnNumberCut(){// TODO: 在此添加命令处理程序代码struct IMAGEPARAMENT P6,P7;int T=0,k=0,tabmin=1,Tmin=3;int tab[800];GetImageParament(&m_Image,&P6);ImageCopy(&NumberOnce,&m_Image);for (int i=0;i<P6.nWidth ;i++) //统计每列像素数据{tab[i]=0;for(int j=0;j<P6.nHeight ;j++){if(GetPixelValue(&m_Image,i,j)==1)//统计白点数存tab[i]tab[i]++;}}for (int i=0;i<P6.nWidth ;i++)//生成等差数列b[i]{ if(tab[i]>=tabmin) T++;if(tab[i]<tabmin) T=0;b[i]=T;}for (int i=1;i<P6.nWidth ;i++)//精确定位左位置N0{if(b[i]>=Tmin&&b[i+1]==0){N0=i-b[i];break;}}for (int i=N0+15;i<P6.nWidth ;i++)//精确定位左位置N1{if(b[i]>=Tmin&&b[i+1]==0){N1=i-b[i];break;}}for (int i=N1+15;i<P6.nWidth ;i++)//精确定位左位置N2{if(b[i]>=Tmin&&b[i+1]==0){N2=i-b[i];break;}}for (int i=N2+15;i<P6.nWidth ;i++)//精确定位左位置N3{if(b[i]>=Tmin&&b[i+1]==0){N3=i-b[i];break;}}{if(b[i]>=Tmin&&b[i+1]==0){N4=i-b[i];break;}}for (int i=N4+15;i<P6.nWidth ;i++)//精确定位左位置N5{if(b[i]>=Tmin&&b[i+1]==0){N5=i-b[i];break;}}for (int i=N5+15;i<P6.nWidth ;i++)//精确定位左位置N6{if(b[i]>=Tmin&&b[i+1]==0){N6=i-b[i];x2=N6+12;break;}}N7[0]=N0;N7[1]=N1;N7[2]=N2;N7[3]=N3;N7[4]=N4;N7[5]=N5;N7[6]=N6;for(int j=3;j<7;j++){if(N7[j]-N7[j-1]>15)N7[j]=N7[j-1]+15;}ImageCopy(&m_Image,&NumberOnce);GetImageParament(&m_Image,&P7);for ( int y=0;y<P7.nHeight;y++){for ( int x=0;x<P7.nWidth;x++){if((y>=y1&&y<=y2)&&(x==N7[0]||x==N7[1]||x==N7[2]||x==N7[3]||x==N7[ 4]||x==N7[5]||x==N7[6]||x==N7[6]+13))SetPixelValue(&m_Image,x,y,1);if((x1<=x&&x2+1>=x)&&(y==y1||y==y2))SetPixelValue(&m_Image,x,y,1);}}CString str4;str4.LoadString(AFX_IDS_APP_TITLE);AfxGetMainWnd()->SetWindowText(str4+ " - " +"字符分割");Invalidate();}double FN[4];int p,pmax;//数字相似度int p1;//汉字相似度int p2;//字母相似度double P[10]={};//数字识别器double P1[31]={};//汉字识别器double P2[24]={};//字母识别器const double JING[4]={};//部分汉字编码京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼const double JINTJ[4]={};const double HU[4]={10,13,12,1};const double YUCHQ[4]={};const double JIHB[4]={};const double YUHN[4]={};const double YUN[4]={};const double LIAO[4]={};const double HEI[4]={};const double XIANG[4]={};const double WAN[4]={};const double LUSD[4]={};const double XIN[4]={};const double SU[4]={13,9,7,9};//SU[4]={14,14,10,10}const double ZHE[4]={};const double GUIGX[4]={};const double GANGS[4]={};const double JINSHX[4]={};const double MENG[4]={};const double SHAN[4]={};const double JIJL[4]={};const double MIN[4]={};const double GUIGZH[4]={};const double YUE[4]={};const double QING[4]={};const double ZANG[4]={};const double CHUAN[4]={};const double NING[4]={};const double QIONG[4]={};const double AA[4]={7,2,13,12};//部分字母编码const double BB[4]={};const double CC[4]={16,11,10,11};const double DD[4]={12,10,15,12};const double EE[4]={18,13,11,11};const double FF[4]={18,11,9,0};const double GG[4]={};const double HH[4]={12,16,7,7};const double JJ[4]={};const double KK[4]={16,7,8,9};const double LL[4]={12,2,12,11};const double MM[4]={14,11,10,9};const double NN[4]={};const double PP[4]={};const double QQ[4]={};const double RR[4]={};const double SS[4]={};const double TT[4]={};const double UU[4]={};const double VV[4]={};const double YY[4]={};const double ZZ[4]={};const double LI[4]={12,11,10,12};//0~9编码const double YI[4]={6,2,6,2};const double ER[4]={11,17,12,10};const double SA[4]={8,17,7,11};const double SI[4]={4,15,17,19};const double WU[4]={9,14,15,14};const double LU[4]={9,9,10,11};const double QI[4]={5,14,4,5};const double BA[4]={14,14,14,14};const double JU[4]={17,13,9,10};int N;void CMyView::OnHanziStudy()//汉字识别共用{struct IMAGEPARAMENT P7;GetImageParament(&m_Image,&P7);//ImageCopy(&NumberOnce,&m_Image);for ( int y=0;y<P7.nHeight;y++){for ( int x=0;x<P7.nWidth;x++){if((y>=y1&&y<=y2)&&(x==N7[0]||x==N7[1]||x==N7[2]||x==N7[3]||x==N7[ 4]||x==N7[5]||x==N7[6]||x==N7[6]+13))SetPixelValue(&m_Image,x,y,0);if((x1<=x&&x2+1>=x)&&(y==y1||y==y2))SetPixelValue(&m_Image,x,y,0);}}//ImageCopy(&m_Image,&NumberOnce);int i=0,k;//int su[4];//double p=0;CClientDC dc(this);HBRUSH hBrush;HPEN hPen;hPen=(HPEN) GetStockObject(WHITE_PEN); hBrush=(HBRUSH) GetStockObject(WHITE_BRUSH);dc.SelectObject(hPen);dc.SelectObject(hBrush);dc.SetTextColor(RGB(0,0,0));CString str;for(int x=N+1;x<=N+6;x++)for (int y=y1+1;y<=y1+6;y++){k=GetPixelValue(&m_Image,x,y);FN[i]=FN[i]+k;}i++;for(int x=N+7;x<=N+12;x++)for (int y=y1+1;y<=y1+6;y++){k=GetPixelValue(&m_Image,x,y);FN[i]=FN[i]+k;}i++;for(int x=N+1;x<=N+6;x++)for (int y=y1+7;y<=y1+12;y++){k=GetPixelValue(&m_Image,x,y);FN[i]=FN[i]+k;}i++;for(int x=N+7;x<=N+12;x++)for (int y=y1+7;y<=y1+12;y++){k=GetPixelValue(&m_Image,x,y);FN[i]=FN[i]+k;}for(i=0;i<4;i++){str.Format ("%g",FN[i]);dc.TextOut (30*i+15,50,str,2);//FN[i]=0;}for(i=0;i<4;i++){if(FN[i]<=JING[i]) P1[0]=P1[0]+(FN[i]+1)/(JING[i]+1);else P1[0]=P1[0]+(JING[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=JINTJ[i]) P1[1]=P1[1]+(FN[i]+1)/(JINTJ[i]+1);else P1[1]=P1[1]+(JINTJ[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=HU[i]) P1[2]=P1[2]+(FN[i]+1)/(HU[i]+1);else P1[2]=P1[2]+(HU[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=YUCHQ[i]) P1[3]=P1[3]+(FN[i]+1)/(YUCHQ[i]+1);else P1[3]=P1[3]+(YUCHQ[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=JIHB[i]) P1[4]=P1[4]+(FN[i]+1)/(JIHB[i]+1);else P1[4]=P1[4]+(JIHB[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=YUHN[i]) P1[5]=P1[5]+(FN[i]+1)/(YUHN[i]+1);else P1[5]=P1[5]+(YUHN[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=YUN[i]) P1[6]=P1[6]+(FN[i]+1)/(YUN[i]+1);else P1[6]=P1[6]+(YUN[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=LIAO[i]) P1[7]=P1[7]+(FN[i]+1)/(LIAO[i]+1);else P1[7]=P1[7]+(LIAO[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=HEI[i]) P1[8]=P1[8]+(FN[i]+1)/(HEI[i]+1);else P1[8]=P1[8]+(HEI[i]+1)/(FN[i]+1);}for(i=0;i<4;i++){if(FN[i]<=XIANG[i]) P1[9]=P1[9]+(FN[i]+1)/(XIANG[i]+1);else P1[9]=P1[9]+(XIANG[i]+1)/(FN[i]+1);。
图源网络1 概述语音识别技术,也称自动语音识别Automatic SpeechRecognition(ASR),是以语音为研究对象,通过语音信号处理和模式识别让机器自动识别和理解人类口述的语言,从而把语音信号转变为相应的文本或命令,是实现人机交互的重要桥梁。
语音识别包括两个步骤:训练和识别。
训练是指对收集到的海量语音数据集通过信号处理和知识挖掘获取“声学模型”和“语言模型”过程。
识别则是通过进行端点检测、降噪、特征提取,利用训练好的“声学模型”和“语言模型”对用户说话的特征向量进行统计模式识别,也称为解码过程,从而得到语音中包含的文字信息。
基于SpeechBrain 的语音识别在语音问答中的应用探索李丹1,2(1桂林师范高等专科学校,广西 桂林 541199;2桂林信息科技学院,广西 桂林 541004)作者简介:李丹,硕士,高级实验师,研究方向为计算机应用技术。
基金项目:2019年度广西高校中青年教师科研基础能力提升项目(2019KY1032)。
语音识别技术方案大多都是以语音为基础的,包括发音模型,声学模型和语言模型等。
语音识别模型历经三个阶段,从最初的基于GMM-HMM 的模型,发展到基于DNN-HMM 深度神经网络模型,再到现在的端到端语音识别模型。
常见的端对端模型有CTC、RNN-T、atttention-based encoder-decoder、LAS 等模型。
语音识别技术的发展,是人工智能改变大众生活的重要一环,其识别率越来越高,应用领域也越来越广泛。
文章基于SpeechBrain 语音识别在语音问答中的应用进行探索,取得一定效果。
2 SpeechBrain 语音识别简介开发者常用的语音工具主要有K a l d i 、E S P N e t 、C M U S p h i n x 、HTK 等,它们各有各的不足之处。
比如Kaldi 依赖大量的脚本语言,其核心算法是用 C++ 编写的,当需要改变各种神经网络结构时,开发者往往调试起来非常困难和复杂。
HMM的理论基础一、 HMM定义1.N:模型中状态的数目,记t时刻Markov链所处的状态为2.M:每个状态对应的可能的观察数目,记t时刻观察到的观察值为3.:初始状态概率矢量,,,4.A:状态转移概率矩阵,,,5.B:观察值概率矩阵(适用于离散HMM),,,;对于连续分布的HMM,记t时刻的观察值概率为一个离散型的HMM模型可以简约的记为。
二、关于语音识别的HMM的三个基本问题1. 已知观察序列和模型参数,如何有效的计算。
a. 直接计算2-1当N=5,T=100时大概需进行次乘法!b. 前向算法定义t时刻的前向变量(forward variable),可以通过迭代的方法来计算各个时刻的前向变量:1)初始化(Initialization)当t=1时2-22)递归(Induction)当时即:2-33)终结(Termination)2-4乘法次数大约为:N2Tc. 后向算法定义t时刻的后向变量(backward variable),可以通过迭代的方法来计算各个时刻的后向变量:1)初始化(Initialization)当t=T时,2-52)递归(Induction)当时即:,2-63)终结(Termination)2-7乘法计算次数约为:N2T2. 已知观察序列和模型参数,在最佳意义上确定一个状态序列。
定义一个后验概率变量(posteriori probability variable)2-7则最优序列可以通过,2-7求得。
不过,这样求得的最优序列有些问题。
如果,那么这个最优序列本身就不存在。
这里讨论的最佳意义上的最优序列,是使最大化时的确定的状态序列。
即,使最大化时确定的状态序列。
定义为t时刻沿一条路径,且,输出观察序列的最大概率,即:2-8下面介绍迭代计算的Viterbi算法:1)初始化(Initialization),回溯变量:,2)递归(Induction)即:2-82-93)终结(Termination)2-102-11 4)回溯状态序列,2-12 3. 已知观察序列和模型参数,如何调整模型参数使最大。
桂林电子科技大学毕业设计论文 编号:
毕业设计说明书 题 目: 基于HTK的命令 字识别系统 学 院: 专 业: 学生姓名: 学 号: 指导教师: 职 称: 讲师
题目类型: 理论研究 实验研究 工程设计 工程技术研究 软件开发 年 月 日 桂林电子科技大学毕业设计论文 摘 要 语音识别技术经过半个世纪的发展,目前已日趋成熟,其在语音拨号系统、数字遥控、工业控制等领域都有了广泛的应用。语音识别技术就是让机器听懂人类的语音并执行相关的动作,是一个研究的热点。数字语音识别是语音识别一个极其重要的分支,其在现实生活中的应用愈加广泛。 由于目前常用的声学模型和语言模型的局限性,计算机只能识别一些词汇或一些句子。语音识别系统在语种改变时,往往会出现错误的识别结果。针对上述问题,结合隐马尔可夫模型原理,在HTK语音处理工具箱的基础上构建了中英文特定词语音识别系统。该系统通过代码控制整个构建过程,使其在更换新的训练数据和词典后能快速生成对应的识别模型。 HTK 是英国剑桥大学开发的一套基于C 语言的语音处理工具箱,广泛应用于语音识别、语音合成、字符识别和DNA 排序等领域。从HTK 的基本原理和软件结构出发,设计了一个基于HTK 的数字语音识别系统,并验证了其识别效率。本文基于隐马尔可夫模型(HMM)的连续语音训练和识别算法理论,结合梅尔频率倒谱系数(MFCC)提取技术,单音素HMM建模技术,基于上下文相关的三音素HMM建模技术以及基于维特比算法的识别技术等一系列技术,利用隐马尔可夫模型工具箱(HTK)构建了基于HTK的连续语音识别实验平台。随后,通过更换识别单元,更改特征参数的维数和增加高斯混合分量的个数来考虑不同因素对系统性能的影响。最后,通过比较试验,验证了识别单元、高斯混合分量的数目以及MFCC 维数的适当组合可提高系统的正确识别率。实验结果表明,随着HMM从单音素建模到三音素建模的转换,测试语句在语句级和字词级的识别率都呈增加的趋势,捆绑三音素后识别率达到稳定状态。
关键词:语音识别;隐马尔可夫模型;隐马尔科夫工具箱;梅尔频率倒谱系数;识别单元 桂林电子科技大学毕业设计论文 Abstract Having developed about 50 years, the speech recognition (SR) technique has a wide range of applications inmany fields, such as voice dialing system, digital remote control and industrial control. Speech is an important tool for people to communicate with machines. Digital speech recognition is an extremely important branch of speech recognition. Its application in real lifeis used more and more widely. But the limitation of acoustic and language model is that the computer can only recognize some words or sentences. When the speech language changes,the system often gets wrong results. To address the problem above, the speech recognition system has been built on the basis of HTK as well as hidden markov model theory. Controlling the building process by code, the system can quickly generate a new recognition model when the training data and dictionary has changed. HTK is a C language-based toolkit developed by CUED mainly used for speech signalreorganization, speech synthesis, character reorganization, DNA compositor and so on. From HTK’s general principlesand software architecture, this paper designs a digital speech recognition system based on HTK, and verifies itsrecognition efficiency.A continuous speech recognition experimental platform was built based on HTK(HMM Toolkid) using HMM(Hidden Markov Model)theory and a series of technologies such as MFCC (Mel-Frequency Cepstral Coefficients),mono-phone model,tri-phone model and Viterbi algorithm.Then by changing the identification unit and MFCC dimension, and by increasing the number of gaussian mixture components, it considers effects of different factors on the performance of the system. Finally, through the comparing test, it verifies the right combination of the identification unit and the number of gaussian mixture components, and also proves that MFCC dimension can enhance the system’s correct rate. Experiential results showed that as the HMM changed from mono-phone model to tri-phone mode,the recognition accuracy of statement-level and word-level were both increased,and reached a higher level after Tied-State Tri-phone model was employed.
Key words: speech recognition; HMM;HTK; MFCC; identification unit 桂林电子科技大学毕业设计论文 目 录
引言············································································· 1 语音识别介绍·······························································5 1.1 语音识别系统概···························································5 1.2语音识别研究的现实意义················································5
1.3 语音识别技术的研究现状··············································· 2 HTK简介···························································5 2.1 HTK原理·······················································6 2.2 HTK的应用·····················································6 2.3 HTKLib 和 HTKTools···································6 2.4 HTK安装·························································6 3 设计内容与设计指标················································· 3.1 系统设计内容··················································7 3.2 系统整体构造框图·························································7 4 系统搭建思路和具体步骤··················································7 4.1 搭建前的准备工作··········································8
4.1.1 录音文件··············································7
4.1.2 手动生成文件··············································7 4.1.3 自动生成文件··············································7 4.2 数据准备······················································8 4.2.1 建立任务语法grammar···································8 4.2.2 建立字典文件······················································9 4.3 创建单音素HMM模型··················································10 4.3.1 创建音素水平副本文件··········································11