【ASR代码】基于pyannote和whisper的语音识别代码

本文介绍了如何使用Pyannote库进行语音转文本处理,提取时间戳和文本信息,并结合SpeakerDiarization技术,将音频中的不同说话者及其对应的内容分开,保存为结构化的对话记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from pyannote.core import Segment
import whisper
import pickle
import torch
import time
import os
from zhconv import convert
from pyannote.audio import Pipeline
from pyannote.core import Annotation
def get_text_with_timestamp(transcribe_res):
    timestamp_texts = []
    for item in transcribe_res["segments"]:
        start = item["start"]
        end = item["end"]
        # text = convert(item["text"],'zh-cn').strip()
        text=item["text"]
        timestamp_texts.append((Segment(start, end), text))
    return timestamp_texts


def add_speaker_info_to_text(timestamp_texts, ann):
    spk_text = []
    for seg, text in timestamp_texts:
        print(ann.crop(seg))
        spk = ann.crop(seg).argmax()
        spk_text.append((seg, spk, text))
    return spk_text


def merge_cache(text_cache):
    sentence = ''.join([item[-1] for item in text_cache])
    spk = text_cache[0][1]
    start = round(text_cache[0][0].start, 1)
    end = round(text_cache[-1][0].end, 1)
    return Segment(start, end), spk, sentence


PUNC_SENT_END = ['.', '?', '!', "。", "?", "!"]


def merge_sentence(spk_text):
    merged_spk_text = []
    pre_spk = None
    text_cache = []
    for seg, spk, text in spk_text:
        if spk != pre_spk and len(text_cache) > 0:
            merged_spk_text.append(merge_cache(text_cache))
            text_cache = [(seg, spk, text)]
            pre_spk = spk
        elif spk==pre_spk and text==text_cache[-1][2]:
            print(text_cache[-1][2])
            print(text)
            continue

            # merged_spk_text.append(merge_cache(text_cache))
            # text_cache.append((seg, spk, text))
            # pre_spk = spk
        else:
            text_cache.append((seg, spk, text))
            pre_spk = spk
    if len(text_cache) > 0:
        merged_spk_text.append(merge_cache(text_cache))
    return merged_spk_text


def diarize_text(transcribe_res, diarization_result):
    
    timestamp_texts = get_text_with_timestamp(transcribe_res)
    spk_text = add_speaker_info_to_text(timestamp_texts, diarization_result)
    res_processed = merge_sentence(spk_text)
    return res_processed

# def write_to_txt(spk_sent, file):
#     with open(file, 'w') as fp:
#         for seg, spk, sentence in spk_sent:
#             line = f'{seg.start:.2f} {seg.end:.2f} {spk} {sentence}\n'
#             fp.write(line)
# def format_time(seconds):
#     # 计算小时、分钟和秒数
#     hours = seconds // 3600
#     minutes = (seconds % 3600) // 60
#     seconds = seconds % 60
    
#     # 格式化输出
#     return f"{hours:02d}:{minutes:02d}:{seconds:02d}"
if __name__=="__main__":
    sd_config_path="./models/speaker-diarization-3.1/config.yaml"
    asr_model=whisper.load_model("large")
    asr_model.to(torch.device("cuda"))

    speaker_diarization = Pipeline.from_pretrained(sd_config_path)
    speaker_diarization.to(torch.device("cuda"))
    files = os.listdir("./audios_wav")
    
    for file in files:
        start_time = time.time()
        print(file)
       
        dialogue_path="./audios_txt/"+file.split(".")[0]+".pkl"
        audio="./audios_wav/"+file
        asr_result = asr_model.transcribe(audio,initial_prompt="输入的音频是关于一个采访内容,接下来您将扮演一个优秀记录能力的听众,通过倾听语音内容,将语音信息通过文字的方式记录下来。请你首先要判断语音中讲话者的讲话内容和语气,根据内容和语气记录带有标点符号的文本信息。具体要求为:1、中文语音的文本字体为简体中文,其他类型语音根据语音中说话的语种类型记录;2、文本信息的标点符号和文本内容要准确,不能捏造信息,同一段语音不能重复识别,不能捏造语音的语种类型;示例输出格式:-就AI的研发和部署而言,为什么你觉得中国很快就能赶上、甚至赶超美国?-首要原因是AI已经完成了从探索阶段到应用阶段的转型。在探索阶段,最先取得探索成果的人拥有绝对优势;然而现在AI算法已为诸多业内实践人士所熟知。所以,现在的关键在于速度、执行、资本以及对海量数据的获取,而中国在以上每个层面都具有优势。")
        asr_time=time.time()
        print("ASR time:"+str(asr_time-start_time))

        diarization_result: Annotation = speaker_diarization(audio)
        final_result = diarize_text(asr_result, diarization_result)
        
        dialogue=[]
        for segment, spk, sent in final_result:
            content={'speaker':spk,'start':segment.start,'end': segment.end,'text':sent}
            dialogue.append(content)
            print("%s [%.2fs -> %.2fs] %s " % (spk,segment.start, segment.end, sent))
        with open(dialogue_path, 'wb') as f:
            pickle.dump(dialogue, f)
        end_time = time.time()
        print(file+" spend time:"+str(end_time-start.time))


### 关于ASR语音识别Python代码实现 对于自动语音识别(Automatic Speech Recognition, ASR),可以采用Whisper模型来完成从音频到文本的转换工作。下面是一个基于`whisper`库的简单例子,该实例展示了如何加载预训练好的模型并执行基本的语音转文字操作[^1]。 ```python import whisper # 加载小型版本的 Whisper 模型 model = whisper.load_model("base") # 对指定路径下的音频文件进行解码处理 result = model.transcribe("./example.wav") print(result["text"]) ``` 这段脚本首先导入了必要的模块,并选择了大小适中的基础版Whisper模型用于测试目的;接着指定了待分析的目标音频文件的位置,在此案例中为当前目录下名为`example.wav`的文件;最后打印出了由音频解析得到的文字内容。 如果希望进一步提高系统的实用性,则可能涉及到更复杂的设置服务端部署方案。例如利用NVIDIA Triton Inference Server来进行高效的在线推理服务构建[^2]: #### 使用Triton Inference Server 部署ASR系统 当考虑大规模生产环境中运行时,除了上述简单的命令行工具外,还可以借助像Triton这样的平台简化多租户环境下多个AI模型的同时管理与调用过程。具体来说就是先准备好适合特定硬件架构优化过的ONNX格式或其他兼容格式的模型文件,再按照官方文档指导安装配置好服务器软件包之后上传所需资源即可开始提供RESTful API形式的服务接口供客户端请求访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值