Whisper语音识别 -- 自回归解码分析

前言

Whisper 是由 OpenAI 开发的一种先进语音识别系统。它采用深度学习技术,能够高效、准确地将语音转换为文本。Whisper 支持多种语言和口音,并且在处理背景噪音和语音变异方面表现出色。其广泛应用于语音助手、翻译服务、字幕生成等领域,为用户提供了更流畅的语音交互体验。作为一个开源项目,Whisper 鼓励开发者和研究人员进一步优化和创新。
在这里插入图片描述
作者将解码过程整理成 简单的python代码进行讲解

核心思想

whisper解码核心是 基于自回归解码的token游戏 ,换句话说他的参数读取是通过传入token id的形式,即采用大语言模型的prompt范式(whisper的解码器一定程度上也是个大语言模型,虽然语音训练样本token数远不及纯文本token数)
h
图中除了识别结果的框框大多数都是prompt工程, 常用的token id 如图:
在这里插入图片描述

自回归解码

在这里插入图片描述

详细解释放在代码中啦

def main():"""解码器须构建Deocder的prompt,序列为【SOT,语种,任务】, 本文中是 model.sot_sequence其中SOT:50258语种:50332,50309,50333,50335,50273,...任务:transcribe 转写 50359, translate 翻译 50358""""""加载whisper模型"""encoder_onnx_file = './small-encoder.int8.onnx'decoder_onnx_file = './small-decoder.int8.onnx'tokenizer_file = './small-tokens.txt'model = OnnxModel(encoder_onnx_file, decoder_onnx_file)token_table = load_tokenizer(tokenizer_file) # token id to char """提取MEL特征"""wav_file = "output.wav"mel = compute_features(wav_file)"""计算encoder的K/V编码 """# 交叉注意力 encoder:K/V, with decoder:Qn_layer_cross_k, n_layer_cross_v = model.run_encoder(mel)# 自注意力 decoder:K/V, with decoder:Qn_layer_self_k_cache, n_layer_self_v_cache = model.get_self_cache()"""检测语种"""lang = model.detect_language(n_layer_cross_k, n_layer_cross_v)model.sot_sequence[1] = lang"""任务选择"""# task = model.translatetask = model.transcribemodel.sot_sequence[2] = task"""根据prompt进行首次解码"""tokens = torch.tensor([model.sot_sequence], dtype=torch.int64)offset = torch.zeros(1, dtype=torch.int64)logits, n_layer_self_k_cache, n_layer_self_v_cache = model.run_decoder(tokens=tokens,n_layer_self_k_cache=n_layer_self_k_cache,n_layer_self_v_cache=n_layer_self_v_cache,n_layer_cross_k=n_layer_cross_k,n_layer_cross_v=n_layer_cross_v,offset=offset,)offset += len(model.sot_sequence)logits = logits[0, -1] # token 声学后验model.suppress_tokens(logits, is_initial=True) # 无效token后验抑制"""自回归解码"""max_token_id = logits.argmax(dim=-1) # 选择后验中最大输出的token【贪心解码】results = []sentence = {'start':0,'end':0,'text':b""} sentences = []for i in range(model.n_text_ctx):# 打印token属性if max_token_id.item() == model.sot:print("iter:%8s docode token id:%8s [sot]"%(i,max_token_id.item()))elif max_token_id.item() == model.eot:print("iter:%8s docode token id:%8s [eot]"%(i,max_token_id.item()))elif max_token_id.item() >= model.timestamp_begin:print("iter:%8s docode token id:%8s [boundary]"%(i,max_token_id.item()))else:print("iter:%8s docode token id:%8s [char]"%(i,max_token_id.item()))# eot 结束if max_token_id.item() == model.eot:print("Finish !!")break# 检测到时间戳if max_token_id.item()>=model.timestamp_begin:timestamp = ((max_token_id.item()-model.timestamp_begin)*model.time_precision)# 遇到结束符if sentence['text']:sentence['end'] = timestampsentence['text'] = sentence['text'].decode().strip()print(sentence)sentences.append(sentence)sentence = {'start':0,'end':0,'text':b""}# 遇到开始符else:sentence['start'] = timestampelse:decode_token = base64.b64decode(token_table[max_token_id.item()])sentence['text'] += decode_tokenresults.append(max_token_id.item())tokens = torch.tensor([[results[-1]]])# deocder 单步解码logits, n_layer_self_k_cache, n_layer_self_v_cache = model.run_decoder(tokens=tokens,n_layer_self_k_cache=n_layer_self_k_cache,n_layer_self_v_cache=n_layer_self_v_cache,n_layer_cross_k=n_layer_cross_k,n_layer_cross_v=n_layer_cross_v,offset=offset,)offset += 1logits = logits[0, -1]model.suppress_tokens(logits, is_initial=False)max_token_id = logits.argmax(dim=-1) # 贪心搜索

