Beispiel #1
0
  def Separate(self):
    Graph = c.GetDistance(self.Spec_g, th=5)
    Graph_i = c.GetInclinations(Graph)

    self.phonemes = []
    ### phonemes : list of namedtuple('phoneme', [point, UV, pcm_start, pcm_end])
    for i in range(len(self.UV_list)):
      if self.UV_list[i].UV == 'U':
        # UV_list[i].start : end 에서 무조건 하나 가져옴
        point = self.GetPointFromRange(Graph, self.UV_list[i].start, self.UV_list[i].end)
        temp = namedtuple('phoneme', ['point', 'UV', 'pcm_start', 'pcm_end'])
        temp.point = point
        temp.UV = 'U'
        self.phonemes.append(temp)
      elif self.UV_list[i].UV == 'V':
        # graph for문 돌면서 0인 구간 중 가운뎃값 가져옴
        points = self.GetAllZeroPointFromRange(Graph, self.UV_list[i].start, self.UV_list[i].end)
        if points==[]:
          convexes = c.GetConvex_range(Graph_i, self.UV_list[i].start, self.UV_list[i].end)
          if len(convexes)>0:
            minindex = convexes[0]
            minvalue = Graph[convexes[0]]
            for j in range(len(convexes)):
              if minvalue > Graph[convexes[j]]:
                minvalue = Graph[convexes[j]]
                minindex = convexes[j]
              points.append(minindex)

        for j in range(len(points)):
          temp = namedtuple('phoneme', ['point', 'UV', 'pcm_start', 'pcm_end'])
          temp.point = points[j]
          temp.UV = 'V'
          self.phonemes.append(temp)

    ### PostTreat : calculate p_start, p_end
    for i in range(len(self.phonemes)):
      f_start = Framing.Index_frame_to_origin(self.phonemes[i].point, self.frame_size, self.interval)
      f_end = f_start + 2 * self.frame_size - self.interval
      f_range = (f_start - f_end)
      sectlen = int(0.05 * self.sample_rate)
      p_start = f_start - int((sectlen - f_range) / 2) + 650

      if p_start < 0:
        p_start = 0

      p_end = p_start + sectlen

      if p_end >= len(self.pcmValue):
        p_end = len(self.pcmValue) - 1
        p_start = p_end - sectlen
      self.phonemes[i].pcm_start = p_start
      self.phonemes[i].pcm_end = p_end
Beispiel #2
0
    def Separate(self):
        self.phonemes = []

        ### Case 1 : best case - UV detected successfully ###
        if len(self.UV_list)==len(self.UV_txt):
            for i in range(len(self.UV_list)):
                points = self.Get_Points_from_Sector(self.UV_list[i].start, self.UV_list[i].end, len(self.UV_txt[i]), self.UV_list[i].UV)
                for j in range(len(points)):
                    temp = namedtuple('phoneme',['point','label','pcm_start','pcm_end'])
                    temp.point = points[j]
                    temp.label = self.UV_txt[i][j]
                    if temp.label != 'S':
                        self.phonemes.append(temp)

        ### Case 2 : Number of Phonemes from whole sector is matched with Expected ###

        ### Case 3 : worst case - Timing matching
        
        ### PostTreat : calculate p_start, p_end
        for i in range(len(self.phonemes)):
            f_start = Framing.Index_frame_to_origin(self.phonemes[i].point,self.frame_size,self.interval)
            f_end = f_start + 2 * self.frame_size - self.interval
            f_range = (f_start-f_end)
            sectlen = int(0.05*self.sample_rate)
            #p_start = f_start - int((sectlen-f_range)/2)
            #p_end = p_start + sectlen
            p_start = f_start - int((sectlen-f_range)/2) + 650
            
            if p_start < 0 :
                p_start = 0
            
            p_end = p_start + sectlen
            
            if p_end >= len(self.pcm):
                p_end = len(self.pcm)-1
                p_start = p_end - sectlen
            
            self.phonemes[i].pcm_start = p_start
            self.phonemes[i].pcm_end = p_end
Beispiel #3
0
  def Check_Empty_AVG(self):
    self.frame_table[0].Empty = True
    self.frame_table[0].UV = 0
    self.frame_table[-1].Empty = True
    self.frame_table[-1].UV = 0
    self.sect_start = []
    self.sect_end = []

    for i in range(len(self.frame_table)-1):
      if self.frame_table[i].Empty and not self.frame_table[i+1].Empty:
        self.sect_start.append(i+1)
      if not self.frame_table[i].Empty and self.frame_table[i+1].Empty:
        self.sect_end.append(i+1)

    i=0
    while(i<len(self.sect_start)-1):
      if (self.sect_start[i+1] - self.sect_end[i]) < 0.03*self.sample_rate/(self.frame_size-self.interval):
        for j in range(self.sect_end[i], self.sect_start[i+1]):
          self.frame_table[j].Empty = False
          self.frame_table[j].UV = 2

        del(self.sect_start[i+1])
        del(self.sect_end[i])
      else:
        i+=1

    selected_sect = 0

    if not (len(self.sect_start)==1 and len(self.sect_end)==1):
      self.avgSpec = []
      for i in range(len(self.frame_table)):
        sumSpec = 0
        for j in range(len(self.Spec[i])):
          sumSpec += self.Spec[i][j]
        sumSpec /= len(self.Spec[0])
        self.avgSpec.append(sumSpec)
      
      selected_sect = 0
      sect_value = -1
      for i in range(len(self.sect_start)):
        temp_sect = 0
        for j in range(self.sect_start[i],self.sect_end[i]):
          temp_sect += self.avgSpec[j]
        if temp_sect > sect_value:
          selected_sect = i
          sect_value = temp_sect
      
      for i in range(len(self.frame_table)):
        if not i in range(self.sect_start[selected_sect], self.sect_end[selected_sect]):
          self.frame_table[i].Empty = True
          self.frame_table[i].UV = 0
    ###
    for i in range(len(self.frame_table)-1):
      if abs(self.frame_table[i].UV - self.frame_table[i+1].UV)==3:
        self.frame_table[i].UV = 2
        self.frame_table[i+1].UV = 2
    #################################################3
    allPoints = []
    voicestart = Framing.Index_frame_to_origin(self.sect_start[selected_sect],self.frame_size,self.interval)
    voiceend = Framing.Index_frame_to_origin(self.sect_end[selected_sect],self.frame_size,self.interval)
    allPoints = Framing.Framing(self.pcmValue[voicestart:voiceend],800,0)
    #allPoints = Framing.Framing(self.pcmValue[voicestart:voiceend],1600,800)
    for i in range(len(allPoints)):
      mfcclist = []
      temp = psf.mfcc(np.array(allPoints[i]), samplerate=self.sample_rate, winlen=0.01, winstep=0.01, nfft=self.frame_size,numcep=12)
      #temp = psf.mfcc(np.array(allPoints[i]), samplerate=self.sample_rate, winlen=0.02, winstep=0.02, nfft=self.frame_size,numcep=12)
      for j in range(temp.shape[0]):
        templist = []
        for k in range(temp.shape[1]):
          templist.append(temp[j][k])
        mfcclist.append(templist)
      self.allMFCC.append(mfcclist)