本專案實現了基於深度學習的語者識別與語音分離系統,能夠從語音檔案或即時音訊中提取語者特徵向量,進行身份識別,並將多人混合語音分離為獨立的音訊流。系統能夠自動更新現有語者的聲紋資料或註冊新的語者。
重要提示: 目前 v5 版本 (
VID_identify_v5.py) 為最新穩定版本,使用 Weaviate 資料庫進行特徵向量存儲和檢索。v2.1.5 版整合系統 (VID_system_v2.py) 提供完整的語者分離與即時識別功能,並整合語者管理模組 (VID_manager.py)。
語者分離模型限制:目前系統使用的是 SpeechBrain 的 16kHz 雙說話者(2人)預訓練模型,因此在使用時只能分離兩個說話者的混合語音。若有三人或更多人同時說話的情況,系統會將其合併為兩個主要聲源或可能造成分離效果不佳。
ProjectStudy_SpeechRecognition/
│
├── VID_main.py # 主程式入口點
├── VID_identify_v5.py # 語者識別引擎 (v5.1.2)
├── VID_system_v2.py # 整合式語音分離與識別系統 (v2.1.5)
├── VID_manager.py # 語者與聲紋管理模組
├── VID_database.py # 資料庫服務抽象層
├── VID_logger.py # 統一日誌系統
│
├── 16K-model/ # 音訊檔案目錄
│ └── Audios-16K-IDTF/ # 分離後的音檔和混合音檔
│
├── embeddingFiles/ # 語者嵌入向量儲存 (舊版v3使用)
│ └── [說話者ID]/ # 各語者的嵌入向量
│
├── models/ # 存放下載的模型檔案
│ ├── sepformer_whamr_enhancement/
│ └── speechbrain_recognition/
│
├── pretrained_models/ # 預訓練模型
│ └── sepformer-whamr16k/
│
├── weaviate_study/ # Weaviate資料庫工具和設定
│ ├── create_collections.py # 建立集合結構
│ ├── docker-compose.yml # Docker配置檔
│ ├── npy_to_weaviate.py # 將.npy轉換至Weaviate
│ ├── tool_delete_all.py # 清空資料庫
│ ├── tool_delete.py # 刪除特定資料
│ └── tool_search.py # 搜尋工具
│
└── archive/ # 歷史和測試用檔案
└── deprecated/ # 已棄用的舊版模組
- Python 3.9+
- Windows 作業系統 (Windows 11)
- Docker Desktop (用於運行 Weaviate 資料庫)
- 麥克風設備 (用於即時錄音功能)
- 相關 Python 套件 (詳見 requirements.txt)
- 確保您已安裝 Python 3.9 或更高版本以及 Docker Desktop
- 複製專案到本地:
git clone <專案儲存庫網址> cd ProjectStudy_SpeechRecognition - 建立虛擬環境並啟用:
python -m venv venv_speech venv_speech\Scripts\activate - 安裝相依套件:
pip install -r requirements.txt
- 確保 Docker Desktop 已安裝並運行
- 啟動 Weaviate 容器:
cd weaviate_study docker-compose up -d - 等待容器啟動完成(通常需要 30-60 秒)
- 初始化 Weaviate 結構:
python weaviate_study\create_collections.py
注意: 首次啟動後,必須執行
create_collections.py來建立必要的資料集合。此步驟只需執行一次,除非您刪除了 Weaviate 容器或資料卷。
提供系統的主要入口點及使用者介面:
- 整合式功能選單:可選擇啟動即時語者分離與識別,或管理說話者和聲紋
- 系統狀態檢查:在啟動時檢查 Weaviate 連線狀態,確保系統正常運作
- 錯誤處理:提供完整的例外處理,確保程式運行穩定
v5.1.2 版本提供獨立的語者識別功能:
- 說話者識別:使用 SpeechBrain 的 ECAPA-TDNN 模型提取語音特徵向量
- 動態更新:根據相似度自動更新現有語者的特徵資料
- 新語者識別:當語音與現有特徵差異較大時,自動註冊為新語者
- 批次處理:支援處理單個音檔或整個目錄的音檔
- 向量資料庫:使用 Weaviate 進行高效的向量檢索和管理
- 時間戳記支援:可從外部傳入時間戳功能
- 多聲紋映射:支援將多個不同條件下的聲紋映射到單個語者
v2.1.5 整合系統提供一站式語音處理解決方案:
- 即時錄音:從麥克風直接捕獲音訊流
- 語者分離:使用 SpeechBrain Sepformer 模型將混合語音分離為獨立聲道
- 即時識別:分離後直接進行語者識別,無需等待完整錄音
- 音訊增強:應用頻譜閘控降噪技術提高分離品質
- 結果視覺化:實時顯示識別結果,包括明確標示新增的語者
提供完整的語者和聲紋管理功能:
- 語者查詢與列表:列出所有已註冊的語者及其基本資訊
- 語者信息編輯:修改語者名稱和其他相關屬性
- 聲紋管理:查看語者關聯的所有聲紋向量及其屬性
- 聲紋遷移:將聲紋從一個語者轉移到另一個語者
- 刪除功能:移除語者或特定聲紋向量
- 資料庫檢查與修復:提供資料庫健康檢查和修復功能
封裝所有與 Weaviate 資料庫的互動:
- 單例模式:確保全局只有一個資料庫連接實例
- 統一接口:提供清晰的資料庫操作介面
- 語者操作:建立、讀取、更新、刪除語者資訊
- 聲紋操作:建立、讀取、更新、刪除聲紋向量
- 向量搜索:基於相似度的語者匹配與搜索
- 資料一致性:確保語者和聲紋資料之間的引用完整性
提供集中式的日誌系統,可被專案中所有模組使用:
- 統一格式:統一的日誌格式和顏色設置
- 模組識別:在日誌中包含模組名稱
- 彈性文件處理:支援輸出到不同的日誌檔案
- 單例模式:確保每個命名的日誌器只創建一次
系統使用 16kHz 取樣率處理音訊,關於不同取樣率的處理效果說明:
- 16kHz 音檔: 提供最佳的識別準確度,建議使用此取樣率
- 高於 16kHz 音檔: 會被降頻至 16kHz 處理,效果良好
- 8kHz 音檔: 會被升頻至 16kHz,但比對結果變化較大,準確度較低
- 其他取樣率: 直接重新採樣至 16kHz
重要: 目前系統的閾值已根據實際測試進行優化 (
THRESHOLD_LOW=0.26,THRESHOLD_UPDATE=0.34,THRESHOLD_NEW=0.385)。若要調整識別敏感度,可根據實際需求調整這些閾值。
直接執行主程式:
python VID_main.py
運行後系統將顯示功能選單:
- 啟動即時語者分離與識別:開始錄音並識別
- 管理說話者和聲紋:啟動語者管理選單
- 退出
選擇選項1後:
- 啟動麥克風錄音
- 每 6 秒處理一次音訊 (有 50% 重疊)
- 分離語音並即時識別
- 在終端顯示結果
- 將分離後的音檔儲存至
16K-model/Audios-16K-IDTF/目錄
按下 Ctrl+C 可停止錄音和識別過程。
通過整合系統選單或直接執行:
python VID_manager.py
語者管理系統介面提供以下選項:
- 列出所有說話者
- 檢視說話者詳細資訊
- 更改說話者名稱
- 轉移聲紋到其他說話者
- 刪除說話者
- 資料庫清理與修復
- 離開
from VID_identify_v5 import SpeakerIdentifier, set_output_enabled
# 控制是否顯示詳細輸出
set_output_enabled(False)
# 初始化識別器
identifier = SpeakerIdentifier()
# 處理單個音檔
result = identifier.process_audio_file("path_to_audio.wav")
# 或處理整個目錄
results = identifier.process_audio_directory("path_to_directory")
# 添加嵌入向量到現有說話者
identifier.add_voiceprint_to_speaker("path_to_audio.wav", "speaker_uuid")系統使用三個閾值來判斷如何處理輸入的語音:
- THRESHOLD_LOW (0.26):若相似度極高(距離<0.26),視為重複語音,不進行更新
- THRESHOLD_UPDATE (0.34):若相似度較高(距離<0.34),更新現有說話者特徵
- THRESHOLD_NEW (0.385):若距離在0.34-0.385之間,為現有說話者添加新聲紋;若距離>0.39,則註冊為新說話者
其他重要參數:
- WINDOW_SIZE (6):處理窗口大小(秒)
- OVERLAP (0.5):窗口重疊率
- MIN_ENERGY_THRESHOLD (0.005):最小能量閾值,用於過濾靜音
- DEVICE_INDEX (None):麥克風設備索引,預設使用系統默認設備
系統使用 Weaviate 向量資料庫儲存語者資訊和聲紋向量,分為兩個主要集合:
-
Speaker:存儲語者基本資訊
uuid: 唯一識別碼name: 語者名稱create_time: 建立時間last_active_time: 最後活動時間voiceprint_ids: 關聯的聲紋向量ID列表
-
VoicePrint:存儲聲紋向量資料
uuid: 唯一識別碼create_time: 建立時間updated_time: 更新時間update_count: 更新次數speaker_name: 語者名稱audio_source: 來源音檔資訊vector: 聲紋嵌入向量(用於相似度搜尋)- 參考關係
speaker: 指向 Speaker 集合中的對應記錄
如果您之前使用 v3 版本並有現有的嵌入向量文件 (.npy),可以使用以下命令將其遷移至 Weaviate 資料庫:
python weaviate_study\npy_to_weaviate.py
此工具會從 embeddingFiles/ 目錄中讀取所有 .npy 文件並將它們匯入至 Weaviate 資料庫。
- 如果無法連接到 Weaviate,確認 Docker 是否正在運行
- 執行
docker ps檢查 Weaviate 容器是否正常啟動 - 確保已執行
create_collections.py建立必要的資料集合 - 若需重置 Weaviate 資料,可使用
weaviate_study\create_collections.py
- 如果錄音品質不佳,檢查麥克風設定和環境噪音
- 若分離效果不理想,可能是原始音訊中說話者聲音重疊過多
- 若識別結果不準確,可嘗試調整閾值或增加該說話者的訓練樣本
- 若遇到模型載入錯誤,請確認 SpeechBrain 已正確安裝:
pip install speechbrain - 若處理音檔時出現錯誤,檢查音檔格式是否為 wav 格式
- 若遇到日期格式錯誤,確保系統時間設定正確(Weaviate 要求嚴格的 RFC3339 日期格式)
- 2025-05-16: 更新集中式日誌系統 (VID_logger.py),提供統一的日誌格式和管理
- 2025-05-15: 更新語者管理模組 (
VID_manager.py)與資料庫服務抽象層(VID_database.py),新增功能與改進資料庫操作介面 - 2025-05-07: 更新 README.md 以反映最新系統功能與版本
- 2025-05-06: 更新 VID_identify_v5.py 到 v5.1.2,支援外部時間戳和多聲紋映射
- 2025-05-06: 更新 VID_system_v2.py 到 v2.1.5,整合語者管理功能
- 增強語者分離功能,支援三人以上混合語音
- 開發網頁介面,提供更友善的使用體驗
- 增加語音轉文字功能,實現完整的語音內容分析
- 加入情感分析模組,提供語者情緒狀態追蹤
- 優化資源使用,減少計算資源需求
本專案採用 MIT 授權,詳見 LICENSE 檔案。
VID_identify_v5.py:v5.1.2 版本語者識別主程式(使用 Weaviate 資料庫)VID_system_v2.py:v2.1.5 整合式語者分離與識別系統VID_manager.py:語者與聲紋管理模組weaviate_study/:Weaviate 相關工具和設定docker-compose.yml:Weaviate Docker 容器設定檔create_collections.py:建立 Weaviate 集合結構npy_to_weaviate.py:將 v3 版本的 .npy 檔案匯入 Weaviatetool_search.py:Weaviate 搜尋工具tool_delete_all.py:清除 Weaviate 資料tool_delete_speaker.py:刪除特定語者資料
models/:存放下載的 SpeechBrain 模型output_log.txt:操作日誌16K-model/Audios-16K-IDTF/:存放分離後的音檔與原始混合音檔