| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
|
|
| #include "ctmstmrttm_segmentor.h" |
|
|
| Logger* CTMSTMRTTMSegmentor::logger = Logger::getLogger(); |
|
|
| |
| CTMSTMRTTMSegmentor::~CTMSTMRTTMSegmentor() |
| { |
| sourceList.clear(); |
|
|
| map<string, set<string> >::iterator i, ei; |
| |
| i = channelList.begin(); |
| ei = channelList.end(); |
| |
| while(i != ei) |
| { |
| i->second.clear(); |
| ++i; |
| } |
| |
| channelList.clear(); |
| |
| m_VectSpeechSet.clear(); |
| } |
|
|
| void CTMSTMRTTMSegmentor::Reset(SpeechSet* references, SpeechSet* hypothesis) |
| { |
| if (references != refs) |
| { |
| refs = references; |
| |
| sourceList.clear(); |
| channelList.clear(); |
| |
| for (size_t i=0 ; i < references->GetNumberOfSpeech(); ++i) |
| { |
| for (size_t j=0 ; j < references->GetSpeech(i)->NbOfSegments() ; ++j) |
| { |
| Segment* seg = references->GetSpeech(i)->GetSegment(j); |
| sourceList.insert(seg->GetSource()); |
| channelList[seg->GetSource()].insert(seg->GetChannel()); |
| } |
| } |
| } |
| |
| hyps = hypothesis; |
| |
| |
| currentSource = *(sourceList.begin()); |
| sourceList.erase(currentSource); |
| |
| currentChannel = *(channelList[currentSource].begin()); |
| channelList[currentSource].erase(currentChannel); |
| |
| LOG_INFO(logger, "Prepare to process source("+currentSource+") channel("+currentChannel+")"); |
|
|
| currentSegmentRef = GetFirstSegment(0, references); |
| } |
|
|
| void CTMSTMRTTMSegmentor::ResetGeneric(map<string, SpeechSet*> &mapspeechSet) |
| { |
| sourceList.clear(); |
| channelList.clear(); |
| m_VectSpeechSet.clear(); |
| |
| map<string, SpeechSet*>::iterator k = mapspeechSet.begin(); |
| map<string, SpeechSet*>::iterator ek = mapspeechSet.end(); |
| |
| while(k != ek) |
| { |
| m_VectSpeechSet.push_back(k->second); |
| |
| for (size_t i=0 ; i < k->second->GetNumberOfSpeech(); ++i) |
| { |
| for (size_t j=0 ; j < k->second->GetSpeech(i)->NbOfSegments() ; ++j) |
| { |
| Segment* seg = k->second->GetSpeech(i)->GetSegment(j); |
| sourceList.insert(seg->GetSource()); |
| channelList[seg->GetSource()].insert(seg->GetChannel()); |
| } |
| } |
| |
| ++k; |
| } |
| |
| |
| currentSource = *(sourceList.begin()); |
| sourceList.erase(currentSource); |
| |
| currentChannel = *(channelList[currentSource].begin()); |
| channelList[currentSource].erase(currentChannel); |
| |
| LOG_INFO(logger, "Prepare to process source("+currentSource+") channel("+currentChannel+")"); |
|
|
| currentSegmentRef = GetFirstSegmentGeneric(0); |
| } |
|
|
| SegmentsGroup* CTMSTMRTTMSegmentor::NextGeneric() |
| { |
| SegmentsGroup* segGroup = new SegmentsGroup(); |
|
|
| Segment* lastOverlapingSeg = GetLastOverlapingSegmentGeneric(); |
| |
| |
| for(size_t v=0; v<m_VectSpeechSet.size(); ++v) |
| { |
| for (size_t i=0 ; i<m_VectSpeechSet[v]->GetNumberOfSpeech(); ++i) |
| { |
| vector<Segment*> v_segs = m_VectSpeechSet[v]->GetSpeech(i)->GetSegmentsByTime(currentSegmentRef->GetStartTime(), lastOverlapingSeg->GetEndTime(), currentSource, currentChannel); |
| |
| if (v_segs.size() != 0) |
| segGroup->AddHypothesis(v_segs); |
| } |
| } |
| |
| |
| currentSegmentRef = GetFirstSegmentGeneric(lastOverlapingSeg->GetEndTime()); |
| |
| if (currentSegmentRef == NULL) |
| { |
| if (!channelList[currentSource].empty()) |
| { |
| currentChannel = *(channelList[currentSource].begin()); |
| LOG_INFO(logger, "Prepare to process source("+currentSource+") channel("+currentChannel+")"); |
| channelList[currentSource].erase(currentChannel); |
| currentSegmentRef = GetFirstSegmentGeneric(0); |
| } |
| else if (!sourceList.empty()) |
| { |
| currentSource = *(sourceList.begin()); |
| sourceList.erase(currentSource); |
| currentChannel = *(channelList[currentSource].begin()); |
| channelList[currentSource].erase(currentChannel); |
| LOG_INFO(logger, "Prepare to process source("+currentSource+") channel("+currentChannel+")"); |
| currentSegmentRef = GetFirstSegmentGeneric(0); |
| } |
| } |
| |
| return segGroup; |
| } |
|
|
| SegmentsGroup* CTMSTMRTTMSegmentor::Next() |
| { |
| SegmentsGroup* segGroup = new SegmentsGroup(); |
|
|
| |
| Segment* lastOverlapingSeg = GetLastOverlapingSegment(refs); |
| |
| |
| |
|
|
| |
| for (size_t i=0 ; i < refs->GetNumberOfSpeech() ; ++i) |
| { |
| vector<Segment*> v_segs = refs->GetSpeech(i)->GetSegmentsByTime(currentSegmentRef->GetStartTime(), lastOverlapingSeg->GetEndTime(), currentSource, currentChannel); |
| |
| if (v_segs.size() != 0) |
| segGroup->AddReference(v_segs); |
| } |
| |
| for (size_t i=0 ; i < hyps->GetNumberOfSpeech(); ++i) |
| { |
| vector<Segment*> v_segs = hyps->GetSpeech(i)->GetSegmentsByTime(currentSegmentRef->GetStartTime(), lastOverlapingSeg->GetEndTime(), currentSource, currentChannel); |
| |
| if (v_segs.size() != 0) |
| segGroup->AddHypothesis(v_segs); |
| } |
| |
| |
| |
| currentSegmentRef = GetFirstSegment(lastOverlapingSeg->GetEndTime(), refs); |
| |
| |
| if (currentSegmentRef == NULL) |
| { |
| if (!channelList[currentSource].empty()) |
| { |
| currentChannel = *(channelList[currentSource].begin()); |
| LOG_INFO(logger, "Prepare to process source("+currentSource+") channel("+currentChannel+")"); |
| channelList[currentSource].erase(currentChannel); |
| currentSegmentRef = GetFirstSegment(0, refs); |
| } |
| else |
| { |
| if (!sourceList.empty()) |
| { |
| currentSource = *(sourceList.begin()); |
| sourceList.erase(currentSource); |
| currentChannel = *(channelList[currentSource].begin()); |
| channelList[currentSource].erase(currentChannel); |
| LOG_INFO(logger, "Prepare to process source("+currentSource+") channel("+currentChannel+")"); |
| currentSegmentRef = GetFirstSegment(0, refs); |
| } |
| |
| |
| |
| |
| |
| |
| } |
| } |
| |
| return segGroup; |
| } |
|
|
| Segment* CTMSTMRTTMSegmentor::GetLastOverlapingSegment(SpeechSet* speechs) |
| { |
| |
| Segment* last = currentSegmentRef; |
| bool again = true; |
| |
| while (again) |
| { |
| again = false; |
| |
| for (size_t i=0 ; i < speechs->GetNumberOfSpeech() ; ++i) |
| { |
| |
| Segment* t_seg = speechs->GetSpeech(i)->NextSegment(last->GetEndTime(), currentSource, currentChannel); |
| |
| if (t_seg != NULL) |
| { |
| |
| if (t_seg->GetStartTime() < last->GetEndTime()) |
| { |
| last = t_seg; |
| again = true; |
| } |
| } |
| } |
| } |
| |
| return last; |
| } |
|
|
| Segment* CTMSTMRTTMSegmentor::GetLastOverlapingSegmentGeneric() |
| { |
| |
| Segment* last = currentSegmentRef; |
| bool again = true; |
| |
| while (again) |
| { |
| again = false; |
| |
| for(size_t v=0; v<m_VectSpeechSet.size(); ++v) |
| { |
| for (size_t i=0 ; i < m_VectSpeechSet[v]->GetNumberOfSpeech() ; ++i) |
| { |
| Segment* t_seg = m_VectSpeechSet[v]->GetSpeech(i)->NextSegment(last->GetEndTime(), currentSource, currentChannel); |
| |
| if (t_seg != NULL) |
| { |
| if (t_seg->GetStartTime() < last->GetEndTime()) |
| { |
| last = t_seg; |
| again = true; |
| } |
| } |
| } |
| } |
| } |
| |
| return last; |
| } |
|
|
| Segment* CTMSTMRTTMSegmentor::GetFirstSegment(const int& startTime, SpeechSet* speechs) |
| { |
| int min_time = INT_MAX; |
| Segment* retSegment = NULL; |
| |
| for (size_t i=0 ; i < speechs->GetNumberOfSpeech() ; ++i) |
| { |
| Segment* t_seg = speechs->GetSpeech(i)->NextSegment(startTime, currentSource, currentChannel); |
| |
| if (t_seg != NULL) |
| { |
| if (t_seg->GetStartTime() < min_time) |
| { |
| retSegment = t_seg; |
| min_time = t_seg->GetStartTime(); |
| } |
| } |
| } |
| |
| return retSegment; |
| } |
|
|
| Segment* CTMSTMRTTMSegmentor::GetFirstSegmentGeneric(const int& startTime) |
| { |
| int min_time = INT_MAX; |
| Segment* retSegment = NULL; |
| |
| for(size_t v=0; v<m_VectSpeechSet.size(); ++v) |
| { |
| SpeechSet* speechs = m_VectSpeechSet[v]; |
| |
| for (size_t i=0 ; i < speechs->GetNumberOfSpeech() ; ++i) |
| { |
| Segment* t_seg = speechs->GetSpeech(i)->NextSegment(startTime, currentSource, currentChannel); |
| |
| if (t_seg != NULL) |
| { |
| if (t_seg->GetStartTime() < min_time) |
| { |
| retSegment = t_seg; |
| min_time = t_seg->GetStartTime(); |
| } |
| } |
| } |
| } |
| |
| return retSegment; |
| } |
|
|