AI和Python 学习整理

用Kimi编程

PHPer 2025-08-19 1 0 0

我现在有个想法,用声音识别的模型,识别出源音频里的指定的人声,并把其提取出来,请给出合适的模型,并提供完整的python代码

根据你的需求,可以使用pyannote.audio库来实现指定人声的识别和提取。pyannote.audio是一个强大的音频处理库,能够进行说话人识别和语音分离

以下是基于pyannote.audio的Python代码示例,用于识别并提取指定人声:

安装依赖

在运行代码之前,请确保安装了以下依赖:

pip install pyannote.audio
pip install torch
pip install scipy

完整代码示例

# _*_ coding: utf-8 _*_
# @Time : 2024/3/16 10:47
# @Author : Michael
# @File : speaker_rec.py
# @desc :
import torch
from pyannote.audio import Model, Pipeline, Inference
from pyannote.core import Segment
from scipy.spatial.distance import cosine
def extract_speaker_embedding(pipeline, audio_file, speaker_label):
    """
    提取指定说话人的嵌入向量
    """
    diarization = pipeline(audio_file)
    speaker_embedding = None
    for turn, _, label in diarization.itertracks(yield_label=True):
        if label == speaker_label:
            segment = Segment(turn.start, turn.end)
            speaker_embedding = inference.crop(audio_file, segment)
            break
    return speaker_embedding
def recognize_speaker(pipeline, audio_file, speaker_embeddings):
    """
    识别给定音频中的说话人
    """
    diarization = pipeline(audio_file)
    speaker_turns = []
    for turn, _, speaker_label in diarization.itertracks(yield_label=True):
        # 提取切片的声纹特征
        embedding = inference.crop(audio_file, turn)
        distances = {}
        for speaker, embeddings in speaker_embeddings.items():
            # 计算与已知说话人的声纹特征的余弦距离
            distances[speaker] = min([cosine(embedding, e) for e in embeddings])
        # 选择距离最小的说话人
        recognized_speaker = min(distances, key=distances.get)
        speaker_turns.append((turn, recognized_speaker))
    return speaker_turns
def extract_speaker_audio(audio_file, speaker_turns, output_file):
    """
    提取指定说话人的音频片段
    """
    from pydub import AudioSegment
    audio = AudioSegment.from_wav(audio_file)
    extracted_audio = AudioSegment.silent(duration=0)
    for turn, speaker in speaker_turns:
        start_ms = int(turn.start * 1000)
        end_ms = int(turn.end * 1000)
        extracted_audio += audio[start_ms:end_ms]
    extracted_audio.export(output_file, format="wav")
if __name__ == "__main__":
    token = "hf_***"  # 请替换为您的Hugging Face Token
    # 加载声音分离识别模型
    pipeline = Pipeline.from_pretrained(
        "pyannote/speaker-diarization-3.1",
        use_auth_token=token,  # 在项目页面agree使用协议,并获取 Hugging Face Token
    )
    # 加载声纹嵌入模型
    embed_model = Model.from_pretrained("pyannote/embedding", use_auth_token=token)
    inference = Inference(embed_model, window="whole")
    # 假设您已经有一个包含不同人声的音频文件集,以及对应的人
    audio_files = {
        "mick": "mick.wav",  # mick的音频
        "moon": "moon.wav",  # moon的音频
    }
    speaker_embeddings = {}
    for speaker, audio_file in audio_files.items():
        diarization = pipeline(audio_file)
        for turn, _, speaker_label in diarization.itertracks(yield_label=True):
            embedding = extract_speaker_embedding(pipeline, audio_file, speaker_label)
            # 获取原始已知说话人的声纹特征
            speaker_embeddings.setdefault(speaker, []).append(embedding)
    # 给定新的未知人物的音频文件
    given_audio_file = "2_voice.wav"  # 前半部分是 mick 说话,后半部分是 moon 说话
    # 识别给定音频中的说话人
    recognized_speakers = recognize_speaker(pipeline, given_audio_file, speaker_embeddings)
    print("Recognized speakers in the given audio:")
    for turn, speaker in recognized_speakers:
        print(f"Speaker {speaker} spoke between {turn.start:.2f}s and {turn.end:.2f}s")
    # 提取指定说话人的音频
    target_speaker = "mick"  # 指定要提取的说话人
    target_turns = [(turn, speaker) for turn, speaker in recognized_speakers if speaker == target_speaker]
    extract_speaker_audio(given_audio_file, target_turns, f"{target_speaker}_extracted.wav")

代码说明

  1. 说话人嵌入提取:extract_speaker_embedding函数用于从音频文件中提取指定说话人的嵌入向量。
  2. 说话人识别:recognize_speaker函数通过比较嵌入向量来识别音频中的说话人。
  3. 音频提取:extract_speaker_audio函数使用pydub库从原始音频中提取指定说话人的音频片段

注意事项

  • 确保你有有效的Hugging Face Token,用于加载预训练模型
  • 你可能需要根据实际情况调整代码中的音频文件路径和说话人标签

希望这段代码能帮助你实现指定人声的识别和提取! ...

立即注册

更新于:2025-08-19 22:20:38
    您需要登录后才可以评论。 立即注册
    相关内容

    各种编程语言介绍

    Go语言

    各种编程语言介绍

    易语言-百度百科

    编程代码调试相关

    php开启错误提示

    编程应用下载地址

    rageframe2-Yii2项目百度网盘下载

    代码编程学习中发现的问题

    推荐内容

    怎样使用V2Ray代理和SSTap玩如魔兽世界/绝地求生/LOL台服/战地3/黑色沙漠/彩...

    sstap游戏代理教程 从此玩如魔兽世界/绝地求生/LOL台服/战地3/黑色沙漠/彩虹六...

    BT磁力搜索网站汇总和找不到的资源

    什么是磁力链接,您如何使用?

    Z-Library:全球最大的数字图书馆/含打不开的解决方案/镜像

    使用V2Ray的mKCP协议加速游戏

    v2rayN已停止工作

    【车险课堂】什么是无赔款优待系数ncd,你“造”吗?