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

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))


  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Whisper是一款可以实现语音识别转文字的应用软件。它可以通过下载安装在手机或电脑上,实现将语音转化为文字的功能。 使用Whisper进行语音识别转文字非常简便。首先,用户需要下载并安装Whisper应用,可以在各大应用商店或官方网站上获取。安装完成后,用户可以打开应用,并按照界面上的提示进行设置和授权。接下来,用户可以开始使用Whisper进行语音转文字的操作。 在使用Whisper进行语音识别转文字时,用户可以选择两种方式。一种是通过录制语音进行识别,用户只需按下录制按钮,开始说话,Whisper会自动将语音转化为文字。另一种方式是通过实时语音输入进行识别,用户可以直接讲话到麦克风,Whisper会实时将语音转为文字显示在屏幕上。 Whisper语音识别转文字功能非常准确和快速。它采用了先进的语音识别技术,能够准确地识别各种语音,并将其转化为文字。同时,Whisper还支持多国语言的识别,可以满足不同用户的需求。 通过Whisper进行语音识别转文字,用户可以享受到很多便利。无论是需要记录会议内容、学习笔记,还是进行语音交流的转化,Whisper都能够帮助用户快速准确地将语音转化为文字,并保存在手机或电脑上。这样,用户可以方便地进行查看、编辑和分享。 总之,Whisper是一个功能强大、操作简便的语音识别转文字应用软件,通过下载安装,用户可以随时随地将语音转化为文字,提高工作和学习的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值