Production toolkit around Qwen3-ForcedAligner: VAD pre-segmentation, multi-language word/char-level alignment, and speaker diarization.
Project description
qwen-aligner-toolkit
Production toolkit around Qwen3-ForcedAligner: VAD pre-segmentation, multi-language word/char-level forced alignment, and speaker diarization.
Why
qwen-asr ships an excellent forced
aligner (Qwen3-ForcedAligner-0.6B) that handles multiple languages with
one model — no per-language wav2vec2 needed, no kanji vocab gaps. This
toolkit packages it with the surrounding pieces you typically need in
production:
- VAD (
pyannote/segmentation-3.0) to chunk long audio - Diarization (
pyannote/speaker-diarization-community-1) with per-word speaker assignment and run smoothing - Audio utilities (path / URL / bytes / np.ndarray → 16 kHz mono)
- AVX-less CPU compatibility via a nagisa char-level stub
The toolkit does not do ASR. Bring your own transcript (from Whisper via vLLM, faster-whisper, qwen-asr itself, or any other system) and the toolkit will time-align it and label speakers.
Install
pip install qwen-aligner-toolkit
pip install qwen-aligner-toolkit[full] # with VAD + diarization
Usage
Simple alignment (short audio)
from qwen_aligner_toolkit import Aligner
aligner = Aligner.from_pretrained()
words = aligner.align(
text="甚至出现交易几乎停滞的情况。",
audio="audio.wav",
language="Chinese",
)
for w in words:
print(w.start_time, w.end_time, w.text)
ASR segments → word-level + speakers
from qwen_aligner_toolkit import Pipeline
pipeline = Pipeline.from_pretrained(hf_token="hf_...", device="cuda")
segments = [
{"text": "おはようございます。", "start": 0.0, "end": 2.3},
{"text": "今日は良い天気ですね。", "start": 2.3, "end": 5.1},
]
result = pipeline.align_segments(
segments=segments,
audio="audio.wav",
language="Japanese",
diarize=True,
)
for w in result.words:
print(f"{w.start_time:.2f}-{w.end_time:.2f} [{w.speaker}] {w.text}")
VAD only
from qwen_aligner_toolkit import VAD
vad = VAD.from_pretrained(hf_token="hf_...")
chunks = vad.detect("audio.wav")
CPU compatibility (AVX requirement)
qwen-asr depends on nagisa, which ships DyNet38 compiled with AVX.
On AVX-less CPUs (Intel Celeron G-series, some embedded SoCs), importing
nagisa crashes with SIGILL.
If that affects you, install the char-level stub:
qwen-aligner-toolkit install-nagisa-stub
# or
python -m qwen_aligner_toolkit.compat install-stub
This downgrades Japanese tokenization from morpheme-level to character-level (other languages are unaffected). For forced alignment the difference is mostly cosmetic; speaker boundaries may even be detected at finer granularity.
For Docker:
RUN pip install qwen-aligner-toolkit && \
qwen-aligner-toolkit install-nagisa-stub
License
Apache 2.0. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qwen_aligner_toolkit-0.1.0.tar.gz.
File metadata
- Download URL: qwen_aligner_toolkit-0.1.0.tar.gz
- Upload date:
- Size: 13.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
20806573d1d9ada2b54dfcb8fed8cc818ee355da3393acc611441df03120cd1b
|
|
| MD5 |
81e851ef49252acfc9bd03157da61161
|
|
| BLAKE2b-256 |
37feef4184b401267a0625e17e51cf6c4b83ec5ec0adbaa5d613265de71135b6
|
File details
Details for the file qwen_aligner_toolkit-0.1.0-py3-none-any.whl.
File metadata
- Download URL: qwen_aligner_toolkit-0.1.0-py3-none-any.whl
- Upload date:
- Size: 14.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4434c60374de3c3402f03fa5cda4ef91e5672f8b503383b116b20c32fd641035
|
|
| MD5 |
df89aea2e0e1e3b5a43d71a0377d5593
|
|
| BLAKE2b-256 |
d0549a5c9603f41e7543769e3f395ce3ddc05e3b0257e45c445e372f9392e601
|