没错连时间戳也是token形式~,下面是运行结果感受一下。我们在边界处对句子进行保存
在这里插入图片描述

以上就是whisper解码的基本原理,感兴趣的同学关注走一波

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/852078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派 linux ARM 如何更新libc库

在进行嵌入是开发的时候,如果碰到 应用程序报告以下错误, 那么说明,你的嵌入式的系统 LIBC库版本过低。 这时候该怎么解决呢? 我再进行live555 开发的过程中就碰到了。 这时候,你可能需要选择比较低版本的交叉编译器,或者要选择低版本的开源库。 但是除了以上方法之…

unidbg讲解V1

前言 unidbg是什么? unidbg是一个Java项目,可以帮助我们去模拟一个安卓或IOS设备,用于去执行so文件中的算法,从而不需要再去逆向他内部的算法。最终会产出一个jar包,可以被python进行调用。 如何使用unidbg? 下载github上开源的项目:https://github.com/zhkl0228/un…

HTML的a标签如何做返回顶部的功能

在HTML中&#xff0c;<a> 标签通常用于创建超链接。要实现返回顶部的功能&#xff0c;你可以使用 <a> 标签结合JavaScript的 scrollTo() 方法&#xff08;尽管在大多数情况下&#xff0c;我们更常用 window.scrollTo(0, 0) 或 window.scroll(0, 0)&#xff09;&…

【因果推断python】32_合成控制2

目录 合成控制作为线性回归的一种实现​编辑 合成控制作为线性回归的一种实现 为了估计综合控制的治疗效果&#xff0c;我们将尝试构建一个类似于干预期之前的治疗单元的“假单元”。然后&#xff0c;我们将看到这个“假单位”在干预后的表现。合成控制和它所模仿的单位之间的…

OpenGauss常操作

OpenGauss官网已经有很详细的说明了,但是对于新手而言还有一些需要注意的地方; 安装 yum一键安装; yum -y install libaio-devel yum -y install readline-devel yum -y install libnsl 单独创建用户和组; groupadd dbgroup useradd -g dbgroup omm passwd omm 取消打开文…

关于学习Token、JWT、Cookie等验证授权方式的总结

目录 一、为什么Cookie无法防止CSRF攻击&#xff0c;而Token可以&#xff1f; 二、为什么无论采用Cookie-session的方式&#xff0c;还是Token&#xff08;JWT&#xff09;的方式&#xff0c;在一个浏览器里&#xff0c;同一个网站只能保证一个用户处于登录状态&#xff1f; …

韩顺平0基础学java——第22天

p441-459 异常exception 选中代码块&#xff0c;快捷键ctraltt6&#xff0c;即trt-catch 如果进行了异常处理&#xff0c;那么即使出现了异常&#xff0c;但是会继续执行 程序过程中发生的异常事件分为两大类&#xff1a; 异常体系图※ 常见的运行异常&#xff1a;类型转换…

vs2019 c++20规范 STL 库中头文件 <atomic> 源码注释及探讨几个知识点

&#xff08;1 探讨一&#xff09; 模板类 atomic 的继承关系与数据结构如下&#xff1a; (2 探讨二 ) 可见 atomic 的 fetch_xx 函数&#xff0c;返回的都是 atomic 中存储的旧值。测试如下&#xff1a; 谢谢

【MySQL】mysql中常见的内置函数(日期、字符串、数学函数)

文章目录 案例表日期函数字符串函数数学函数其他函数 案例表 emp students 表 exam_result 表 日期函数 注意current_time和now的区别 案例一&#xff1a; 创建一张表用来记录生日&#xff0c;表结构如下 添加日期&#xff1a; insert tmp (birthday) values (2003-01-3…

永磁同步电机滞环电流控制(PI双闭环)matlab仿真模型

