whisper tokenizer

目录

PreTrainedTokenizerFast

labels值都一样吗

为什么需要这些labels?


PreTrainedTokenizerFast

python 复制代码
from transformers import PreTrainedTokenizerFast

tokenizer = PreTrainedTokenizerFast.from_pretrained("openai/whisper-base")

tokenizer 的词表(vocabulary)

self.vocab = self.processor.tokenizer.get_vocab() whisper 这个是什么

Whisper 模型是 OpenAI 推出的一个语音识别(ASR)模型,其输入是音频,但它的输出是文本。文本输出是通过一个 tokenizer 将文字转换成 token ID(数字)再经过模型预测输出的。

python 复制代码
self.processor.tokenizer.get_vocab()
  • self.processor:通常是一个 WhisperProcessor 实例,封装了 Whisper 模型使用的 tokenizer 和 feature extractor。

  • self.processor.tokenizer:是 Whisper 使用的 tokenizer(比如基于 SentencePiece 的 tokenizer)。

  • get_vocab():返回一个字典 {token_string: token_id},即词表。


🔍 举例:

返回值可能是这样的一个字典(只是示意):

python 复制代码
{ "<s>": 0, "</s>": 1, 
"hello": 432, 
"world": 987, 
"▁the": 52, 
"▁": 3, 
"": 50256, ... }

其中:

  • token 是字符串,有些前面带 (表示空格,来源于 SentencePiece/BPE)

  • 值是整数,是对应 token 的 ID


📌 使用场景:

  • 分析模型词表分布,比如哪些 token 被频繁使用;

  • 实现 token 到字符的反向映射(vocab.items() 反转可得到 {id: token});

  • 做语言分析、可视化、调试等。

whisper 获取 tokenizer

python 复制代码
# coding=utf-8
import sys
import os
current_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(current_dir)
print('current_dir', current_dir)
paths = [current_dir, current_dir+'/../']

paths.append(os.path.join(current_dir, 'src'))

for path in paths:
    sys.path.insert(0, path)
    os.environ['PYTHONPATH'] = (os.environ.get('PYTHONPATH', '') + ':' + path).strip(':')

from addict import Dict
from transformers import Seq2SeqTrainer, Seq2SeqTrainingArguments, WhisperForConditionalGeneration, WhisperProcessor

from typing import List

def _load_timestamps_transcript(self, transcript: List[dict]):
    assert isinstance(transcript, list), f"transcript应该为list,当前为:{type(transcript)}"
    data = dict()
    labels = self.processor.tokenizer.prefix_tokens[:3]
    for t in transcript:
        # 将目标文本编码为标签ID
        start = t['start'] if round(t['start'] * 100) % 2 == 0 else t['start'] + 0.01
        if self.timestamp_begin is None:
            start = self.vocab[f'<|{start:.2f}|>']
        else:
            start = self.timestamp_begin + round(start * 100) // 2
        end = t['end'] if round(t['end'] * 100) % 2 == 0 else t['end'] - 0.01
        if self.timestamp_begin is None:
            end = self.vocab[f'<|{end:.2f}|>']
        else:
            end = self.timestamp_begin + round(end * 100) // 2
        label = self.processor(text=t['text']).input_ids[4:-1]
        labels.extend([start])
        labels.extend(label)
        labels.extend([end])
    data['labels'] = labels + [self.endoftext]
    return data



if __name__ == '__main__':

    args = Dict()
    args.base_model="models/whisper-large-v3-finetune"
    args.language='zh'
    args.task="transcribe"#['transcribe', 'translate']
    args.timestamps=False
    args.local_files_only=True

    
    args.processor = WhisperProcessor.from_pretrained(args.base_model,
                                                language=args.language,
                                                task=args.task,
                                                no_timestamps=not args.timestamps,
                                                local_files_only=args.local_files_only)

    labels = args.processor.tokenizer.prefix_tokens[:3]

    print(labels)
    transcript=["asdf"]
    _load_timestamps_transcript(args, transcript)

labels值:[50258, 50260, 50360]

labels值都一样吗

不,值不一样prefix_tokens[:3]的值会根据以下参数变化:

  • 语言参数 (args.language): 不同语言对应不同的token ID

    • 英语可能是50358
    • 中文可能是50359
    • 西班牙语可能是50360
    • 以此类推(具体值取决于Whisper的tokenizer实现)
  • 任务参数 (args.task):

    • "transcribe"(转录)对应一个token ID
    • "translate"(翻译)对应另一个token ID

例如:

  • 英语转录任务:[50258, 50358, 50359](对应<|startoftranscript|>, <|en|>, <|transcribe|>
  • 中文翻译任务:[50258, 50359, 50363](对应<|startoftranscript|>, <|zh|>, <|translate|>

为什么需要这些labels?

这些前缀标记是Whisper模型能够支持多语言、多任务的关键机制。模型通过这些特殊标记来"知道":

  1. 输入语音是什么语言
  2. 应该执行转录还是翻译任务
  3. 输出应该是什么语言(翻译任务时)

当您设置language=args.languagetask=args.task参数时,WhisperProcessor会自动为您生成相应的prefix tokens,这就是为什么labels的值会随着这些参数变化而变化。

这是Whisper区别于其他语音识别模型的一个重要特点,使它能够用一个统一的模型处理多种语言和任务。

相关推荐
christine-rr29 分钟前
linux常用命令(4)——压缩命令
linux·服务器·redis
三坛海会大神5551 小时前
LVS与Keepalived详解(二)LVS负载均衡实现实操
linux·负载均衡·lvs
東雪蓮☆1 小时前
深入理解 LVS-DR 模式与 Keepalived 高可用集群
linux·运维·服务器·lvs
qq_264220891 小时前
LVS负载均衡群集和LVS+Keepalived群集
运维·负载均衡·lvs
乌萨奇也要立志学C++1 小时前
【Linux】进程概念(二):进程查看与 fork 初探
linux·运维·服务器
雨落Liy1 小时前
Nginx 从入门到进阶:反向代理、负载均衡与高性能实战指南
运维·nginx·负载均衡
Yyyy4822 小时前
Nginx负载均衡集群实验步骤
运维·nginx·负载均衡
绿箭柠檬茶2 小时前
Ubuntu 服务器配置转发网络访问
服务器·网络·ubuntu
獭.獭.3 小时前
Linux -- 信号【上】
linux·运维·服务器
hashiqimiya3 小时前
centos配置环境变量jdk
linux·运维·centos