yolo8+聲紋識別(實時字幕)

現在已經完成了人臉識別跟蹤 ?,接下來要:

? 加入「聲紋識別(說話人識別)」功能,識別誰在講話,并在視頻中“這個人”的名字旁邊加上「正在講話」。

這屬于多模態識別(視覺 + 音頻):

  1. 說明實現原理與推薦工具

  2. 給出整體流程架構

  3. 推薦穩定的開源工具包

  4. 展示如何與當前人臉識別結合


? 整體目標

希望實現:

  • 攝像頭中顯示所有人的名字(已完成)

  • 通過麥克風監聽講話內容

  • 根據聲紋判斷當前是誰在講話

  • 在視頻中對這個人顯示“正在講話”

? 實現路徑(視覺 + 音頻)

🔊 聲紋識別部分(說話人識別)

目標技術名稱推薦工具
聲音中識別是誰說話人識別(Speaker Identification)pyannote-audio不推薦, resemblyzer推薦
聲音中找誰在說話說話人活動檢測(Voice Activity Detection, VAD)webrtcvad, silero-vad
聲紋注冊(采集說話人音頻)Speaker Embeddingresemblyzer, speechbrain

1. pyannote-audio和resemblyzer區別核心功能對比

特性pyannote-audioresemblyzer
主要用途說話人分割(Diarization)、語音活動檢測(VAD)、重疊語音檢測聲紋嵌入(Speaker Embedding)、實時聲紋比對
模型復雜度高(多模塊聯合優化,端到端流程)低(輕量級,專注聲紋向量提取)
預訓練模型提供完整的說話人分割管道(如?speaker-diarization-3.1僅提供聲紋編碼器(如?VoiceEncoder
實時性較慢(適合離線處理)快(支持實時流式處理)
依賴項依賴 PyTorch 和 Hugging Face 模型庫僅需 NumPy 和 PyTorch
典型應用場景會議記錄、廣播分析、多說話人數據集標注實時聲紋驗證、說話人聚類

2. 技術實現差異

pyannote-audio
  • 模塊化設計
    包含獨立的子模塊(如?segmentationembeddingclustering),可靈活組合或替換16。

  • 端到端流程
    支持從語音活動檢測到說話人聚類的完整流程,適合復雜場景(如重疊語音處理)6。

  • 性能優化
    部分版本(如?speaker-diarization-3.1)處理長音頻較慢,推薦使用 v2 版本加速12。

resemblyzer
  • 輕量級
    僅實現聲紋向量提取(512 維嵌入),需自行結合聚類算法(如 K-Means)完成分割5。

  • 實時性
    適合流式處理,單次推理速度快(約 0.1 秒/語音片段)5。

  • 易用性
    無需復雜配置,適合快速驗證聲紋相似度

? 推薦方案(輕量 + 可行)

🔧 聲紋識別用 resemblyzer,搭配 YOLO 人臉

注意!!!!!!!!!!!!

先安裝ffmpeg,resemblyzer會依賴

1. 為什么?resemblyzer?需要?ffmpeg

resemblyzer?的核心功能是處理音頻文件(如 MP3、WAV 等),但它本身?不直接調用?ffmpeg,而是通過以下依賴鏈間接使用:

resemblyzer 
→ librosa(音頻加載) 
→ audioread(解碼非WAV格式) 
→ ffmpeg(實際解碼工具)
  • 關鍵點
    只有處理?非WAV格式(如MP3、MP4)?時才需要?ffmpeg。如果僅使用 WAV 文件,可跳過安裝。

? 安裝【ffmpeg】

https://ffmpeg.org/打開網站下載自己的版本

接下來📦 安裝其他依賴:

pip install resemblyzer sounddevice webrtcvad numpy 

💡 resemblyzer 是 Facebook 開源的輕量級聲紋識別庫,能實時從麥克風提取聲紋并判斷是否是目標用戶。

? 總體流程圖(視覺 + 音頻結合):


? 示例代碼框架(概要)

1、查看在PyCharm里面能不能使用ffmpeg

import subprocesstry:result = subprocess.run(["ffmpeg", "-version"], capture_output=True, text=True)if result.returncode == 0:print("? ffmpeg 已安裝")else:print("? ffmpeg 未安裝或異常")
except FileNotFoundError:print("? 未找到 ffmpeg 命令")

2、拿兩段音頻識別


from resemblyzer import VoiceEncoder, preprocess_wav
import numpy as np# 初始化編碼器
encoder = VoiceEncoder()# 加載并預處理音頻
wav1 = preprocess_wav("/Users/lianying/Desktop/yolo/1.m4a")  # 支持 .wav/.mp4 文件
wav2 = preprocess_wav("/Users/lianying/Desktop/yolo/2.m4a")# 提取聲紋嵌入(512 維向量)
embed1 = encoder.embed_utterance(wav1)
embed2 = encoder.embed_utterance(wav2)# 計算相似度(余弦相似度)
similarity = np.dot(embed1, embed2)
print(f"聲紋相似度: {similarity:.4f}")  # 0.0~1.0,>0.8 可視為同一人

已經成功識別聲紋了 !!!!!!!

? 接下來整合以下功能:

模塊狀態
🧠 人臉識別 + 聲紋識別? 已完成(已有)
🎙? Whisper 語音識別? 可用(ffmpeg 已安裝)
💬 實時字幕顯示🔜 馬上整合

已經安裝好了 ffmpeg ?,那現在可以 正式接入 Whisper 實現“說話內容轉字幕”

🧠 模型大小選擇:使用 Whisper 的哪個版本?(默認推薦 base

  • tiny(最快) / base(準確+輕)/ small(較高準確)

? 安裝 Whisper(OpenAI 官方)

pip install -U openai-whisper

? Whisper 使用示例(語音轉文字)

import whisper
model = whisper.load_model("base")  # 也可以用 "tiny", "small", "medium", "large"# 錄音 → 保存為 temp.wav
import sounddevice as sd
from scipy.io.wavfile import writefs = 16000
duration = 3
audio = sd.rec(int(duration * fs), samplerate=fs, channels=1)
sd.wait()
write("temp.wav", fs, audio)# 語音識別
result = model.transcribe("temp.wav", language="zh")
print("識別內容:", result["text"])

🎯 目標

基于攝像頭視頻流,識別誰在講話,并把“張三(正在講話):你好啊,我是張三”樣式的字幕實時顯示在畫面上(支持中文)

? 內容包含:

模塊技術狀態
人臉識別YOLOv8 + face_recognition?
聲紋識別Resemblyzer?
語音轉文字Whisper(base)?
實時錄音sounddevice?
字幕顯示PIL + 中文字體支持?

? 使用前請確認:

如下文件夾結構:

import os
import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image
import face_recognition
from resemblyzer import VoiceEncoder, preprocess_wav
import sounddevice as sd
from scipy.io.wavfile import write
import whisper
from ultralytics import YOLO# === 參數設置 ===
VOICE_DB = "voice_db"
FACES_DB = "faces"
FONT_PATH = "font/AlimamaDaoLiTi-Regular.ttf"  # 中文黑體字體路徑(請確保該字體文件存在)
SAMPLE_RATE = 16000
RECORD_DURATION = 1  # 錄音時間(秒)
CONFIDENCE_THRESHOLD = 0.75# === 初始化模型 ===
print("加載 YOLOv8 模型...")
yolo_model = YOLO("/Users/lianying/Desktop/yolo/model_face.pt")  # 檢測人臉用
print("加載人臉識別數據庫...")
known_encodings, known_names = [], []
for name in os.listdir(FACES_DB):for img_file in os.listdir(os.path.join(FACES_DB, name)):img_path = os.path.join(FACES_DB, name, img_file)img = face_recognition.load_image_file(img_path)enc = face_recognition.face_encodings(img)if enc:known_encodings.append(enc[0])known_names.append(name)print("加載聲紋識別數據庫...")
encoder = VoiceEncoder()
speaker_embeddings = {}
for file in os.listdir(VOICE_DB):if file.endswith(".wav"):name = file.split(".")[0]wav = preprocess_wav(os.path.join(VOICE_DB, file))embed = encoder.embed_utterance(wav)speaker_embeddings[name] = embedprint("加載 Whisper 模型...")
asr_model = whisper.load_model("base")# === 字體 ===
font = ImageFont.truetype(FONT_PATH, 24)# === 攝像頭 ===
cap = cv2.VideoCapture(0)
frame_count = 0
interval = int(30 * RECORD_DURATION)  # 每 interval 幀識別一次
current_speaker = ""
current_text = ""while True:ret, frame = cap.read()if not ret:breakframe_count += 1# 每 interval 幀錄音 + 聲紋識別 + Whisperif frame_count % interval == 0:print("\n[INFO] 正在錄音并分析說話人...")audio = sd.rec(int(RECORD_DURATION * SAMPLE_RATE), samplerate=SAMPLE_RATE, channels=1)sd.wait()write("temp.wav", SAMPLE_RATE, audio)# 聲紋識別wav = preprocess_wav("temp.wav")embed = encoder.embed_utterance(wav)best_name, best_score = "", 0.5for name, ref in speaker_embeddings.items():sim = np.dot(embed, ref)if sim > best_score:best_score = simbest_name = namecurrent_speaker = best_name if best_score > CONFIDENCE_THRESHOLD else ""# Whisper 語音識別result = asr_model.transcribe("temp.wav", language="zh")current_text = result["text"].strip()print(f"[識別] {current_speaker}:{current_text}")# 人臉檢測 + 標注results = yolo_model.predict(frame, classes=[0], conf=0.4, verbose=False)for result in results:boxes = result.boxes.xyxy.cpu().numpy().astype(int)for box in boxes:x1, y1, x2, y2 = boxface_crop = frame[y1:y2, x1:x2]rgb_crop = cv2.cvtColor(face_crop, cv2.COLOR_BGR2RGB)encs = face_recognition.face_encodings(rgb_crop)name = "未知"if encs:matches = face_recognition.compare_faces(known_encodings, encs[0])face_distances = face_recognition.face_distance(known_encodings, encs[0])if True in matches:best_match = np.argmin(face_distances)name = known_names[best_match]# 準備顯示信息label = nameif name == current_speaker:label += "(正在講話)"if current_text:label += f":{current_text}"# 繪圖(PIL 支持中文)pil_img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(pil_img)draw.rectangle([x1, y1, x2, y2], outline="green", width=2)draw.text((x1, y1 - 30), label, font=font, fill=(255, 0, 0))frame = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)cv2.imshow("實時人臉 + 聲紋 + 字幕識別", frame)if cv2.waitKey(1) & 0xFF == ord("q"):breakcap.release()
cv2.destroyAllWindows()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914540.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914540.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914540.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DH(Denavit–Hartenberg)矩陣

DH 矩陣(Denavit-Hartenberg 矩陣)是 1955 年由 Denavit 和 Hartenberg 提出的一種機器人運動學建模方法,用于描述機器人連桿和關節之間的關系。該方法通過在機器人每個連桿上建立坐標系,并用 44 的齊次變換矩陣(DH 矩…

Vim的magic模式

在 Vim 中,magic 模式用于控制正則表達式中特殊字符的解析方式。它決定了哪些字符需要轉義才能發揮特殊作用,從而影響搜索和替換命令的寫法。以下是詳細介紹: 一、三種 magic 模式 Vim 提供三種 magic 模式,通過在正則表達式前添加…

Git 使用技巧與原理(一)—— 基礎操作

1、起步 1.1 版本控制 版本控制是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。 版本控制系統(VCS,Version Control System)通常可以分為三類: 本地版本控制系統:大多都是采用某…

軟件測試之自動化測試

目錄 1.什么是自動化測試 2.web?動化測試 2.1驅動 WebDriverManager 3. Selenium 3.1selenium驅動瀏覽器的?作原理 4.常用函數 4.1元素的定位 4.1.1cssSelector選擇器 4.2.2xpath 4.2操作測試對象 4.3窗? 4.4等待 4.5瀏覽器導航 4.6彈窗 4.7文件上傳 4.8設置…

sqlserver遷移日志文件和數據文件

sqlserver安裝后沒有指定日志存儲路徑或者還原庫指定的日志存儲位置不理想想要更改,都可以按照這種方式來更換;1.前提準備:數據庫的備份bak文件2.查看自己當前數據庫的日志文件和數據文件存儲路徑是否理想選中當前數據庫,右鍵屬性…

MFC UI表格制作從專家到入門

文章目錄CListCtrl常見問題增強版CGridCtrl(第三方)第三方庫ReoGridCListCtrl 默認情況下,CListCtrl不支持直接編輯單元格,需通過消息處理實現。 1.添加控件到資源視圖 在對話框資源編輯器中拖入List Control控件,設…

數字后端APR innovus sroute到底是如何選取寬度來鋪power rail的?

吾愛IC社區新一期IC訓練營將于7月初開班(07.06號晚上第一次直播課)!社區所有IC后端訓練營課程均為直播課!全網唯一一家敢開后端直播課的(口碑不好招生一定存在困難,自然就無法開直播課)&#xf…

LVS集群技術

LVS(Linux Virtual Server)是一種基于Linux內核的高性能、高可用性服務器集群技術,它通過負載均衡將客戶端請求分發到多臺后端真實服務器,實現 scalability 和 fault tolerance。LVS工作在傳輸層(OSI Layer 4&#xff…

git項目,有idea文件夾,怎么去掉

要從Git項目中排除.idea文件夾(IntelliJ IDEA的配置文件目錄),可以通過以下步驟操作: 1. 添加.gitignore規則 在項目根目錄創建或編輯.gitignore文件,添加以下內容: .idea/2. 從Git緩存中刪除已跟蹤的.idea…

springboot+swagger2文檔從swagger-bootstrap-ui更換為knife4j及文檔接口參數不顯示問題

背景 已有springboot項目,且使用的是swagger2+swagger-bootstrap-ui的版本 1.pom依賴如下 <!-- Swagger接口管理工具 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9…

mysql數據庫表只能查詢,對于插入、更新、刪除操作一直卡住,直到報錯Lost connection to MySQL server during query

診斷步驟1. 查看阻塞進程SELECT * FROM performance_schema.metadata_locks WHERE LOCK_STATUS PENDING;SELECT * FROM sys.schema_table_lock_waits;2. 查看當前活動事務SELECT * FROM information_schema.INNODB_TRX;3. 查看進程列表SHOW PROCESSLIST;通過SELECT * FROM in…

Redis BigKey 深度解析:從原理到實戰解決方案

引言&#xff1a;什么是 BigKey&#xff1f;在 Redis 的使用場景中&#xff0c;BigKey&#xff08;大鍵&#xff09;是指那些數據量異常龐大的鍵值&#xff0c;通常表現為&#xff1a;String 類型&#xff1a;值大小超過 10KBHash/Set 等&#xff1a;元素數量超過 5000List/ZSe…

Qt 實現新手引導

Qt實現新手引導 對于一個新安裝的軟件或者一個新的功能&#xff0c;提供一個新手引導步驟&#xff0c;能夠讓用戶快速熟悉。這是最終效果&#xff0c;每一個按鈕都會有一個簡單引導&#xff0c;通過點擊上一步、下一步來切換不同的指導。當前引導的功能&#xff0c;會有一個高光…

Maven+Spring

一、Maven 相關- 本地倉庫設置&#xff1a;- 在 IDE&#xff08;如 IntelliJ IDEA&#xff09;中可以設置 Maven 的本地倉庫路徑&#xff0c;本地倉庫用于存儲從遠程倉庫下載的依賴庫&#xff0c;方便項目重復使用。- 倉庫關系&#xff1a;- 項目&#xff1a;開發中的項目&…

Android Handler 消息機制

常用場景&#xff1a; 子線程發送Message 主線程處理Message 子線程發送消息 public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {Message msg Message.obtain();msg.what what;return sendMessageDelayed(msg, delayMillis);}public final boole…

day9 串口通信

1串口通信串口通信是嵌入式系統和電子設備中最常用的 異步串行通信 方式&#xff0c;核心是通過 TX&#xff08;發送&#xff09; 和 R&#xff08;接收&#xff09; 兩根線實現全雙工數據傳輸。2通信協議分類2.1同步/異步通信同步和異步是串行通信中兩種根本不同的數據傳輸方式…

面向對象的設計模式

一、設計模式簡介1、什么是設計模式針對反復出現的問題所總結歸納出的通用解決方設計模式是指在軟件開發過程中案。這些方案是眾多軟件開發人員經過大量實踐總結出來的&#xff0c;具有高效性、可維護性和可擴展性等優點。使用設計模式可以幫助開發者更高效地構建軟件系統&…

每日釘釘API探索:chooseDepartments專注于部門維度的選擇接口

在企業級應用開發過程中&#xff0c;針對組織架構中的部門進行操作是非常常見的需求。今天我們要介紹的是釘釘的chooseDepartments API&#xff0c;它允許用戶以部門為單位進行選擇&#xff0c;并返回所選部門的相關信息。&#x1f4cc; 功能概述chooseDepartments API主要用于…

生產環境CI/CD流水線構建與優化實踐指南

生產環境CI/CD流水線構建與優化實踐指南 目錄 業務場景描述技術選型過程實現方案詳解 流水線結構設計并行構建與緩存策略部署策略&#xff1a;滾動、藍綠、金絲雀回滾與告警自動化 踩過的坑與解決方案總結與最佳實踐 業務場景描述 某大型電商平臺&#xff0c;為了保證代碼持續交…

騰訊云和火山云優劣勢對比

從問題本身看&#xff0c;用戶沒有限定具體場景&#xff0c;說明可能需要一個全面的橫向對比。不過云計算服務涉及面太廣&#xff0c;我最好先搭建一個框架性的分析結構&#xff0c;再填充具體細節。 首先想到從幾個核心維度切入&#xff1a;基礎能力&#xff08;計算存儲網絡&…