voice_info::voice_info(const std::string& data_path,language_list& languages): gender("gender",RHVoice_voice_gender_unknown), enabled("enabled",true), preferred("preferred",false), country("country") { gender.define("male",RHVoice_voice_gender_male); gender.define("female",RHVoice_voice_gender_female); set_data_path(data_path); string_property name("name"); enum_string_property language_name("language"); for(language_list::const_iterator it(languages.begin());it!=languages.end();++it) { language_name.define(it->get_name()); } config cfg; cfg.register_setting(name); cfg.register_setting(language_name); cfg.register_setting(country); cfg.register_setting(sample_rate); cfg.register_setting(gender); cfg.load(path::join(data_path,"voice.info")); if(!name.is_set()) throw file_format_error("Voice name is not set"); set_name(name); if(!language_name.is_set()) throw file_format_error("Voice language is not set"); language_list::iterator lang=languages.find(language_name); voice_language=lang; settings.default_to(voice_language->voice_settings); }
dtree::internal_node::internal_node(std::istream& in,unsigned int qtype): feature_name(read_string(in)) { unsigned int vtype=read_number(in); switch(qtype) { case condition_equal: switch(vtype) { case value_string: question.reset(new str_equal(read_string(in))); break; case value_number: question.reset(new num_equal(read_number(in))); break; default: throw file_format_error(err_msg); } break; case condition_less: if(vtype!=value_number) throw file_format_error(err_msg); question.reset(new less(read_number(in))); break; case condition_grater: if(vtype!=value_number) throw file_format_error(err_msg); question.reset(new grater(read_number(in))); break; case condition_in: if(vtype!=value_list) throw file_format_error(err_msg); question.reset(new in_list(in)); break; default: throw file_format_error(err_msg); } unsigned int next_type=read_number(in); if(next_type==0) yes_node.reset(new leaf_node(in)); else yes_node.reset(new internal_node(in,next_type)); next_type=read_number(in); if(next_type==0) no_node.reset(new leaf_node(in)); else no_node.reset(new internal_node(in,next_type)); }
dtree::in_list::in_list(std::istream& in) { unsigned int size=read_number(in); if(size==0) throw file_format_error(err_msg); tests.reserve(size); for(unsigned int i=0;i<size;++i) { switch(read_number(in)) { case value_string: tests.push_back(smart_ptr<condition>(new str_equal(read_string(in)))); break; case value_number: tests.push_back(smart_ptr<condition>(new num_equal(read_number(in)))); break; default: throw file_format_error(err_msg); } } }
lts::state::state(std::istream& in): letter_index(0), letter('\0'), yes_transition(0), no_transition(0) { if(!io::read_integer(in,letter_index)) throw file_format_error(err_msg); if(letter_index==0) { for(uint8_t i=0;i<4;++i) { if(!io::read_integer(in,phone_ids[i])) throw file_format_error(err_msg); } } else { if(!(io::read_integer(in,letter)&& io::read_integer(in,yes_transition)&& io::read_integer(in,no_transition))) throw file_format_error(err_msg); } }
dtree::leaf_node::leaf_node(std::istream& in) { unsigned int type=read_number(in); switch(type) { case value_string: answer=read_string(in); break; case value_number: answer=read_number(in); break; default: throw file_format_error(err_msg); } }
lts::lts(const std::string& file_path): context_window_size(0) { std::ifstream f_in; io::open_ifstream(f_in,file_path,true); if(!io::read_integer(f_in,context_window_size)) throw file_format_error(err_msg); uint8_t num_phones; if(!io::read_integer(f_in,num_phones)) throw file_format_error(err_msg); phones.reserve(num_phones); std::string phone; for(uint8_t i=0;i<num_phones;++i) { if(!io::read_string(f_in,phone)) throw file_format_error(err_msg); phones.push_back(phone); } uint8_t num_models; if(!io::read_integer(f_in,num_models)) throw file_format_error(err_msg); for(uint8_t i=0;i<num_models;++i) { uint32_t letter='\0'; if(!io::read_integer(f_in,letter)) throw file_format_error(err_msg); uint16_t num_states=0; if(!io::read_integer(f_in,num_states)) throw file_format_error(err_msg); model& m=rules[letter]; if(!m.empty()) throw file_format_error(err_msg); m.reserve(num_states); for(uint16_t j=0;j<num_states;++j) { m.push_back(state(f_in)); } } }