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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;计算存储网络&…