| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "ctm_inputparser.h" |
|
|
| Logger* CTMInputParser::logger = Logger::getLogger(); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| SpeechSet* CTMInputParser::loadFile(const string& name) |
| { |
| string line; |
| ifstream file; |
| file.open(name.c_str(), ifstream::in); |
| |
| if (! file.is_open()) |
| { |
| LOG_FATAL(logger, "Error opening CTM file " + name); |
| exit (E_LOAD); |
| } |
| |
| SpeechSet* res = new SpeechSet(name); |
| Speech* speech = new Speech(res); |
| char f_file[BUFFER_SIZE]; |
| char channel[BUFFER_SIZE]; |
| char start[BUFFER_SIZE]; |
| char dur[BUFFER_SIZE]; |
| char conf[BUFFER_SIZE]; |
| int start_ms, dur_ms; |
| char text[BUFFER_SIZE]; |
| Token* prec_tok = NULL; |
| bool isFirstToken = true; |
| unsigned long int line_nb = 1; |
| bool use_confidence = true; |
| |
| |
| Token* prec_alt_tok = NULL; |
| Segment* alt_seg = NULL; |
| Segment* prec_alt_seg = NULL; |
| bool isAltBegin = false; |
| bool isInsideAlt = false; |
| bool isAlt = false; |
| bool isAltEnd = false; |
| |
| while (getline(file,line,'\n')) |
| { |
| if(line.find_first_of(";;") != 0) |
| |
| { |
| int nbArgParsed = 0; |
| nbArgParsed = sscanf(line.c_str(), "%s %s %s %s %s %s", (char*) &f_file, (char*) &channel, (char*) &start, (char*) &dur, (char*) &text, (char*) &conf); |
| |
| if (nbArgParsed < 5) |
| { |
| char temp_start[BUFFER_SIZE]; |
| char temp_dur[BUFFER_SIZE]; |
| nbArgParsed = sscanf(line.c_str(), "%s %s %s %s %s %s", (char*) &f_file, (char*) &channel, (char*) &temp_start, (char*) &temp_dur, (char*) &text, (char*) &conf); |
| |
| if (nbArgParsed < 5) |
| { |
| char buffer[BUFFER_SIZE]; |
| sprintf(buffer, "Error parsing the line %li in file %s", line_nb, name.c_str()); |
| LOG_ERR(logger, buffer); |
| } |
| } |
| |
| start_ms = ParseString(string(start)); |
| dur_ms = ParseString(string(dur)); |
| |
| |
| |
| |
| if (nbArgParsed == 5) |
| { |
| use_confidence = false; |
| } |
| else if (nbArgParsed == 6) |
| { |
| use_confidence = true; |
| } |
| |
| |
| |
| |
| |
| |
| |
| if (string(text).compare("<ALT_BEGIN>") == 0) |
| { |
| isAltBegin = true; |
| isInsideAlt = true; |
| } |
| else if (string(text).compare("<ALT_END>") == 0) |
| { |
| isAltEnd = true; |
| isInsideAlt = false; |
| } |
| else if (string(text).compare("<ALT>") == 0) |
| { |
| isAlt = true; |
| } |
| else |
| { |
| if (isAltBegin) |
| { |
| Segment* new_seg = Segment::CreateWithDuration(start_ms, dur_ms, speech); |
| new_seg->SetSource(string(f_file)); |
| new_seg->SetChannel(string(channel)); |
| |
| Token* tok = BuildToken(start_ms, dur_ms, string(text), new_seg); |
| |
| if (!isFirstToken) |
| { |
| if (isAltEnd) |
| { |
| alt_seg->AddLastToken(prec_alt_tok); |
| |
| for (size_t i=0 ; i < alt_seg->GetNumberOfLastToken() ; ++i) |
| { |
| alt_seg->GetLastToken(i)->AddNextToken(tok); |
| tok->AddPrecToken(alt_seg->GetLastToken(i)); |
| } |
| |
| isAltEnd = false; |
| } |
| else |
| { |
| prec_tok->AddNextToken(tok); |
| tok->AddPrecToken(prec_tok); |
| } |
| } |
| |
| new_seg->AddFirstToken(tok); |
| isFirstToken = false; |
| prec_alt_tok = tok; |
| |
| if (use_confidence) |
| tok->SetConfidence(atof(conf)); |
| |
| speech->AddSegment(new_seg); |
| prec_alt_seg = alt_seg; |
| alt_seg = new_seg; |
| isAltBegin = false; |
| } |
| else if (isAlt) |
| { |
| Token* tok = BuildToken(start_ms, dur_ms, string(text), alt_seg); |
| |
| if (start_ms+dur_ms > alt_seg->GetEndTime()) |
| { |
| alt_seg->SetEndTime(start_ms+dur_ms); |
| } |
| |
| alt_seg->AddFirstToken(tok); |
| |
| if (prec_alt_seg == NULL) |
| { |
| if (prec_tok != NULL) |
| { |
| prec_tok->AddNextToken(tok); |
| tok->AddPrecToken(prec_tok); |
| } |
| } |
| else |
| { |
| for (size_t i=0 ; i < prec_alt_seg->GetNumberOfLastToken() ; ++i) |
| { |
| prec_alt_seg->GetLastToken(i)->AddNextToken(tok); |
| tok->AddPrecToken(prec_alt_seg->GetLastToken(i)); |
| } |
| } |
| |
| alt_seg->AddLastToken(prec_alt_tok); |
| prec_alt_tok = tok; |
| |
| if (use_confidence) |
| tok->SetConfidence(atof(conf)); |
| |
| isAlt = false; |
| } |
| else if (isInsideAlt && !isAltBegin && !isAlt) |
| { |
| Token* tok = BuildToken(start_ms, dur_ms, string(text), alt_seg); |
| |
| if (start_ms+dur_ms > alt_seg->GetEndTime()) |
| { |
| alt_seg->SetEndTime(start_ms+dur_ms); |
| } |
| |
| prec_alt_tok->AddNextToken(tok); |
| tok->AddPrecToken(prec_alt_tok); |
| prec_alt_tok = tok; |
| |
| if (use_confidence) |
| tok->SetConfidence(atof(conf)); |
| } |
| else if (isAltEnd) |
| { |
| Segment* seg = Segment::CreateWithDuration(start_ms, dur_ms, speech); |
| seg->SetSource(string(f_file)); |
| seg->SetChannel(string(channel)); |
| Token* tok = BuildToken(start_ms, dur_ms, string(text), alt_seg); |
| seg->AddFirstToken(tok); |
| seg->AddLastToken(tok); |
| alt_seg->AddLastToken(prec_alt_tok); |
| |
| for (size_t i=0 ; i < alt_seg->GetNumberOfLastToken() ; ++i) |
| { |
| alt_seg->GetLastToken(i)->AddNextToken(tok); |
| tok->AddPrecToken(alt_seg->GetLastToken(i)); |
| } |
| |
| prec_tok = tok; |
| |
| if (use_confidence) |
| tok->SetConfidence(atof(conf)); |
| |
| speech->AddSegment(seg); |
| prec_alt_tok = NULL; |
| alt_seg = NULL; |
| prec_alt_seg = NULL; |
| isAltEnd = false; |
| isInsideAlt = false; |
| } |
| else |
| { |
| Segment* seg = Segment::CreateWithDuration(start_ms, dur_ms, speech); |
| seg->SetSource(string(f_file)); |
| seg->SetChannel(string(channel)); |
| Token* tok = BuildToken(start_ms, dur_ms, string(text), seg); |
| seg->AddFirstToken(tok); |
| seg->AddLastToken(tok); |
| |
| if (!isFirstToken) |
| { |
| prec_tok->AddNextToken(tok); |
| tok->AddPrecToken(prec_tok); |
| } |
| |
| isFirstToken = false; |
| prec_tok = tok; |
| |
| if (use_confidence) |
| tok->SetConfidence(atof(conf)); |
| |
| speech->AddSegment(seg); |
| } |
| } |
| } |
| |
| ++line_nb; |
| } |
| |
| LOG_INFO(logger, "loading of file '" + name + "' done"); |
| file.close(); |
| |
| if(speech->NbOfSegments() == 0) |
| { |
| LOG_FATAL(logger, "CTM file '" + name + "' contains no data!"); |
| exit(E_MISSINFO); |
| } |
| |
| res->AddSpeech(speech); |
| |
| return res; |
| } |
|
|