Walleclipse / Deep_Speaker-speaker_recognition_system

Keras implementation of ‘’Deep Speaker: an End-to-End Neural Speaker Embedding System‘’ (speaker recognition)
245 stars 81 forks source link

關於VAD 設定問題 #59

Closed hsingchenlee closed 3 years ago

hsingchenlee commented 4 years ago

您好,想請問關於VAD部分的RUN法以及參數設定問題。假如我想對一段語音做VAD,我只要取用pre_process.py 裡的這兩行 filename = '我要做VAD的音檔.wav' raw_audio = read_audio(filename) 這個raw_audio 取出來的數值 即是做完VAD後的值 我這樣用法是對的嗎?對的話那又該如何聽聽看這個 raw_audio 的效果呢? 另外想請問參數是如何設定的以及該設定多少,(例如start sec , end sec 還有 threshold值) 非常感謝您。

hsingchenlee commented 4 years ago

我解決 試聽 VAD效果的問題了,目前剩 對VAD的參數如何設定比較模糊。

Walleclipse commented 4 years ago
  1. 如果只做VAD,那么只需要调用 silence_detector.py 里的 class SilenceDetector. silence_detector.py里的 44~70行 还有 pre_process.py 里的 def VAD 展示了用法。

  2. 有些参数是根据实际的数据而定的。 start secend secconstants.py里的 TRUNCATE_SOUND_SECONDS 设置, 表示你要截取多长的语音。 一般情况语音长度 end sec - start sec 需要在1 s 以上,但是太长的话 处理会很慢,要求资源很高。 比如我选择(start sec, end sec)=(0.2, 1.81) 也就是截取1.81 - 0.2 ~ 1.6 s 长度的语音。 threshold表示 判断为静音的阈值。当一小段语音的能量小于threshold 时就被判定为静音,并且之后会将其删掉。 threshold =15 时比较正常的设置。 如果threshold 偏大那么可能将音量较小的有用语音误删掉,如果太小那么可能会喽漏删一部分静音部分。

hsingchenlee commented 4 years ago

非常感謝您的回覆,但是train-clean-100 的音檔平均大約都是十幾秒,所以設定(start sec, end sec)=(0.2, 1.81),所得出的npy檔 只代表長度共1.6秒的wav音檔的聲音資訊這樣對吧? 另外想請問您,這邊是利用每個speaker講得很多不同語句餵進model去學習如何讓model輸出的每個不同speaker的embeddings的COSINE相似度越來越小(這個理解是對的嗎?) 你覺得如果用此model架構做哼唱辨識是可行的嗎? 就是我可能變成有很多singing ID 每個singing ID都是同一句歌詞由不同人來清唱(所以可能音檔長度會是十幾秒)但是前提是音要準但可以唱的高也可以唱的低,依照speaker id的DATA 來看 我可能至少要有數百個singing ID 且每個singing ID至少要有數十個不同人的清唱wav檔。之後再把歌曲分割成好幾段後用TRAIN好的MODEL取embeddings,把每段的embeddings疊起來就代表這整首歌曲,對數百首歌曲取完EMBEDDINGS後存起來當作DATABASE, 之後請哼唱者哼唱十幾秒取embeddings,再把這個embeddings去和DATABASE做相似度比較 找出它唱的是哪首歌曲。 您覺得這個想法是可行的嗎或是可能會有什麼很大的問題? 謝謝您

Walleclipse commented 4 years ago
  1. 是的。(start sec, end sec)=(0.2, 1.81),所得出的npy只代表長度共1.6秒的wav. 如果音频总共是10s, 那么处理数据时把这个音频分成1.6s长度的不同部分(先进性VAD),比如 0.2s-1.81s, 1.81s-3.42s,等等
  2. 这个model作用是,输入语音,输出speaker embedding. 如果有两段语音,我们通过model得到这两段语音的speaker embedding, 如果这两个speaker embedding 的 cosine 相似度很高,说明这两个语音是同一个人说的,反之是不同的人说的。
  3. 注意我这个repo做的是 speaker_recognition,也就是本质上的embedding是 一段语音的speaker embedding。 因为训练的时候 我把同一个speaker的语音当做 positive, 不同speaker的语音当做negative来计算triplet loss。 但是我觉得,你把这个问题稍微改一下,也就是 从 speaker_recognition 变成 singing_recognition 也可以。注意这个时候训练时计算triplet loss的时候,positive 和 negative 不再根据speaker 区分 而是根据 singing 区分。 也就是 我先选择任意一个语音当做anchor,随后选择同一个singing ID的其他语音当做positive,不同singing ID 的语音当做negative。这种我也没坐过,不知道效果会怎么样。
hsingchenlee commented 4 years ago

抱歉又打擾了, 可以請你解釋一下 clipped_audio 這個函數內 bias = np.random.randint(20, x.shape[0] - num_frames) 這串的意義嗎,這樣是不是對我上述的Singing ID 不太好? 謝謝您

Walleclipse commented 4 years ago

如果语音很长,这样每次随机的截一部分,而不是每次都取固定的片段。比如原始的语音长度为 200 frames, 我们需要截取 c.NUM_FRAMES=160 的长度。那么我们就从中间随机截一段,跟随机数 bias有关。比如 bias = 20 时,截取 [20:160+20]的长度,当 bias = 31 时,截取 [31:160+31]的长度。 这样每次从同一个语音得到的片段不太一样,这样可以防止过拟合。