语音识别的大规模汉语树形词典,搜索速度快如闪电

Posted 尹成

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了语音识别的大规模汉语树形词典,搜索速度快如闪电相关的知识,希望对你有一定的参考价值。

  1.  #include "stdafx.h"    
  2. #include "YuyinTree.h"    
  3. #include "YuyinTreeDlg.h"    
  4.    
  5. #ifdef _DEBUG    
  6. #define new DEBUG_NEW    
  7. #undef THIS_FILE    
  8. static char THIS_FILE[] = __FILE__;   
  9. #endif    
  10.    
  11.   
  12. // CAboutDlg dialog used for App About    
  13. CStoredPinyin* m_storedPinyin[30000];   
  14. CWordTree* curTree=new CWordTree;      //指向词语树指针    
  15. CString MaxLenghci='/'';                  //存储该单词包括的最大子词    
  16. CString Tempci;                       //临时词    
  17. int StoredNum=0;       //已存入查询数组中拼音个数    
  18. class CAboutDlg : public CDialog   
  19.    
  20. public:   
  21.     CAboutDlg();   
  22.    
  23. // Dialog Data    
  24.     //AFX_DATA(CAboutDlg)    
  25.     enum  IDD = IDD_ABOUTBOX ;   
  26.     //AFX_DATA    
  27.    
  28.     // ClassWizard generated virtual function overrides    
  29.     //AFX_VIRTUAL(CAboutDlg)    
  30.     protected:   
  31.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support    
  32.     //AFX_VIRTUAL    
  33.    
  34. // Implementation    
  35. protected:   
  36.     //AFX_MSG(CAboutDlg)    
  37.     //AFX_MSG    
  38.     DECLARE_MESSAGE_MAP()   
  39. ;   
  40.    
  41. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)   
  42.    
  43.     //AFX_DATA_INIT(CAboutDlg)    
  44.     //AFX_DATA_INIT    
  45.    
  46.    
  47. void CAboutDlg::DoDataExchange(CDataExchange* pDX)   
  48.    
  49.     CDialog::DoDataExchange(pDX);   
  50.     //AFX_DATA_MAP(CAboutDlg)    
  51.     //AFX_DATA_MAP    
  52.    
  53.    
  54. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)   
  55.     //AFX_MSG_MAP(CAboutDlg)    
  56.         // No message handlers    
  57.     //AFX_MSG_MAP    
  58. END_MESSAGE_MAP()   
  59.    
  60.   
  61. // CYuyinTreeDlg dialog    
  62.    
  63. CYuyinTreeDlg::CYuyinTreeDlg(CWnd* pParent /*=NULL*/)   
  64.     : CDialog(CYuyinTreeDlg::IDD, pParent)   
  65.    
  66.     //AFX_DATA_INIT(CYuyinTreeDlg)    
  67.     m_inputTongyin = _T("");   
  68.     //AFX_DATA_INIT    
  69.     // Note that LoadIcon does not require a subsequent DestroyIcon in Win32    
  70.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);   
  71.    
  72.    
  73. void CYuyinTreeDlg::DoDataExchange(CDataExchange* pDX)   
  74.    
  75.     CDialog::DoDataExchange(pDX);   
  76.     //AFX_DATA_MAP(CYuyinTreeDlg)    
  77.     DDX_Text(pDX, IDC_PINYIN_EQUAL, m_inputTongyin);   
  78.     //AFX_DATA_MAP    
  79.    
  80.    
  81. BEGIN_MESSAGE_MAP(CYuyinTreeDlg, CDialog)   
  82.     //AFX_MSG_MAP(CYuyinTreeDlg)    
  83.     ON_WM_SYSCOMMAND()   
  84.     ON_WM_PAINT()   
  85.     ON_WM_QUERYDRAGICON()   
  86.     ON_BN_CLICKED(IDC_BTN_READFILE, OnBtnReadfile)   
  87.     ON_BN_CLICKED(IDC_BTN_TEST_PANDCHI, OnBtnTestPandchi)   
  88.     ON_BN_CLICKED(IDC_BTN_TEST_TONGYINCI, OnBtnTestTongyinci)   
  89.     ON_BN_CLICKED(IDC_YUYIN_QUERY, OnTongyinQuery)   
  90.     ON_NOTIFY(TVN_SELCHANGED, IDC_YUYIN_TREE, OnSelchangedYuyinTree)   
  91.     //AFX_MSG_MAP    
  92. END_MESSAGE_MAP()   
  93.    
  94.   
  95. // CYuyinTreeDlg message handlers    
  96.    
  97. BOOL CYuyinTreeDlg::OnInitDialog()   
  98.    
  99.     CDialog::OnInitDialog();   
  100.    
  101.     // Add "About..." menu item to system menu.    
  102.    
  103.     // IDM_ABOUTBOX must be in the system command range.    
  104.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);   
  105.     ASSERT(IDM_ABOUTBOX < 0xF000);   
  106.    
  107.     CMenu* pSysMenu = GetSystemMenu(FALSE);   
  108.     if (pSysMenu != NULL)   
  109.        
  110.         CString strAboutMenu;   
  111.         strAboutMenu.LoadString(IDS_ABOUTBOX);   
  112.         if (!strAboutMenu.IsEmpty())   
  113.            
  114.             pSysMenu->AppendMenu(MF_SEPARATOR);   
  115.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   
  116.            
  117.        
  118.    
  119.     // Set the icon for this dialog.  The framework does this automatically    
  120.     //  when the application's main window is not a dialog    
  121.     SetIcon(m_hIcon, TRUE);         // Set big icon    
  122.     SetIcon(m_hIcon, FALSE);        // Set small icon    
  123.        
  124.     // TODO: Add extra initialization here    
  125.        
  126.     //程序添加的代码:    
  127.     //初始化已读单词数组    
  128.     for(int i=0;i<30000;i++)   
  129.        
  130.         m_storedPinyin[i]=NULL;   
  131.        
  132.     FILE *InputFile=NULL;   //读取文件指针    
  133.     CTreeNode* CurNode=NULL;  //当前节点    
  134.     CTreeNode* FatherNode=NULL; //当前节点的父节点    
  135.     TCHAR NodeItem[100];   //节点的全部数据     
  136.     TCHAR NodePinyin[51];  //节点的拼音    
  137.     TCHAR NodeHanzi[50];   //节点汉字    
  138.     int ZiMuNum,j,k;   
  139.     int WordNum=0;         //统计词的数目    
  140.     BOOL IsFirst=TRUE;      //标志是否是根节点的第一个孩子节点    
  141.     CTreeNode* TempfatherNode=NULL;             //临时父节点    
  142.     CTreeNode* TempfatherNode1=NULL;             //临时父节点    
  143.     InputFile=fopen("LexiconTree.txt","r");   
  144.    
  145.     while(!feof(InputFile))   
  146.        
  147.         WordNum++;   
  148.         fscanf(InputFile,"%s",NodeItem);   
  149.         ZiMuNum=0;        //ZiMuNum为读取字母个数    
  150.         while(NodeItem[ZiMuNum]!=',')//读取汉字    
  151.            
  152.             NodeHanzi[ZiMuNum]=NodeItem[ZiMuNum];   
  153.             ZiMuNum++;   
  154.            
  155.         NodeHanzi[ZiMuNum]='/0';// 此时NodeHanzi存储了汉字    
  156.         ZiMuNum++;   
  157.            
  158.            
  159.         while(NodeItem[ZiMuNum]!=',')//读取词号    
  160.            
  161.             ZiMuNum++;   
  162.            
  163.         ZiMuNum++;   
  164.         j=ZiMuNum;   
  165.         k=0;   
  166.         while(NodeItem[j]!='/0')  //读拼音    
  167.            
  168.             NodePinyin[k]=NodeItem[j];   
  169.             k++;   
  170.             j++;   
  171.            
  172.         NodePinyin[k-1]='/0'//此时NodePinyin存储了拼音    
  173.         CString TempString;  //暂时存储拼音    
  174.         TempString=NodePinyin;   
  175.            
  176.         CurNode=new CTreeNode;   
  177.         CurNode->m_Pinyin=TempString;   
  178.         CurNode->m_Word=NodeHanzi;   
  179.         CurNode->m_pParent=NULL;   
  180.         CurNode->m_pchild=NULL;   
  181.         CurNode->m_pneighbour=NULL;   
  182.         CurNode->m_pchar=NULL;   
  183.         CurNode->m_CurNum=0;   
  184.         BOOL Fviewed=FALSE;     //是否查到的标志,默认为没查到    
  185.         BOOL FParent=FALSE;     //接点是否有父节点的标志,如a,;a,ba,;a,ba,hao,    
  186.         BOOL FEqual=FALSE;       //相同发音词标志,如a,啊,阿,呵    
  187.         for(int temp=0;temp<30000;temp++) //temp为迭代次数,先检查看看是否已经插入了词    
  188.            
  189.             if(m_storedPinyin[temp]!=NULL)       //看当前查看的数据项是否有值,若有进入循环,否则跳过    
  190.                
  191.                 int t=-1;   
  192.                 t=TempString.Find(m_storedPinyin[temp]->m_StoredPinyin);       //find 的意思是找到整个匹配串    
  193.                 if(t>=0)         //若有重叠项,进入语句,插数据项    
  194.                    
  195.                        
  196.                     if(TempString==m_storedPinyin[temp]->m_StoredPinyin)  //若两者拼音完全相同,把汉字插入树节点项的相似字数组中    
  197.                        
  198.                         Fviewed=TRUE;       //查到    
  199.                         FEqual=TRUE;        //相同词标记TRUE    
  200.                         int TempCurNum=(m_storedPinyin[temp]->m_pcurPosition)->m_CurNum;   
  201.                           
  202.                         CTongyinci* temp1=new CTongyinci;   
  203.                         temp1->next=NULL;   
  204.                         temp1->m_data=new char[50];   
  205.                         strcpy(temp1->m_data,NodeHanzi);   
  206.                            
  207.                         CTongyinci* temp2=(m_storedPinyin[temp]->m_pcurPosition)->m_pchar;   
  208.                         CTongyinci* pre;   
  209.                         while(temp2!=NULL)   
  210.                            
  211.                             pre=temp2;   
  212.                             temp2=temp2->next;   
  213.                            
  214.                         pre->next=temp1;   
  215.        
  216.                         (m_storedPinyin[temp]->m_pcurPosition)->m_CurNum=(m_storedPinyin[temp]->m_pcurPosition)->m_CurNum+1;   
  217.                         break;   
  218.                        
  219.                     else if(t==0)         //否则,插入树节点项的子节点中,必需保证从第一个字对齐并且在待检查接点中重叠部分后一位为",",检查    
  220.                                          //比如a和an不能是父子节点关系;la和a不能是父子节点关系    
  221.                            
  222.                            
  223.                         Tempci=m_storedPinyin[temp]->m_StoredPinyin;   
  224.                         int Strsize=Tempci.GetLength();     //问题    
  225.    
  226.                         if(TempString.GetAt(Strsize)==',')   //若满足重叠部分后一位为","    
  227.                            
  228.                             FParent=TRUE;         //有父亲节点    
  229.                             if(Strsize>=MaxLenghci.GetLength())   
  230.                                
  231.                                MaxLenghci=Tempci;           //注意    
  232.                                TempfatherNode1=m_storedPinyin[temp]->m_pcurPosition;  //注意    
  233.                                
  234.                                
  235.                         Fviewed=TRUE;       //查到    
  236.                            
  237.                            
  238.                        
  239.                        
  240.                    
  241.                
  242.             else     
  243.                 continue;   
  244.            
  245.         if(FParent&&!FEqual)   
  246.            
  247.                        CurNode->m_CurNum++;                                      //当前同音字数加1    
  248.        
  249. /*                      char** pTempChar=new char*[50];                                   //开辟一个而维数组,临时值向同音字的指针  
  250.                         for(int l=0;l<50;l++)  
  251.                           
  252.                             pTempChar[l]=new char[50];  
  253.                             pTempChar[l][0]='/0';  
  254.                           
  255.                         */   
  256.                         CTongyinci* temp=new CTongyinci;   
  257.                         temp->next=NULL;   
  258.    
  259.                         temp->m_data=new char[50];   
  260.                         strcpy(temp->m_data,NodeHanzi);   
  261.                         CurNode->m_pchar=temp;   
  262.                            
  263.                         curTree->InsertNode(&CurNode,&TempfatherNode1);   //在查到的节点处插入子节点    
  264.    
  265.                         CStoredPinyin* TempStorPinyin1=new CStoredPinyin;                      //创建临时待查询对象    
  266.                           
  267.                         TempStorPinyin1->m_pcurPosition=CurNode;   
  268.                         TempStorPinyin1->m_StoredPinyin=TempString;   
  269.                         TempStorPinyin1->m_pchar=temp;   
  270.                         m_storedPinyin[StoredNum++]=TempStorPinyin1;     //将产生节点存放已访问数组中    
  271.            
  272.         MaxLenghci='/0';        //恢复用到的两个变量到初值    
  273.         TempfatherNode1=NULL;   
  274.    
  275.         if(!Fviewed)        //如果在已存词表中找不到该词则在根节点插入新词,并存放在已访问数组中    
  276.            
  277.                
  278.                
  279.             if(IsFirst==TRUE)   
  280.                
  281.               TempfatherNode=curTree->m_Root;                    
  282.                  
  283.    
  284.             CurNode->m_CurNum++;                                      //当前同音字数加1    
  285.    
  286.                
  287.                
  288. /*          char** pTempChar=new char*[50];                                   //开辟一个而维数组,临时值向同音字的指针,存100个词  
  289.             for(int l=0;l<50;l++)  
  290.               
  291.                 pTempChar[l]=new char[10];  
  292.                 pTempChar[l][0]='/0';  
  293.               
  294.               
  295.   
  296.             CurNode->m_pchar=pTempChar;  
  297.             strcpy(CurNode->m_pchar[0],NodeHanzi);*/   
  298.             CTongyinci* temp=new CTongyinci;   
  299.             temp->next=NULL;   
  300.             temp->m_data=new char[50];   
  301.             strcpy(temp->m_data,NodeHanzi);   
  302.             CurNode->m_pchar=temp;   
  303.                
  304.             TempfatherNode=curTree->InsertFirstNode(&CurNode,&TempfatherNode);   //在根节点插入新词    
  305.             IsFirst=FALSE;                                                       //以后插入的点全不是第一个节点    
  306.    
  307.             CStoredPinyin* TempStorPinyin;  //创建临时待查询对象    
  308.             TempStorPinyin=new CStoredPinyin;   
  309.                
  310.             TempStorPinyin->m_pcurPosition=CurNode;   
  311.             TempStorPinyin->m_StoredPinyin=NodePinyin;   
  312.             TempStorPinyin->m_pchar=temp;   
  313.                
  314.             //排错flag   pass 10月21号    
  315.             m_storedPinyin[StoredNum]=TempStorPinyin;     //将产生节点存放已访问数组中    
  316.             StoredNum++;   
  317.            
  318.              
  319.        
  320.     char buffer[50];   
  321.     sprintf(buffer,"已读取单词: %d",WordNum);   
  322.        
  323.         AfxMessageBox(buffer);   
  324.         BrowseYuyin();   
  325.    
  326.     return TRUE;  // return TRUE  unless you set the focus to a control    
  327.    
  328.    
  329. void CYuyinTreeDlg::OnSysCommand(UINT nID, LPARAM lParam)   
  330.    
  331.     if ((nID & 0xFFF0) == IDM_ABOUTBOX)   
  332.        
  333.         CAboutDlg dlgAbout;   
  334.         dlgAbout.DoModal();   
  335.        
  336.     else   
  337.        
  338.         CDialog::OnSysCommand(nID, lParam);   
  339.        
  340.    
  341.    
  342. // If you add a minimize button to your dialog, you will need the code below    
  343. //  to draw the icon.  For MFC applications using the document/view model,    
  344. //  this is automatically done for you by the framework.    
  345.    
  346. void CYuyinTreeDlg::OnPaint()    
  347.    
  348.     if (IsIconic())   
  349.        
  350.         CPaintDC dc(this); // device context for painting    
  351.    
  352.         SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);   
  353.    
  354.         // Center icon in client rectangle    
  355.         int cxIcon = GetSystemMetrics(SM_CXICON);   
  356.         int cyIcon = GetSystemMetrics(SM_CYICON);   
  357.         CRect rect;   
  358.         GetClientRect(&rect);   
  359.         int x = (rect.Width() - cxIcon + 1) / 2;   
  360.         int y = (rect.Height() - cyIcon + 1) / 2;   
  361.    
  362.         // Draw the icon    
  363.         dc.DrawIcon(x, y, m_hIcon);   
  364.        
  365.     else   
  366.        
  367.         CDialog::OnPaint();   
  368.        
  369.    
  370.    
  371. // The system calls this to obtain the cursor to display while the user drags    
  372. //  the minimized window.    
  373. HCURSOR CYuyinTreeDlg::OnQueryDragIcon()   
  374.    
  375.     return (HCURSOR) m_hIcon;   
  376.    
  377.    
  378.    
  379. // 添加的主要代码    
  380. void CYuyinTreeDlg::OnBtnReadfile()          //测试树第一层节点    
  381.    
  382.      //检验第一层节点插入是否正确,结果正确    
  383.      CTreeNode* root=curTree->m_Root;   
  384.      CTreeNode* Temp=root->m_pchild;   
  385.      while(Temp!=NULL)   
  386.         
  387.        AfxMessageBox(Temp->m_Pinyin);   
  388.        Temp=Temp->m_pneighbour;   
  389.         
  390.    
  391.    
  392.    
  393.    
  394. CWordTree::CWordTree()   //树的初始化    
  395.    
  396.     m_Root=new CTreeNode;   
  397.     m_Root->m_Pinyin="";   
  398.     m_Root->m_pParent=NULL;   
  399.     m_Root->m_pchild=NULL;   
  400.     m_Root->m_pneighbour=NULL;   
  401.     m_Root->m_CurNum=0;   
  402.     m_Root->m_Word="";   
  403.     m_Root->m_pchar=NULL;   
  404.    
  405.    
  406. void CWordTree::CreateTree()   
  407.    
  408.        
  409.    
  410. CTreeNode* CWordTree::InsertFirstNode(CTreeNode** newNode,CTreeNode** parent)       //插入第一层节点    
  411.    
  412.        
  413.     CTreeNode* WilladNode=*newNode;   
  414.     CTreeNode* FatherNode=*parent;   
  415.     if(FatherNode==curTree->m_Root)   
  416.        
  417.         FatherNode->m_pchild=WilladNode;   
  418.         WilladNode->m_pParent=curTree->m_Root;   
  419.        
  420.     else   
  421.        
  422.         FatherNode->m_pneighbour=WilladNode;   
  423.         WilladNode->m_pParent=curTree->m_Root;   
  424.        
  425.        
  426.     return WilladNode;   
  427.    
  428. void CWordTree::InsertNode(CTreeNode** newNode,CTreeNode** parent)       //插入某层节点的孩子节点    
  429.    
  430.        
  431.     CTreeNode* WilladNode=*newNode;   
  432.     CTreeNode* FatherNode=*parent;   
  433.     CTreeNode*  Temp=NULL;   
  434.        
  435.     if(FatherNode->m_pchild==NULL)   
  436.        
  437.       FatherNode->m_pchild=WilladNode;   
  438.       WilladNode->m_pParent=FatherNode;   
  439.        
  440.     else   
  441.        
  442.         Temp=FatherNode->m_pchild;   
  443.         while(Temp->m_pneighbour!=NULL)   
  444.            
  445.             Temp=Temp->m_pneighbour;   
  446.            
  447.         Temp->m_pneighbour=WilladNode;   
  448.         WilladNode->m_pParent=FatherNode;   
  449.        
  450.    
  451.    
  452.    
  453. void CYuyinTreeDlg::OnBtnTestPandchi()         //测试树的相邻层接点    
  454.    
  455.         CTreeNode* root=curTree->m_Root;   
  456.         CTreeNode* Temp=root->m_pchild;   
  457.         AfxMessageBox(Temp->m_Pinyin);   
  458.         Temp=Temp->m_pchild;   
  459.         while(Temp!=NULL)   
  460.            
  461.             AfxMessageBox(Temp->m_Pinyin);   
  462.             Temp=Temp->m_pneighbour;   
  463.            
  464.       
  465.    
  466. void CYuyinTreeDlg::OnBtnTestTongyinci()  //测试发音为'a'的同音词    
  467.    
  468.     CTreeNode* NodeA=curTree->m_Root->m_pchild;   
  469.   CTongyinci* temp=NodeA->m_pchar;      
  470.   while(temp!=NULL)   
  471.      
  472.       AfxMessageBox(temp->m_data);   
  473.       temp=temp->next;   
  474.      
  475.    
  476.    
  477. void CYuyinTreeDlg::BrowseYuyin()    //遍历4层语音树    
  478.    
  479.     CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_YUYIN_TREE);   
  480.     ASSERT(pCtrl != NULL);   
  481.    
  482.     TVINSERTSTRUCT tvInsert;   
  483.     tvInsert.hParent = NULL;   
  484.     tvInsert.hInsertAfter = NULL;   
  485.     tvInsert.item.mask = TVIF_TEXT;   
  486.     tvInsert.item.pszText = _T("词拼音");   
  487.    
  488.     HTREEITEM hRoot = pCtrl->InsertItem(&tvInsert);   
  489.    
  490.      CTreeNode* root=curTree->m_Root;   
  491.      CTreeNode* Temp=root->m_pchild;   
  492.    
  493.      HTREEITEM hPA=NULL;   
  494.      HTREEITEM hPB=NULL;   
  495.      HTREEITEM hPC=NULL;   
  496.      while(Temp!=NULL)   
  497.         
  498.        hPA=pCtrl->InsertItem(TVIF_TEXT,   
  499.        _T(Temp->m_Pinyin), 0, 0, 0, 0, 0, hRoot, NULL);   
  500.        CTreeNode* TempNode1=Temp->m_pchild;   
  501.        while(TempNode1!=NULL)   
  502.           
  503.         hPB=pCtrl->InsertItem(TVIF_TEXT,   
  504.          _T(TempNode1->m_Pinyin), 0, 0, 0, 0, 0, hPA, NULL);   
  505.         CTreeNode* TempNode2=TempNode1->m_pchild;   
  506.         while(TempNode2!=NULL)   
  507.            
  508.             hPC=pCtrl->InsertItem(TVIF_TEXT,   
  509.             _T(TempNode2->m_Pinyin), 0, 0, 0, 0, 0, hPB, NULL);   
  510.             CTreeNode* TempNode3=TempNode2->m_pchild;   
  511.             while(TempNode3!=NULL)   
  512.                
  513.             pCtrl->InsertItem(TVIF_TEXT,   
  514.             _T(TempNode3->m_Pinyin), 0, 0, 0, 0, 0, hPC, NULL);   
  515.             TempNode3=TempNode3->m_pneighbour;   
  516.                
  517.             TempNode2=TempNode2->m_pneighbour;   
  518.            
  519.         TempNode1=TempNode1->m_pneighbour;   
  520.           
  521.        Temp=Temp->m_pneighbour;   
  522.         
  523.    
  524.    
  525.    
  526. void CYuyinTreeDlg::OnTongyinQuery() //查询拼音的同音字,放入Combox中    
  527.    
  528.     // TODO: Add your control notification handler code here    
  529.        
  530.     UpdateData(TRUE);   
  531.     CString StringWilqury=m_inputTongyin;   
  532.     CString Tempci;   
  533.     BOOL FExit=FALSE;     //该拼音在树中是否存在标志    
  534.     int TempNum;   
  535.     CComboBox* tongyinc=(CComboBox*)GetDlgItem(IDC_PINYIN_RESULT);   
  536.     ASSERT(tongyinc != NULL);   
  537.     tongyinc->ResetContent();   
  538.    ASSERT(tongyinc->GetCount() == 0);   
  539.    
  540.    
  541.     for(int temp=0;temp<30000;temp++)   
  542.        
  543.         if(m_storedPinyin[temp]!=NULL&&m_storedPinyin[temp]->m_StoredPinyin==StringWilqury)   
  544.            
  545.             TempNum=m_storedPinyin[temp]->m_pcurPosition->m_CurNum;   
  546.                
  547.     //      for(int i=0;i<TEMPNUM;I++) Tempci="m_storedPinyin[temp]-" >m_pcurPosition->m_pchar[i];    
  548.                    
  549.     //          
  550.             CTongyinci* temp1=m_storedPinyin[temp]->m_pcurPosition->m_pchar;     
  551.             while(temp1!=NULL)   
  552.                
  553.             Tempci=temp1->m_data;   
  554.             temp1=temp1->next;   
  555.             tongyinc->AddString(Tempci);   
  556.                
  557.    
  558.    
  559.             tongyinc->SetWindowText(m_storedPinyin[temp]->m_pcurPosition->m_pchar->m_data);   
  560.             FExit=TRUE;   
  561.            
  562.        
  563.     if(!FExit)   
  564.         tongyinc->SetWindowText("该拼音在树中不存在!");   
  565.        
  566.    
  567.    
  568.    
  569.    
  570. void CYuyinTreeDlg::OnSelchangedYuyinTree(NMHDR* pNMHDR, LRESULT* pResult) //当单击鼠标时响应函数    
  571.    
  572.     NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;   
  573.     // TODO: Add your control notification handler code here    
  574.        
  575.     TV_ITEM item=pNMTreeView->itemNew;   
  576.     HTREEITEM hItem=item.hItem;   
  577.     CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_YUYIN_TREE);   
  578.     ASSERT(pCtrl != NULL);   
  579.     CString Tempci=pCtrl->GetItemText(hItem);   
  580.     if(Tempci=="词拼音")   
  581.         return;   
  582.        
  583.    
  584.     BOOL FExit=FALSE;     //该拼音在树中是否存在标志    
  585.     int TempNum;   
  586.     CComboBox* tongyinc=(CComboBox*)GetDlgItem(IDC_PINYIN_RESULT);   
  587.     ASSERT(tongyinc != NULL);   
  588.     tongyinc->ResetContent();   
  589.     ASSERT(tongyinc->GetCount() == 0);   
  590.    
  591.    
  592.     for(int temp=0;temp<30000;temp++)   
  593.        
  594.         if(m_storedPinyin[temp]!=NULL&&m_storedPinyin[temp]->m_StoredPinyin==Tempci)   
  595.            
  596.             TempNum=m_storedPinyin[temp]->m_pcurPosition->m_CurNum;   
  597. /*          for(int i=0;i<TEMPNUM;I++) Tempci="m_storedPinyin[temp]-" >m_pcurPosition->m_pchar[i];  
  598.                 tongyinc->AddString(Tempci);  
  599.               
  600. */   
  601.             CTongyinci* temp1=m_storedPinyin[temp]->m_pcurPosition->m_pchar;     
  602.             while(temp1!=NULL)   
  603.                
  604.             Tempci=temp1->m_data;   
  605.             temp1=temp1->next;   
  606.             tongyinc->AddString(Tempci);   
  607.                
  608.    
  609.             tongyinc->SetWindowText(m_storedPinyin[temp]->m_pcurPosition->m_pchar->m_data);   
  610.             FExit=TRUE;   
  611.            
  612.        
  613.     if(!FExit)   
  614.         tongyinc->SetWindowText("该拼音在树中不存在!");   
  615.     *pResult = 0;   
  616.    

以上是关于语音识别的大规模汉语树形词典,搜索速度快如闪电的主要内容,如果未能解决你的问题,请参考以下文章

12-11锦上添花Flutter AI只能语音搜索功能实现

01 介绍

求助,语音识别的软件,口述录音能够识别转化成文字的

如何解释语音识别的技术原理?

关于语音识别的 Android 附加功能不起作用

语音云识别的原理