菜单

分词

相关源文件

此页面介绍了 Whisper 自动语音识别模型中使用的分词系统。分词是将文本转换为模型可处理的整数标记序列的过程。Whisper 的分词器既可以处理将文本编码为用于模型训练的标记,也可以处理将标记解码为用于生成转录文本。它还为时间戳、多语言支持和词级分词提供了特殊处理。

有关分词前音频处理的信息,请参阅 音频处理。有关分词在解码系统中如何使用的详细信息,请参阅 解码系统

概述

Whisper 分词器实现了 tiktoken 库的封装,提供了高效的分词功能,并对时间戳、语言标识符和控制标记进行了特殊处理。该分词器支持多语言和纯英语模式,每种模式都有不同的词汇表。

图示:分词器组件概述

来源: whisper/tokenizer.py131-327 whisper/tokenizer.py366-395

分词器类

分词的主要类是 Tokenizer 类,它封装了底层的 tiktoken 编码功能,并加入了 Whisper 特有的功能。

关键属性

  • encoding:tiktoken 编码对象
  • num_languages:支持的语言数量
  • language:当前语言(可选)
  • task:当前任务(“转录”或“翻译”)
  • sot_sequence:开始转录标记序列
  • special_tokens:将特殊标记字符串映射到其 ID 的字典

关键方法

  • encode(text):将文本转换为标记 ID
  • decode(token_ids):将标记 ID 解码回文本(忽略时间戳标记)
  • decode_with_timestamps(token_ids):解码带有时间戳注释的标记
  • split_to_word_tokens(tokens):将标记序列分割为词级标记

图示:分词器类结构

来源: whisper/tokenizer.py131-327

标记类型和特殊标记

Whisper 使用几种特殊标记类别来控制模型的行为并促进多语言转录。

特殊标记类型

  1. 控制标记

    • <|startoftranscript|> (SOT):标记转录的开始
    • <|endoftext|> (EOT):标记转录的结束
    • <|transcribe|>:指示转录任务
    • <|translate|>:指示翻译任务
    • <|notimestamps|>:禁用时间戳预测
  2. 语言标记

    • 示例:英语为 <|en|>,中文为 <|zh|>
    • 支持的 99 种以上语言的每种语言一个标记
  3. 时间戳标记

    • 格式:<|t.tt|> 表示秒为单位的时间戳
    • 示例:<|0.00|><|1.28|><|30.00|>
    • 1501 个时间戳标记,涵盖 0.00 到 30.00 秒,步长为 0.02 秒

图示:特殊标记类别

来源: whisper/tokenizer.py10-111 whisper/tokenizer.py340-356

SOT 序列构建

开始转录 (SOT) 序列是 Whisper 提示机制的关键组成部分。它结合了多个特殊标记来控制模型的行为。

图示:SOT 序列构建

来源: whisper/tokenizer.py142-159 whisper/tokenizer.py239-240

分词器创建

get_tokenizer() 函数作为工厂,根据是否需要多语言功能来创建配置适当的分词器实例。

图示:分词器创建流程

来源: whisper/tokenizer.py366-395 whisper/tokenizer.py330-363

编码与词汇表

Whisper 使用两个不同的词汇表

  1. GPT-2 词汇表:用于纯英语模式
  2. 多语言词汇表:用于多语言模式

词汇表以 tiktoken 兼容文件的形式存储,并由 get_encoding() 函数加载。

词汇表统计

词汇表基础标记特殊标记总大小
GPT-2~50,000~1,600~51,600
多语言~50,000~1,600~51,600

注意:确切的词汇表大小取决于配置参数,例如 num_languages

来源: whisper/tokenizer.py330-363 whisper/assets/gpt2.tiktoken

多语言支持

该分词器支持 99 种以上语言,并提供特定语言的标记。每种语言都有相应的语言代码,并被分配一个唯一的标记 ID。

语言处理流程

图示:语言解析流程

来源: whisper/tokenizer.py10-128 whisper/tokenizer.py374-380 whisper/tokenizer.py219-223

词级分词

对于需要词级处理(如词级时间戳)的应用,分词器提供了将标记序列分割为词级标记的方法。

特定语言的词语分割

分词器对不同语言类型使用不同的策略

  1. 以空格分隔的语言:大多数欧洲语言 - 词语根据空格和标点符号进行分割。
  2. 无空格语言:中文、日文、泰文等 - 词语在任何可以解码为有效 Unicode 点的位置进行分割。

图示:词级分词过程

来源: whisper/tokenizer.py277-327

实现细节

编码过程

编码过程相对直接,因为它委托给底层的 tiktoken 编码器。

解码过程

解码过程有两种变体

  1. 标准解码:忽略时间戳标记(ID 大于 timestamp_begin 的标记)
  2. 带时间戳的解码:在输出文本中包含时间戳注释

非语音标记抑制

分词器提供了一份非语音标记列表,这些标记可以在生成过程中被抑制,以防止采样实际音频中未说出的文本。

来源: whisper/tokenizer.py161-174 whisper/tokenizer.py242-276

使用示例

创建分词器

编码和解码文本

来源: whisper/tokenizer.py366-395 whisper/tokenizer.py161-174

测试

分词器包含验证其功能的测试用例

  1. 基本功能测试:确保 SOT 序列构建正常工作
  2. 多语言分词测试:比较英语和多语言分词器
  3. 词语分割测试:测试不同的词语分割策略

测试位于 `tests/test_tokenizer.py` 文件中。

来源: tests/test_tokenizer.py1-34