微♥“电击小子程高兴的MATLAB小屋”获取模型 1.滞环电流控制的原理 将给定的电流信号与反馈的电流信号进行比较&#xff0c;然后控制它俩之间的差值稳定在一个滞环范围内&#xff0c;若超出范围&#xff0c;则进行相应的调节操作。 操作如下叙述&#xff1a;假设以三相中的A相…

【Android面试八股文】Thread.sleep()方法被调用之后可以被中断吗?

面试官:你能告诉我 Thread.sleep() 方法是否是可中断的吗?如果是,能解释一下如何中断它吗? 候选人:是的,Thread.sleep() 方法是可中断的。当一个线程正在调用 sleep() 方法时,如果另一个线程调用了这个睡眠线程的 interrupt() 方法,那么正在睡眠的线程会抛出 Interrup…

unDraw —— 免费且可定制的插画库,为您的设计注入灵魂

&#x1f3a8; unDraw —— 免费且可定制的插画库&#xff0c;为您的设计注入灵魂 在寻找能够完美融入您品牌风格的插画吗&#xff1f;unDraw&#xff0c;一个提供大量免费插画资源的网站&#xff0c;可能是您的理想选择&#xff01; &#x1f310; 网站特色 免费且开源 unDraw…

站易WordPress

站易WordPress是一家专业提供网站建设和运营服务的公司。他们提供的服务包括企业官方网站建设、网站运营维护、网站托管、网站优化、跨境独立站建站、外贸网站建设以及海外多语言网站建设等。 此外&#xff0c;站易还提供使用现成的WordPress模板&#xff0c;这样可以快速且低…

项目太大导致报错:JavaScript堆内存已满

1.问题 启动一个Vue项目的时候遇到了如下的报错 Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 无效的标记压缩导致接近了堆上限&#xff0c;分配失败 - JavaScript内存不足 2.解决方法 我查阅了网上的资料&#xff0c;似乎…

udp协议下的socket函数

目录 1.网络协议 2.网络字节序 3.socket编译接口 4.sockaddr结构体 5.模拟实现 1.socket函数 2.bind函数&#xff08;绑定&#xff09; 1.讲解 1.如何快速的将 整数ip<->字符串 2.ip地址的注意事项 3.端口号的注意事项 3.recvfrom函数 4.sendto函数 5.代码呈…

不测评不知道,该这款主食冻干嚣张!PR、希喂、扑呀真实测评

主食冻干喂养越来越火了&#xff0c;除了知名的“四大金刚”K9、VE、SC、PR之外&#xff0c;也有像希喂、扑呀这类以营养、高肉含量为切入点的新锐品牌&#xff0c;各大猫粮商更是纷纷推出了自家的主食冻干产品。目前关于主食冻干的讨论也很多&#xff0c;但大多数还是以科普和…

江苏哪些行业需要服务器托管?

服务器托管顾名思义就是用户委托具有完善设备的机房、良好网络和丰富运营经验的服务商管理其计算机系统&#xff0c;使企业的服务器能够更加安全、稳定和高效的运行&#xff0c;那在江苏都有哪些行业需要服务器托管服务呢&#xff1f;本文就来大概介绍一下。 首先让我们来一起了…

spring管理的对象通过@Init注解修饰的方法不会在new对象的时候触发

Spring 管理的对象的初始化(init)函数并不会在 new 对象的时候自动触发,而是在 Spring 容器创建和初始化对象的时候触发。 Spring 容器管理对象的初始化过程包括以下几个步骤: 1 实例化对象 - Spring 容器使用构造函数或工厂方法创建对象实例。 注入属性 - Spring 容器会自动…

活久见!谁想的这种办法让大模型PK

文&#xff5c;白 鸽 编&#xff5c;王一粟 “每个大模型看起来都差不多&#xff0c;只能谁便宜先用谁的。但用下来之后&#xff0c;不合适再换&#xff0c;又费钱又费力”&#xff0c;一位AI 招聘公司的创始人对光锥智能抱怨道。 2024年&#xff0c;大模型正在加速走向行…

【Apollo配置中心】集成springboot自动监听属性变更和动态发布配置

1. 背景 在实际项目中&#xff0c;Spring Boot项目结合使用Apollo配置中心时&#xff0c;经常会遇到需要更新Apollo上的项目的一些配置&#xff0c;比如测试环境或生产环境中&#xff0c;需要修改某个类的属性值&#xff0c;如果我们在Apollo上更新了配置&#xff0c;已经在运…