AliOsm/cohere-transcribe-ruby
GitHub: AliOsm/cohere-transcribe-ruby
纯 Ruby 原生扩展实现的 Cohere 阿拉伯语/英语 ASR 模型批量语音转录工具,无需 Python 运行时即可在生产环境中运行。
Stars: 1 | Forks: 0
# cohere-transcribe
适用于原生 Transformers Cohere ASR 检查点的 Ruby 4 转录工具。该 gem 映射了 Python 包的公共 API 和命令行界面,同时将推理完全保留在 Ruby 和原生 C/C++ ABI 中——没有 Python 运行时、worker、子进程或模型服务器。
核心 Dense 路径支持固定版本的阿拉伯语/英语模型、兼容的 Hub 微调以及本地 Dense 检查点。它包括 16 kHz 音频解码/重采样、Silero v6 ONNX VAD、兼容 Auditok 的能量 VAD、固定窗口分段、原生批量推理、精确的解码器停止/重试元数据、固定版本的 MMS CTC 词对齐、字幕提示、事务性发布、进度回调以及可重用的模型会话。
## 要求
- 64 位 Ruby `>= 4.0, < 5.0`(Dense 模型超过了 32 位地址空间)
- 64 位 Linux 或 macOS;打包的原生源码构建目前不支持 Windows
- 从源码安装时需要 CMake 3.15+ 和 C++20 编译器
- FFmpeg 4-8 共享库,用于支持完整的容器/编解码器集合
- `libsndfile` 和 `libsamplerate` 共享库,作为原生 FFmpeg 适配器不可用时的后备
- 当所选模型需要身份验证时,需要一个 Hugging Face token
- 足够的存储空间用于源检查点及其缓存的 F16、BF16 或 F32 GGUF 转换;词对齐还会额外下载一个固定版本的 1.18 GiB FP32 MMS ONNX 模型(在 CUDA 上则为 603 MiB FP16 模型)
原生扩展默认构建一个可移植的 CPU 后端。加速器的可用性取决于构建标志和平台;必要时可设置 `COHERE_TRANSCRIBE_NATIVE_LIBRARY` 来使用单独构建的 CrispASR 库。
Dense 转换和推理支持固定检查点和兼容 Dense 微调的 F16、BF16 和 F32 GGUF 权重。CPU 执行解析为 FP32。当加载的运行时报告硬件支持时,CUDA `auto` 选择 BF16,否则选择 FP16;MPS `auto` 选择 FP16。明确不支持的 BF16 加速器请求会直接失败,而不是静默更改精度。
音频解码永远不会启动 `ffmpeg` 可执行文件。打包的 `libcohere_audio` 适配器动态绑定兼容的 libavformat/libavcodec/libavutil/libswresample 元组,并将第一个音频流直接解码为单声道 16 kHz float PCM。此路径涵盖 AAC、AIFF、ALAC、FLAC、M4A、MP3、MP4、Ogg/Vorbis、Opus、WAV、WebM 和 WMA。显式的 `torchcodec` 和 `librosa` 兼容模式通过该 C ABI 使用相同的 FFmpeg 编解码运行时,在报告结果来源中的具体解码器的同时,保留了完整的受支持格式集。如果适配器缺失,`auto` 和 `librosa` 可以回退到 libsndfile/libsamplerate 以支持这些库支持的格式。在添加版本元数据之前构建的音频适配器仍然可加载;如果没有该元数据,Ruby 封装器会使用旧的声道布局表,这对于具有八个或更少声道的常见输入是相同的,但对于不常见的 14 或 16 声道布局可能会有所不同。
FFmpeg 适配器为持续时间探测和完整解码提供了单调的截止时间(分别为 30 秒和一小时),并共享一个基于生成的协作取消钩子。它向输入 I/O 提供 FFmpeg 的公共 `AVIOInterruptCB`,并在编解码器和重采样器调用之间检查取消。因此,当 FFmpeg 调用该回调或返回控制权时,取消会生效;它不会强行展开不可中断的编解码器或系统调用。
## 安装说明
发布构件是一个源码 gem。RubyGems 会自动安装 Ruby 依赖项,然后在本地构建原生运行时。在继续之前,请确认 `ruby --version` 显示的是 64 位 Ruby 4.x 安装。
### Ubuntu 或 Debian:CPU
```
sudo apt update
sudo apt install build-essential cmake ffmpeg libsndfile1 libsamplerate0
gem install cohere-transcribe
```
这将创建可移植的 CPU 构建。`ffmpeg` 包提供了原生音频适配器使用的共享编解码器库;该 gem 不会调用 `ffmpeg` 可执行文件,也不需要 FFmpeg 开发头文件。
### Ubuntu 或 Debian:CUDA
按照 NVIDIA 的 [Linux CUDA 安装指南](https://docs.nvidia.com/cuda/cuda-installation-guide-linux/) 安装 NVIDIA 驱动程序和 CUDA 工具包,并确认 `nvcc` 可用。CUDA 构建需要 CMake 3.18 或更高版本。
```
sudo apt update
sudo apt install build-essential cmake ffmpeg libsndfile1 libsamplerate0
COHERE_TRANSCRIBE_CUDA=1 gem install cohere-transcribe
```
如果相同的 gem 版本已经作为 CPU 构建安装,请在 CUDA 安装命令中添加 `--force`,以便 RubyGems 重新构建原生扩展。
### macOS:CPU 或 Metal
从 Homebrew 安装 Apple 的命令行构建工具和运行时库:
```
xcode-select --install
brew install cmake ffmpeg libsndfile libsamplerate
```
对于 CPU:
```
gem install cohere-transcribe
```
对于 Metal:
```
COHERE_TRANSCRIBE_METAL=1 gem install cohere-transcribe
```
Metal 构建还需要 Xcode 的 `metal` 和 `metallib` 工具;Apple 记录了可单独安装的 [Metal 工具链](https://developer.apple.com/documentation/Xcode/downloading-and-installing-additional-xcode-components)。替换相同版本的现有 CPU 安装时,请添加 `--force`。
### Bundler
在应用程序内部,`bundle add` 可以替代 `gem install`;CUDA 和 Metal 环境标志的工作方式相同:
```
bundle add cohere-transcribe
```
### 验证安装
```
cohere-transcribe-doctor
cohere-transcribe-doctor --model-access
```
第一个命令检查本地运行时而不加载 ASR 权重。第二个命令还会解析所选模型元数据,并且可能需要 `HF_TOKEN`。模型权重是在首次使用时下载的,而不是在 `gem install` 期间。
有关主机 CPU 调优、OpenMP、并行构建作业、自定义 CMake 参数和外部原生库覆盖,请参阅[原生运行时构建说明](ext/cohere_transcribe_native/README.md)。
## Ruby API
一次性转录会自动创建并关闭会话:
```
require "cohere/transcribe"
options = Cohere::Transcribe::TranscriptionOptions.new(
language: "ar",
device: "auto",
vad: "silero",
vad_engine: "auto",
alignment: "word"
)
run = Cohere::Transcribe.transcribe("speech.wav", options: options)
result = run.single
puts result.text
result.words.each do |word|
puts "%.2f..%.2f %s" % [word.start, word.end, word.text]
end
```
使用 `Transcriber` 保留模型以进行重复调用:
```
transcriber = Cohere::Transcribe::Transcriber.new(options)
begin
first = transcriber.transcribe("first.wav")
second = transcriber.transcribe(["second.wav", "recordings/"])
ensure
transcriber.close
end
```
输入可以是字符串、类路径对象,或者文件和目录的有序数组。公共路径和模型引用字符串必须包含有效的 UTF-8 字节;包含有效 UTF-8 的二进制编码字符串会在不改变其字节的情况下进行规范化,而无法解码的字节名称会在工作开始前被拒绝。目录展开是确定性的,默认递归,并且会对规范路径进行去重。一次运行会保留该展开顺序,并提供 `successful`、`failed`、`skipped`、`single` 和 `ok?` 辅助方法。
单文件的媒体失败将作为失败结果返回,以便批处理中的其余部分可以继续完成。传入 `raise_on_error: true` 以引发 `BatchTranscriptionError`;其 `run` 仍然包含每个已完成的结果。
进度回调接收不可变的 `ProgressEvent` 值:
```
callback = ->(event) do
if event.message
warn event.message
elsif event.total
warn "#{event.stage}: #{event.current}/#{event.total}"
end
end
run = Cohere::Transcribe.transcribe("speech.wav", progress: callback)
```
## 持久化输出
内存中的 API 默认不写入任何内容。添加 `PublicationOptions` 以创建 TXT、SRT、VTT 和 JSON 文件:
```
publication = Cohere::Transcribe::PublicationOptions.new(
formats: %w[txt srt vtt json],
output_dir: "transcripts",
existing: "error", # error, overwrite, or skip
profile_json: "transcripts/profile.json"
)
options = Cohere::Transcribe::TranscriptionOptions.new(publication: publication)
run = Cohere::Transcribe.transcribe("recordings", options: options)
```
来自同一个源的所有格式在提交前都会进行暂存。如果暂存失败,将保留现有输出,并且在 `output_dir` 下保留相对于目录的结构。
并发发布者通过输出旁边的一个持久化 `.cohere-transcribe-locks` 目录进行协调。其访问模式遵循输出目录,因此可以在那里发布的协作者可以使用相同的锁。新的或当前用户拥有的共享可写注册表在文件系统支持的情况下会设置粘滞位;没有该位的多用户可写且无主注册表将被拒绝并提供修复指导。权威的输出相邻锁会在检查点和输出提交边界重新验证,因此替换其路径会中止提交,即使在无法保留粘滞位的文件系统上也是如此。完全验证过的 `existing: "skip"` 运行不需要创建或修改锁目录。0.1 发布系列还会获取已发布的 0.1.2 临时锁,用于混合版本协调;只有在规范锁仍然保持时才能容忍该临时路径的消失,即使在 rescue 处理程序内部运行验证,替换也会被拒绝,兼容性将保持到 0.2.0 预发布版本,并且该路径将在最终的 0.2.0 版本中删除。对于在只读锁文件上拒绝独占锁的文件系统,将返回类型化的运行时错误;它永远不会替换为非独占锁。
持久化发布绑定计划的输出根目录和父目录 inode,然后相对于保留的目录描述符执行暂存、备份、提交、回滚和清理。因此,并发的目录重命名或符号链接替换无法重定向转录、检查点、清单或配置文件字节。如果异常或非局部退出导致提交完成前的恢复不完整,类型化的失败会命名每个保留的备份或临时文件,并将原始异常保留为其原因。线程终止仍然会尝试回滚和清理,但即使该恢复不完整,它也是终止性的。普通的提交后清理失败也是类型化的;一旦提交被持久化,在终止期间提交后的清理仍然是尽力而为的。如果计划的路径身份发生更改,或者如果平台缺少 `O_NOFOLLOW` 和 POSIX 的 `openat`、`renameat` 和 `unlinkat` 原语,发布会返回类型化错误;受支持的 Linux 和 macOS 目标提供了这些原语。
发布状态记录源的规范路径、设备、inode、大小、纳秒级 mtime 和纳秒级 ctime,以及状态 payload 和已发布构件的校验和。使用 `existing: "skip"` 时,在 PCM 解码、VAD 或打开 Dense 模型会话之前解析已验证的清单;尽力而为的元数据持续时间探测会在不具体化 PCM 的情况下提供跳过结果的持续时间。
启用发布时,已完成的 Dense ASR 会在计时和渲染之前进行检查点保存。稍后的运行会在相同的预检期间验证源快照、ASR 合约和检查点内容。仅限渲染的更改随后可以重建分段/无对齐的输出,而无需解码音频、运行 VAD 或打开 Dense。词对齐的恢复同样会跳过 Dense 和 VAD 准备,但会通过记录的具体音频后端重新解码,因为 MMS 需要完整的波形。
`profile_json` 编写兼容 Python 的配置 schema,同时将控制器细节保留在配置文件中,而不是扩展稳定的 `TranscriptionStatistics` 值。其 ASR 部分包括有效的批处理最小/最大值、最终大小/上限、批处理历史记录以及检查点写入/恢复计数。即使 `vad_merge` 合并了这些区间,单文件行仍保留原始的 VAD 跨度计数/持续时间和所选音频持续时间;JSON 转录输出同样在 `segmentation_details.speech_spans` 中保留原始跨度。
## CLI
```
cohere-transcribe interview.wav
cohere-transcribe recordings/ --language ar --formats txt srt vtt json
cohere-transcribe speech.wav --vad auditok --alignment segment
cohere-transcribe speech.wav --vad none --max-dur 30 --text-only
```
运行 `cohere-transcribe --help` 获取完整的兼容 Python 的 54 选项界面。退出状态在成功时为 `0`,文件失败时为 `1`,命令行错误时为 `2`,中断时为 `130`,终止时为 `143`。
## 原生批处理和生成控制
分段运行时使用 CrispASR 的填充式 Cohere 编码器和参差不齐的贪心解码器来实现真正的原生批处理。`batch_size`、`batch_max_size`、`batch_audio_seconds` 和 `adaptive_batch` 控制行数、填充音频预算和有界增长。一次原生会话调用最多接受 24 个逻辑行。在内部,它运行连续的最多八行的填充编码器微批次,收集它们有效的编码器状态,并将所有逻辑行提供给一个参差不齐的解码器调用。Ruby 控制器将自身限制在已加载会话报告的容量内,并且会话 ABI 会拒绝超出该容量的调用。分配失败会被递归拆分,而不会丢弃成功的行。词对齐请求保留相同的原生 ASR 批处理。它们作为两个显式阶段运行:每个文件使用一个保留的 Dense 会话完成 ASR,然后在一个保留的 MMS 会话对齐并发布已完成文件之前,Dense 被逐出一次。因此,这两个阶段永远不会将 2B ASR 检查点和 300M 对齐器共存于内存中。
原生推理失败通过 C ABI 携带线程局部的错误类型和诊断消息。Ruby 将无效参数和不变违规映射为致命失败,将分配器失败映射为 OOM,并将普通的运行时失败映射为可隔离的错误。只有类型化的 OOM 失败才会通知较小的自适应批次上限;致命失败会打开保留会话的断路器。
对于多文件运行,`preprocess_workers` 并发解码和分段一个有序的准备组,而 `pipeline_preparation` 只允许紧随其后的一个组与当前 ASR 重叠。每个普通的流水线组的大小上限为 `audio_memory_gb` 的一半和 512 MiB 保留单声道 float PCM 中的较小者,基于元数据的大小估计会分配单文件上限,而不是平均分配上限。没有可用估计的文件最初平均共享组上限。已知估计超过组上限的文件将单独准备,具有完整的 `audio_memory_gb` 上限且没有相邻组重叠。如果元数据丢失或了某个分组解码,则仅重试该文件,同时只要剩余配置的 PCM 预算充足,成功解码的音频将保留。如果重试仍然需要完整的上限,则该文件之后的保留音频将被释放,并且只有那些成功的条目会按顺序再次准备;不相关的失败不会重复。原生编解码器瞬态会增加短暂的开销。禁用 `pipeline_preparation` 以使用完全顺序的路径。自动 worker 选择对一个文件使用一个 worker,其他情况最多使用两个;显式计数受可用处理器和组大小的限制。解码/VAD 失败仍然按文件隔离,结果、进度事件和发布始终遵循输入顺序。词对齐不会跨其阶段边界保留那些准备好的波形。它一次通过 ASR 期间记录的具体后端重新解码一个文件(仅当相邻的 PCM 对适合 `audio_memory_gb` 时才进行一次预读),并拒绝后端或采样计数漂移。可恢复的 ASR 检查点直接进入对齐阶段,无需重新打开 Dense 或重复解码/VAD 准备。
`pin_memory` 为了 Python API/CLI 兼容性仍然被接受,但在此 ggml 运行时中解析为 `false`。Ruby 通过原生会话 ABI 直接传递 float PCM,因此没有 PyTorch 主机 tensor 可供锁定,也没有非阻塞 tensor 传输可供该选项加速。
生成的 token 计数直接来自解码器 ID,而不是渲染的单词估计。在没有 EOS 的情况下达到 `max_new_tokens` 的行遵循 `truncation_policy`,并仅将受影响的行重试至 `max_retry_tokens`。`stop_repetition_loops` 应用与 Python 运行时相同的保守的 96 token、四次重复、8-32 token 周期防护,并且所有停止/重试决策都会在来源中按分段记录。
## VAD 和计时模式
- `vad: "silero"` 运行打包的 Silero v6 ONNX 计算图,具有循环状态以及与 Silero 6.2.1 相同的采样域时间戳状态机。`auto` 和 `onnx` 直接选择它;`torch` 和 `jit` 请求使用等效的 ONNX 计算图,并在来源中记录该执行器替换。
打包的 Torch 调优选项在没有 Python 的情况下仍然有效。对于请求的 `auto` 或 `torch`,`vad_block_frames` 是发送到一个 sequence-ONNX 调用的最大时间帧数,而 `vad_threads` 设置 ONNX Runtime 的 CPU intra-op SessionOption(省略时为单线程)。参考配置 schema 没有 ONNX 会话线程字段,因此有效值在其旧版的 `vad.torch_intraop_threads` 插槽中公开。请求的 `onnx` 或 `jit` 保留参考序列运行器的 256 帧块,并忽略这些仅用于打包的选项;`vad_threads` 对于这些引擎仍然像在 Python 中一样被拒绝。
打包的计算图具有时间输入 `[seq_len, 576]`,但循环 h/c 输入固定为 `[1, 1, 128]`;它没有文件批次轴、长度或掩码。因此,连接文件会在记录之间泄漏循环状态。Ruby 为每个活动文件使用一个线程受限的会话,并将 `vad_batch_size` 作为请求的 `auto`/`torch` 的独立文件并发上限。有效计数还受 `preprocess_workers`、CPU 可用性、组大小和顺序准备模式的限制。因此,配置文件报告 `max_files_per_call: 1`、确切的时间模型调用/帧计数,以及与 ONNX Runtime 内省匹配的提供程序选项(`CPUExecutionProvider: {}`),同时配置的批次/块值和有效的时间块仍然可见。
- `vad: "auditok"` 使用 Auditok 的 50 ms PCM16 对数 RMS 分词器的原生 Ruby 实现。
- `vad: "none"` 使用 `max_dur` 创建有界固定窗口。
- `alignment: "word"` 使用确切的固定 MMS-300M 强制对齐器 ONNX 导出计算全文件发射,然后运行纯 Ruby 的 float32 CTC Viterbi 内核。短于 30 秒的音频遵循固定对齐器的直接波形几何结构;短于其 400 个样本感受野的输入仅接收最小右侧填充。单独的无法对齐的分段会回退到有界均匀计时,而不会丢弃转录词。
- `alignment: "segment"` 在分段的语音跨度上均匀分布单词。
- `alignment: "none"` 返回不带单词或提示的纯文本。
## 模型和缓存
默认的模型和版本是固定不变的:
```
CohereLabs/cohere-transcribe-arabic-07-2026
0a8193caa4f3f92131471ab08824e488141cb392
```
Hub 构件重用标准的 Hugging Face 缓存。符号分支和标签在在线时会重新验证,每个客户端最多有五秒的有界记忆;并发未命中会独立刷新,每个调用者使用自己获取的 commit。标准的纯 SHA ref 读取上限为 41 字节,并且 ref 文件作为尽力而为的缓存提示被原子替换,当缓存不可读或只读时,不会使有效的在线结果失效。共享缓存目录保留 setgid 和执行门控访问;快照目录在支持的情况下接收粘滞位,ref 目录保持可替换以进行原子协作者更新,不可变的 payload 和 ref 继承协作者的读取访问权限而不具有写入权限,下载锁继承协调所需的读/写访问权限。文件系统无法表示的模式更新会被容忍,当前用户拥有的较旧缓存条目在可能的情况下会被升级,如果文件系统允许独占锁,可读的非写锁仍然可以协调,而不可访问的旧锁会返回带修复指导的类型化错误,而不是在它可能仍被持有时被替换。临时的连接、速率限制、服务器、格式错误的 JSON 或缺失/无效 commit 响应可以重用完整的缓存文件快照,而身份验证和缺失存储库的响应仍然是明确的错误。当有效的同级仍然存在时,格式错误的单个存储库文件条目将被忽略,但空或完全格式错误的列表会被直接报告。设置 `HF_HUB_OFFLINE=1` 以仅从已完整的缓存快照中解析符号版本;离线符号版本将保留在其最后成功缓存的 commit,直到稍后的在线刷新成功。Dense Safetensors 和 `pytorch_model.bin` 权重被流式传输到 GGUF 转换一次,并从 `~/.cache/cohere-transcribe` 重用。PyTorch 元数据由受限的、仅允许列表的 Ruby 读取器解码;它从不导入 Python 或执行 pickle 全局变量。支持当前的 `torch.save` ZIP 文件和之前的原始存储流格式,包括分片索引和跨步 tensor。古老的 tar 格式检查点会被拒绝,因为它们无法用相同的受限仅权重合约进行解释;请将它们重新保存为 Safetensors 或当前的状态字典。保留的会话身份包括解析的设备和 dtype 以及模型身份。每个转换的构件对其输出 dtype 和模型 ID/revision、相对源路径、大小、mtime 和 ctime 上的 SHA-256 源指纹具有独立的缓存键,因此即使是大小相同、保留 mtime 的重写也会通过其更改的 ctime 使本地微调失效。伴随的完成标记将该源指纹、输出 dtype 和缓存布局绑定到转换后的 GGUF 的设备、inode、大小、mtime 和 ctime。该标记作为 `*.complete.json` 存储在模型旁边。缓存仅接受常规的、非符号链接的 GGUF/marker 文件;转换锁在可用时使用 no-follow 打开,并验证打开的描述符是否仍然与路径的设备和 inode 匹配。跨进程输出锁使用从规范输出集派生的输出相邻 `.cohere-transcribe-locks/` 注册表,并在此过渡期间获取已发布的 0.1.2 临时锁。
词模式使用 `onnx-community/mms-300m-1130-forced-aligner-ONNX@2100fb247d8e43962eef24491597fbeb8b469531`,即 `MahmoudAshraf/mms-300m-1130-forced-aligner@49402e9577b1158620820667c218cd494cc44486` 的 ONNX 导出。默认的 `align_dtype: "fp32"` 即使在 Dense ASR 于 CUDA 上运行时也能与 CPU 提供程序一起工作。`align_dtype: "fp16"` 需要支持 CUDA 的 ONNX Runtime;当它不是已安装的 `onnxruntime` gem 提供的运行时,请将 `COHERE_TRANSCRIBE_ONNXRUNTIME_LIBRARY` 指向该运行时。运行时在加载之前会根据固定字节大小和 SHA-256 验证完整的模型文件。这些下载的模型权重为 CC-BY-NC-4.0,不在 gem 中分发;有关来源和通知,请参阅 `lib/cohere/transcribe/alignment/ATTRIBUTION.md`。
有用的环境变量:
- `HF_TOKEN`、`HF_HOME`、`HF_HUB_CACHE`、`HF_ENDPOINT`、`HF_HUB_OFFLINE`
- `COHERE_TRANSCRIBE_CACHE`
- `COHERE_TRANSCRIBE_NATIVE_LIBRARY`
- `COHERE_TRANSCRIBE_AUDIO_LIBRARY`
- `COHERE_TRANSCRIBE_GGML_LIBRARY`
- `COHERE_TRANSCRIBE_SNDFILE_LIBRARY`
- `COHERE_TRANSCRIBE_SAMPLERATE_LIBRARY`
- `COHERE_TRANSCRIBE_ONNXRUNTIME_LIBRARY`
- `COHERE_TRANSCRIBE_THREADS`
高级部署可能会使用 `COHERE_TRANSCRIBE_AVFORMAT_LIBRARY`、`COHERE_TRANSCRIBE_AVCODEC_LIBRARY`、`COHERE_TRANSCRIBE_AVUTIL_LIBRARY` 和 `COHERE_TRANSCRIBE_SWRESAMPLE_LIBRARY` 固定四个动态加载的编解码器库;请同时设置这四个。
### 已保存的量化和适配器
已保存的 bitsandbytes 检查点和 PEFT/LoRA 适配器会被显式检测并拒绝;它们不会被静默视为 Dense 权重。
官方的 [Transformers bitsandbytes 合约](https://huggingface.co/docs/transformers/quantization/bitsandbytes) 定义了带有 FP16 异常值路径的 INT8 执行,以及带有可选嵌套量化的 INT4 NF4/FP4 存储。这些布局和执行规则不是 GGML Q8/Q4 tensor 格式。有界内存转换器可以将任一格式去量化为此 gem 的 Dense GGUF 合约,但结果将是一个大致具有 Dense 推理行为的 Dense 大小模型,而不是原生的 bitsandbytes 支持或等效的内存/性能特征。
同样,官方的 [PEFT LoRA 合约](https://huggingface.co/docs/peft/main/package_reference/lora) 比 `Linear` 权重上的一对低秩矩阵更广泛:支持的布局可以包括嵌入和卷积适配器、DoRA 幅度向量、已保存的模块替换、偏差更新和稀疏可训练 token 状态。未来的适配器导入器必须定义并验证更窄的可合并配置文件,在 GGUF 转换之前合并它,并将适配器配置和权重绑定到转换指纹和完成标记中。在该合约存在之前,显式拒绝避免了看起来合理但不完整的合并。
## 开发
```
bundle install
bundle exec rake test
```
测试套件包含纯 Ruby 单元覆盖、ABI 边界测试、真实音频解码/重采样测试、针对 Python 的精确 Silero 差异测试、转换器 fixture 以及可选的实时 Dense 模型冒烟测试。
已安装 gem 的 WER 测量使用 [`benchmark/README.md`](benchmark/README.md) 中记录的独立运行器。推理基准测试有意与 `bundle exec rake` 和 CI 分开。
### 发布
添加一个名为 `RUBYGEMS_AUTH_TOKEN` 的仓库 Actions 密钥,其中包含具有推送 `cohere-transcribe` 权限的 RubyGems API 密钥。发布标记为 `0.1.3` 的 GitHub Release 会运行发布工作流,验证标签是否与 `Cohere::Transcribe::VERSION` 匹配,构建确切的 `cohere-transcribe-0.1.3.gem` 构件,并将其推送到 RubyGems.org。发布检查也接受前导 `v`。
常规 CI 会在 Linux 和 macOS 上运行 Ruby 套件、样式检查、签名验证、原生 CPU 构建和 ABI 冒烟检查以及源码 gem 构建。它不运行已安装 gem 的 WER 或性能基准测试。
## 许可证
该 gem 的原始 Ruby 代码和文档采用 Apache License 2.0 许可。打包的第三方组件保留其各自条款:CC-BY-NC-4.0 用于保留的 Fairseq MMS 和 ctc-forced-aligner 归一化/跨度行为,BSD-2-Clause 用于 TorchAudio 强制对齐移植,Uroman 的宽松许可用于生成的罗马化数据,MIT 用于 Auditok 派生的分段、CrispASR、GGML、Silero VAD 和 faster-whisper 资产。请参阅 [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md) 以及这些组件旁边的许可文件。
使用词对齐时下载的 MMS 模型权重不在 gem 中分发,并保持单独的 CC-BY-NC-4.0 许可。其他运行时下载的模型仍受其所有者发布的条款约束。
标签:ASR, Bash脚本, C/C++, CNCF毕业项目, Ruby, Vectored Exception Handling, 事务性I/O, 实时告警, 本地推理, 机器学习推理, 知识库, 语音转写, 音频处理