# 前言

VoiceprintRecognition_Pytorch 是博主開源的一款聲紋識別框架,該框架支持EcapaTdnn、ResNetSE、ERes2Net、CAM++等多種先進的聲紋識別模型,也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多種數據預處理方法,支持AAMLoss、AMLoss、ARMLoss、CELoss等多種損失函數。該框架支持多種關於聲紋識別的處理,比如聲紋對,比聲紋檢索,以及本文章需要介紹的說話人日誌(說話人分離)。

使用說話人日誌

關於模型的獲取,開發者可以自己訓練模型,也可以下載博主提供的模型。具體獲取方法請去VoiceprintRecognition_Pytorch開源地址查看。這裏只介紹如何使用該框架的說話人日誌功能。

執行infer_speaker_diarization.py程序,輸入音頻路徑,就可以分離出說話人,並顯示結果,建議音頻長度不要低於10秒。更多功能可以查看該程序參數。

python infer_speaker_diarization.py --audio_path=dataset/test_long.wav

輸出類似如下,從日誌裏面可以看出,它不僅可以分離音頻中每個說話人的說話位置,而且還能夠識別是誰說了哪些話,不過這個是要提前註冊的:

2024-10-10 19:30:40.768 | INFO     | mvector.predict:__init__:61 - 成功加載模型參數:models/CAMPPlus_Fbank/best_model/model.pth
2024-10-10 19:30:40.795 | INFO     | mvector.predict:__create_index:127 - 聲紋特徵索引創建完成,一共有3個用戶,分別是:['沙瑞金', '夜雨飄零', '李達康']
2024-10-10 19:30:40.796 | INFO     | mvector.predict:__load_audio_db:142 - 正在加載聲紋庫數據...
100%|██████████| 3/3 [00:00<?, ?it/s]
2024-10-10 19:30:40.798 | INFO     | mvector.predict:__create_index:127 - 聲紋特徵索引創建完成,一共有3個用戶,分別是:['沙瑞金', '夜雨飄零', '李達康']
2024-10-10 19:30:40.798 | INFO     | mvector.predict:__load_audio_db:172 - 聲紋庫數據加載完成!
識別結果:
{'speaker': '沙瑞金', 'start': 0.0, 'end': 2.0}
{'speaker': '陌生人1', 'start': 4.0, 'end': 7.0}
{'speaker': '李達康', 'start': 7.0, 'end': 8.0}
{'speaker': '沙瑞金', 'start': 9.0, 'end': 12.0}
{'speaker': '沙瑞金', 'start': 13.0, 'end': 14.0}
{'speaker': '陌生人1', 'start': 15.0, 'end': 19.0}

顯示結果圖像如下,可以通過空格鍵控制播放音頻,點擊位置可以跳轉音頻到指定位置:

項目同樣提供了GUI界面的程序,執行infer_speaker_diarization_gui.py程序。更多功能可以查看該程序參數。

python infer_speaker_diarization_gui.py

可以打開這樣一個頁面,進行說話人識別:

注意:如果說話人名字是中文的,需要設置安裝字體才能正常顯示,一般情況下Windows無需安裝,Ubuntu需要安裝。如果Windows確實是缺少字體,只需要字體文件這裏下載.ttf格式的文件,複製到C:\Windows\Fonts即可。Ubuntu系統操作如下。

  1. 安裝字體
git clone https://github.com/tracyone/program_font && cd program_font && ./install.sh
  1. 執行下面Python代碼
import matplotlib
import shutil
import os

path = matplotlib.matplotlib_fname()
path = path.replace('matplotlibrc', 'fonts/ttf/')
print(path)
shutil.copy('/usr/share/fonts/MyFonts/simhei.ttf', path)
user_dir = os.path.expanduser('~')
shutil.rmtree(f'{user_dir}/.cache/matplotlib', ignore_errors=True)

其他版本

同時博主也開源了PaddlePaddle版本的,功能一致,如有需要可以說明這個地址:VoiceprintRecognition-PaddlePaddle

小夜