⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dec_project_3.cc

📁 这是处理语音信号的程序
💻 CC
字号:
// file: dec_project_3.cc// // isip include files//#include "decoder.h"#include "decoder_constants.h" // method: next_models_cc//// arguments://  Trace* trace: (input) the trace to project to next model//  // return: a logical_1 indicating status//// this method generates the next model index and projects traces to// the entry state of the next model, for model end traces as well as// word boundaries//logical_1 Decoder::next_models_cc(Trace* trace_a) {  // dummy variables  //  Lex_tree* start_tree = (Lex_tree*)NULL;  Lex_node* hdptr = (Lex_node*)NULL;  Lex_node* lexch = (Lex_node*)NULL;  Lex_node* str_lex = (Lex_node*)NULL;  Word* word = (Word*)NULL;  logical_1 flag = ISIP_FALSE;    // phone parameters  //  int_4* phn = new int_4[cd_size_d];  for (int_4 i = 0; i < cd_size_d; i++) {    phn[i] = LXN_NULL_PHONE;  }  int_4 phtmp = LXN_NULL_PHONE;    // the current instance  //  Instance* inst = trace_a->get_inst_cc();    // the current lexical node  //  Lex_node* curr_lex = inst->get_lex_node_cc();  logical_1 lextype = curr_lex->get_type_cc();    // history-related parameters  //  History* hist = trace_a->get_hist_cc();  void_p hist_word = hist->get_histwords_cc((int_4)0);  // the current phone  //  int_4 curr_phn = inst->get_phone_ind_cc();  int_4 mid_phn = cd_models_d[curr_phn]->get_num_phones_cc() / (int_4)2;    // set the first phone of the triphone  //  if (context_mode_d == DEC_CROSS_WORD_MODE) {    phn[0] = cd_models_d[curr_phn]->get_phone_cc(mid_phn);  }  // if this is lattice mode get the lattice node and the lexical tree  //  if ((function_mode_d == DEC_LATTICE_RESCORE_FUNCTION) ||      (function_mode_d == DEC_LATTICE_VERIFY_FUNCTION) ||      (function_mode_d == DEC_LATTICE_LATTICE_FUNCTION) ||      (function_mode_d == DEC_FORCE_ALIGN_FUNCTION)) {        // get the current word    //    Lattice_node* curr_lat = (Lattice_node*)hist_word;    word = curr_lat->get_word_cc();        // get the tree and the start lex node    //    start_tree = curr_lat->get_lex_tree_cc();    if (start_tree == (Lex_tree*)NULL) {	        start_tree = new Lex_tree(curr_lat);      curr_lat->set_lex_tree_cc(start_tree);      lextree_list_d->insert_cc(start_tree);    }    hdptr = start_tree->get_head_cc();  }    // otherwise this is ngram mode, set the lexical tree  //  else if ((function_mode_d == DEC_NGRAM_DECODE_FUNCTION) ||	   (function_mode_d == DEC_LATTICE_GENERATE_FUNCTION)) {    // if this is a dynamic network LM    //    if (lextype == LXN_WORDGRAPH) {            // get the current word      //      Lattice_node* curr_lat = (Lattice_node*)hist_word;      word = curr_lat->get_word_cc();            // get the tree and the start lex node      //      start_tree = curr_lat->get_lex_tree_cc();      if (start_tree == (Lex_tree*)NULL) {	  	start_tree = new Lex_tree(curr_lat);	curr_lat->set_lex_tree_cc(start_tree);	lextree_list_d->insert_cc(start_tree);      }      hdptr = start_tree->get_head_cc();    }    // otherwise it is an ngram node in the lex node    //    else if (lextype == LXN_NGRAM) {            // if there is a history word, then the full tree needs to be used      //      if (hist_word != (void_p)NULL) {		// set the tree and the start lex node	//	start_tree = proto_tree_d;	hdptr = start_tree->get_head_cc();		// if this is a sentence end word no need to grow further	//	Ngram_node* ngnode = (Ngram_node*)hist_word;	word = ngnode->get_word_cc();	if (word->get_index_cc() == DEC_SENT_END_WORD) {	  hdptr = (Lex_node*)NULL;	}      }      // otherwise use the sentence start tree      //      else {	start_tree = (Lex_tree*)(lextree_list_d->get_head_cc()->get_item_cc());	hdptr = start_tree->get_head_cc();      }    } // end else if ngram word node  } // end if ngram decoding modes    // check if this is end of the current word i.e. start of a new word  //  if (trace_a->get_level_cc() == DEC_WORD_LEVEL) {        // make sure this tree is valid (end of sentence will have an    // invalid tree)    //    if (hdptr == (Lex_node*)NULL) {      // free memory      //      delete [] phn;      phn = (int_4*)NULL;      // update ref counts      //      trace_a->decr_ref_cc();      // return gracefully      //      return ISIP_TRUE;    }    // if this is cross-word mode    //    if (context_mode_d == DEC_CROSS_WORD_MODE) {      // if the current word does not end in sil or sp      //      if (mid_phn > (int_4)0) {		// set the middle phone of the triphone	//	phn[1] = cd_models_d[curr_phn]->get_phone_cc(mid_phn + (int_4)1);		// find the lexical node in the tree that contains this	// monophone	//	//	str_lex = hdptr->get_node_cc(phn[1]);	str_lex = trace_a->get_lex_next_cc();	if (str_lex == (Lex_node*)NULL) {	  str_lex = hdptr->get_node_cc(phn[1]);	}		// check if this requires an LM change	//	if (str_lex->get_type_cc() != lextype) {	  switch_lm_cc(trace_a, curr_lex);	}	// otherwise grow phones	//	else {	  	  // get the list of next phones from the current lexical tree	  //	  Link_list* lex_list = str_lex->get_child_cc();	  for (Link_node* nlx = lex_list->get_head_cc();	       nlx != (Link_node*)NULL; nlx = nlx->get_next_cc()) {	    	    // get the child lexical node	    //	    lexch = (Lex_node*)(nlx->get_item_cc());	    	    // complete the triphone with the last phone	    //	    phn[2] = lexch->get_phone_cc();	    	    // grow triphones and project traces	    //	    grow_models_cc(trace_a, lexch, phn);	    	  } // end loop over all phones	} // end else grow phones      } // end if it it cross word mode and word not ending in silence            // otherwise the word ended in sil or sp      //      else {		// get the list of all possible next phones	//	Link_list* start_list = hdptr->get_child_cc();	// check if need to switch LM	//	if (start_list == (Link_list*)NULL) {	  switch_lm_cc(trace_a, hdptr);	}	// otherwise grow phones	//	else {	  	  // loop over all next phones	  //	  for (Link_node* stx = start_list->get_head_cc();	       stx != (Link_node*)NULL; stx = stx->get_next_cc()) {	    	    // get the child lexical node	    //	    str_lex = (Lex_node*)(stx->get_item_cc());	    phtmp = str_lex->get_phone_cc();	    	    // set the middle phone of the triphone	    //	    phn[1] = phtmp;	    	    // check if this is a no-pronunciation-word end, if so check	    // if need to switch LM	    //	    if (phtmp == LXN_STOP_PHONE) {	      	      // make entry in the new LM, grow phones and project traces	      //	      switch_lm_cc(trace_a, str_lex);	    }	  	    // otherwise grow phones as normal	    //	    else {	      	      // get the list of next phones from the current lexical tree	      //	      Link_list* lex_list = str_lex->get_child_cc();	      for (Link_node* nlx = lex_list->get_head_cc();		   nlx != (Link_node*)NULL; nlx = nlx->get_next_cc()) {				// get the child lexical node		//		lexch = (Lex_node*)(nlx->get_item_cc());				// complete the triphone with the last phone		//		phn[2] = lexch->get_phone_cc();				// grow triphones and project traces		//		grow_models_cc(trace_a, lexch, phn);			      } // end loop over all phones	    } // end else grow phones	  } // end loop over all start phones	} // end else grow phones      } // end else need to loop over all start phones    } // if this is cross-word mode    // otherwise this is word-internal or monophone context    //    else {            // get the list of all possible next phones      //      Link_list* start_list = hdptr->get_child_cc();      // check if this is list is null, if so check if need to switch      // LM      //      if (start_list == (Link_list*)NULL) {	switch_lm_cc(trace_a, hdptr);      }      // otherwise grow phones      //      else {		// loop over all next phones	//	for (Link_node* stx = start_list->get_head_cc();	     stx != (Link_node*)NULL; stx = stx->get_next_cc()) {	  	  // get the child lexical node and the phone there	  //	  str_lex = (Lex_node*)(stx->get_item_cc());	  phtmp = str_lex->get_phone_cc();	  	  // check if this is a no-pronunciation-word end, if so check	  // if need to switch LM	  //	  if (phtmp == LXN_STOP_PHONE) {	    	    // make entry in the new LM, grow phones and project traces	    //	    switch_lm_cc(trace_a, str_lex);	  }	  	  // otherwise if this is word-internal mode, get the next	  // phone(s)	  //	  else if (context_mode_d == DEC_WORD_INTERNAL_MODE) {	    	    // set the middle phone of the triphone	    //	    phn[1] = phtmp;	    	    // get the list of next phones from the current lexical tree	    //	    Link_list* lex_list = str_lex->get_child_cc();	    for (Link_node* nlx = lex_list->get_head_cc();		 nlx != (Link_node*)NULL; nlx = nlx->get_next_cc()) {	      	      // get the child lexical node	      //	      lexch = (Lex_node*)(nlx->get_item_cc());	      	      // complete the triphone with the last phone	      //	      phn[2] = lexch->get_phone_cc();	      	      // grow triphones and project traces	      //	      grow_models_cc(trace_a, lexch, phn);	      	    } // end loop over all phones	  } // end if word-internal mode	  	  // otherwise it is monophone mode, so this is the next phone	  //	  else {	    	    // set the phone index	    //	    phn[0] = phtmp;	    	    // get the word end flag	    //	    flag = str_lex->get_word_end_cc();	    	    // if possible word end loop over all next nodes	    //	  	    if (flag == ISIP_TRUE) {	      	      // get the list of next phones from the current lexical	      // tree	      //	      Link_list* lex_list = str_lex->get_child_cc();	      for (Link_node* nlx = lex_list->get_head_cc();		   nlx != (Link_node*)NULL; nlx = nlx->get_next_cc()) {				// get the new lex node		//		lexch = (Lex_node*)(nlx->get_item_cc());				// if this is a word end node		//		if (lexch->get_phone_cc() == LXN_STOP_PHONE) {		  		  // grow phone and project traces		  //		  grow_models_cc(trace_a, lexch, phn);		}	      }	    } // if this is a sil or sp monophonic word	    	    // if not word end process as normal	    //	    else {	      grow_models_cc(trace_a, str_lex, phn);	    }	  } // end else monophone mode	} // end loop over all start phones      } // end else grow phones    } // end else this is word-internal or monophone mode  } // end if start of new word    // otherwise the input trace is phone-level i.e. the next phone  // belongs to the same word  //  else if (curr_lex != (Lex_node*)NULL) {    // if this is not monophone mode, need to grow context    //    if (context_mode_d != DEC_MONO_PHONE_MODE) {            // set the first and middle phone of the triphone      //      phn[0] = cd_models_d[curr_phn]->get_phone_cc(mid_phn);      phn[1] = curr_lex->get_phone_cc();            // if this is not a word-end phone then grow word-internal phones      //      if (phn[1] != LXN_STOP_PHONE) {		// get the list of next phones from the current lexical tree	//	Link_list* lex_list = curr_lex->get_child_cc();	for (Link_node* nlx = lex_list->get_head_cc();	     nlx != (Link_node*)NULL; nlx = nlx->get_next_cc()) {	  	  // get the child lexical node	  //	  lexch = (Lex_node*)(nlx->get_item_cc());	  	  // complete the triphone with the last phone	  //	  phn[2] = lexch->get_phone_cc();	  	  // grow triphones and project traces	  //	  grow_models_cc(trace_a, lexch, phn);	}      } // end if not word end grow word-internal phones            // otherwise need to create the sp phone if this is cross-word      //      else if ((context_mode_d == DEC_CROSS_WORD_MODE) && (mid_phn > 0)) {		// create the sp phone	//	phn[1] = DEC_SP_PHONE;	phn[2] = LXN_STOP_PHONE;		// project traces	//	grow_models_cc(trace_a, curr_lex, phn);      }    } // end if not monophone mode    // otherwise for monophone mode simply grow the next phone    //    else {      // check the current lex node      //      phn[0] = curr_lex->get_phone_cc();      // make sure it is not an end of word phone      //      if (phn[0] != LXN_STOP_PHONE) {		// get the list of next phones from the current lexical tree	//	Link_list* lex_list = curr_lex->get_child_cc();	for (Link_node* nlx = lex_list->get_head_cc();	     nlx != (Link_node*)NULL; nlx = nlx->get_next_cc()) {	  	  // get the child lexical node	  //	  lexch = (Lex_node*)(nlx->get_item_cc());	  	  // get the word end flag	  //	  flag = lexch->get_word_end_cc();	  // complete the triphone with the last phone          //          phn[0] = lexch->get_phone_cc();	  // if possible word end loop over all next nodes	  //	  	  if (flag == ISIP_TRUE) {	    	    // get the list of next phones from the current lexical	    // tree	    //	    Link_list* nlex_list = lexch->get_child_cc();	    for (Link_node* nlx = nlex_list->get_head_cc();		 nlx != (Link_node*)NULL; nlx = nlx->get_next_cc()) {	      	      // get the new lex node	      //	      str_lex = (Lex_node*)(nlx->get_item_cc());	      // if this is a word end node	      //	      if (str_lex->get_phone_cc() == LXN_STOP_PHONE) {				// grow phone and project traces		//		grow_models_cc(trace_a, str_lex, phn);	      }	    }	  } // end if word end	  	  // otherwise grow phones as usual	  //	  else {	    grow_models_cc(trace_a, lexch, phn);	  }	} // end for all next lex nodes      } // if not end of word    } // end else monophone mode        } // end else the next phone is in the same word    // free memory  //  delete [] phn;  phn = (int_4*)NULL;    // exit gracefully  //  return ISIP_TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -