Qwen3-ASR Speaker Diarization Adapter (v10)

neosophie/Qwen3-ASR-1.7B-JA に話者分離出力 (<|spk_0|>/<|spk_1|>) を学ばせた LoRA + 部分 embedding アダプタ。

設計

  • 凍結: AuT encoder (300M)、Qwen3-1.7B backbone の大半
  • 学習対象:
    • LoRA (r=32) を q/k/v/o/gate/up/down_proj に適用 (~10M params)
    • audio→LLM projector を完全 unfreeze (~28M params)
    • 新規追加 <|spk_0|><|spk_7|> 行 (8 行 × 2048) のみ embedding 更新

base model の既存 token 埋め込み・lm_head は完全凍結。tied weight を活用し、 backward hook で勾配を新規 token 行だけに通している。

訓練データ

電話通話 ~949 件。Qwen3-ASR の生出力を Gemma-4-31B-it に渡して、 Gemini 3.1-pro の話者付き文字起こしを参考に <|spk_N|> タグを自動挿入したもの。

詳細は phase_a/gemma_label.py 参照。

使い方

import torch
from qwen_asr import Qwen3ASRModel
from peft import PeftModel

wrapper = Qwen3ASRModel.from_pretrained(
    "neosophie/Qwen3-ASR-1.7B-JA",
    dtype=torch.bfloat16, device_map="cuda:0",
)
# tokenizer に spk token を追加してから resize
SPK = [f"<|spk_{i}|>" for i in range(8)]
wrapper.processor.tokenizer.add_tokens(SPK, special_tokens=False)
wrapper.model.thinker.resize_token_embeddings(
    len(wrapper.processor.tokenizer), mean_resizing=True)

# adapter を被せる
wrapper.model = PeftModel.from_pretrained(wrapper.model, "okadahiroaki/Qwen3asr_diarization")
wrapper.model.eval()

res = wrapper.transcribe(audio="call.wav", language="Japanese")
print(res[0].text)
# language Japanese<asr_text><|spk_0|> もしもし、 <|spk_1|> あ、お世話に...
Downloads last month
164
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for okadahiroaki/Qwen3asr_diarization

Adapter
(1)
this model