Skip to content
Closed
76 changes: 76 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1636,6 +1636,18 @@ audiocpp_add_model(firered_audio
engine::models::firered_audio::make_firered_audio_loader
)

audiocpp_add_model(vibeasr
SOURCES
src/community_models/vibeasr/assets.cpp
src/community_models/vibeasr/vae_encoder.cpp
src/community_models/vibeasr/lm_decoder.cpp
src/community_models/vibeasr/session.cpp
INCLUDES
engine/community_models/vibeasr/session.h
LOADERS
engine::community_models::vibeasr::make_vibeasr_loader
)

set(AUDIOCPP_ENABLED_MODELS "")
if (AUDIOCPP_MODEL_SET STREQUAL "full")
set(AUDIOCPP_ENABLED_MODELS ${AUDIOCPP_MODEL_TARGETS})
Expand Down Expand Up @@ -2279,6 +2291,20 @@ if (ENGINE_BUILD_TESTS)
COMMAND conv_lowering_matrix_test
)

add_engine_unittest(i8_s_fused_ops_test tests/unittests/test_i8_s_fused_ops.cpp)

add_test(
NAME i8_s_fused_ops_test
COMMAND i8_s_fused_ops_test
)

add_engine_unittest(i2_s_mul_mat_test tests/unittests/test_i2_s_mul_mat.cpp)

add_test(
NAME i2_s_mul_mat_test
COMMAND i2_s_mul_mat_test
)

add_engine_unittest(gguf_tensor_source_test tests/unittests/test_gguf_tensor_source.cpp)
target_include_directories(gguf_tensor_source_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tests/unittests)

Expand Down Expand Up @@ -2418,6 +2444,56 @@ if (ENGINE_BUILD_TESTS)
target_link_libraries(test_granite5asr_golden_transcription PRIVATE OpenMP::OpenMP_CXX)
endif()

if (vibeasr IN_LIST AUDIOCPP_LINKED_MODELS)
add_executable(test_vibeasr_vae_encoder
tests/vibeasr/test_vibeasr_vae_encoder.cpp
)
target_compile_definitions(test_vibeasr_vae_encoder PRIVATE
ENGINE_REPO_ROOT="${CMAKE_CURRENT_SOURCE_DIR}"
)
target_link_libraries(test_vibeasr_vae_encoder PRIVATE engine_runtime ggml)
target_include_directories(test_vibeasr_vae_encoder PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
if (ENGINE_ENABLE_OPENMP)
target_link_libraries(test_vibeasr_vae_encoder PRIVATE OpenMP::OpenMP_CXX)
endif()
add_test(
NAME test_vibeasr_vae_encoder
COMMAND test_vibeasr_vae_encoder
--model ${CMAKE_CURRENT_SOURCE_DIR}/models/vibeasr/vibeasr-vae-encoder-i8_s.gguf
--audio ${CMAKE_CURRENT_SOURCE_DIR}/assets/asr_validation/librispeech/librispeech_test_clean_6930-75918-0000.wav
)
# Needs the converted 703 MB encoder package, which a normal checkout
# does not have; the probe exits 125 (skip) instead of failing. Pass
# --reference-acoustic / --reference-semantic by hand to also check
# parity against a VibeASR.cpp dump.
set_tests_properties(test_vibeasr_vae_encoder PROPERTIES
SKIP_RETURN_CODE 125
TIMEOUT 300
)

add_executable(test_vibeasr_asr
tests/vibeasr/test_vibeasr_asr.cpp
)
target_compile_definitions(test_vibeasr_asr PRIVATE
ENGINE_REPO_ROOT="${CMAKE_CURRENT_SOURCE_DIR}"
)
target_link_libraries(test_vibeasr_asr PRIVATE engine_runtime ggml)
target_include_directories(test_vibeasr_asr PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
if (ENGINE_ENABLE_OPENMP)
target_link_libraries(test_vibeasr_asr PRIVATE OpenMP::OpenMP_CXX)
endif()
add_test(
NAME test_vibeasr_asr
COMMAND test_vibeasr_asr --threads 8
)
# Same story as the encoder probe, plus the 993 MB decoder: exits 125
# (skip) unless both converted GGUFs sit in models/vibeasr/.
set_tests_properties(test_vibeasr_asr PROPERTIES
SKIP_RETURN_CODE 125
TIMEOUT 600
)
endif()

if (audio8_asr IN_LIST AUDIOCPP_LINKED_MODELS)
add_executable(test_audio8_asr_units
tests/audio8_asr/test_audio8_asr_units.cpp
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ Community model ports live under `community_models` to make the ownership bounda
| **sense_asr** | ASR | auto, zh, en, yue, ja, ko, pt, ru, es, it, fr, de, nl, pl, tr, ar, hi, vi, th, id, ms, fa, nospeech | GGUF Q8, Stream | Jason Chen [@jasonchen31](https://github.com/jasonchen31), [@LauraGPT](https://github.com/LauraGPT) / FunASR | [SenseVoice-Small](docs/community_models/sense_asr.md) offline/streaming SAN-M + CTC transcription with event/emotion/language tags and ITN |
| **soprano_tts** | TTS | en | GGUF Q8, Stream | [@WalkingCat](https://github.com/WalkingCat) | [Soprano-1.1-80M](https://huggingface.co/WalkingCat/Soprano-1.1-80M-GGUF) ultra-lightweight TTS with Qwen3 LM + Vocos decoder |
| **vietneu_tts** | TTS, Clone | vi, en | GGUF | Phuoc [@phuocnguyen90](https://github.com/phuocnguyen90) | [VieNeu-TTS-v3-Turbo](docs/community_models/vietneu_tts.md) TTS and voice cloning support |
| **vibeasr** | ASR (encoder only) | n/a | GGUF I8_S | [@XsquirrelC](https://github.com/XsquirrelC) | [VibeASR VAE encoder](docs/community_models/vibeasr.md) INT8-weight and INT8-activation port of the VibeVoice acoustic/semantic tokenizers from [VibeASR.cpp](https://github.com/microsoft/VibeASR.cpp); encoder only, the ternary I2_S decoder is not ported yet |
| **voxcpm1** | TTS, Clone | zh, en, ja, ko | GGUF Q8, Stream | [@jasonchen31](https://github.com/jasonchen31) | [VoxCPM1](docs/community_models/voxcpm1.md) tokenizer-free 0.5B TTS with 16 kHz output, streaming, and continuation-mode voice cloning |

## Docker
Expand Down
5 changes: 5 additions & 0 deletions docs/asr.md
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,11 @@ chunking, server usage, and validation notes.

VibeVoice ASR is an offline ASR model with greedy, sampling, and beam-search decode paths. It can return transcription text and structured segment/speaker-turn output when the model produces timestamps.

A fully quantized port of the same model — INT8 activations through the encoder,
ternary BitNet weights in the decoder — lives under community models as
`vibeasr`: see [VibeASR](community_models/vibeasr.md). It is not a separate
model, only a CPU-only alternative numeric pipeline for the same weights.

| Field | Value |
|---|---|
| Family | `vibevoice_asr` |
Expand Down
1 change: 1 addition & 0 deletions docs/community_models/models.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,4 @@ Practical expectations:
| **sense_asr** | ASR | auto, zh, en, yue, ja, ko, pt, ru, es, it, fr, de, nl, pl, tr, ar, hi, vi, th, id, ms, fa, nospeech | Jason Chen [@jasonchen31](https://github.com/jasonchen31), [@LauraGPT](https://github.com/LauraGPT) / FunASR | [SenseVoice-Small](sense_asr.md) offline/streaming SAN-M + CTC transcription with event/emotion/language tags and ITN |
| **vietneu_tts** | TTS, voice cloning | vi, en | Phuoc [@phuocnguyen90](https://github.com/phuocnguyen90) | [VieNeu-TTS-v3-Turbo](vietneu_tts.md) TTS and voice cloning support |
| **moss_voicegen** | Voice design | en, zh | Joost [@jrohde](https://github.com/jrohde) | [MOSS-VoiceGenerator](moss_voicegen.md) voice design from a written instruction, on the MOSS delay architecture |
| **vibeasr** | ASR | en | [@XsquirrelC](https://github.com/XsquirrelC) | [VibeASR](vibeasr.md) fully quantized port of [VibeASR.cpp](https://github.com/microsoft/VibeASR.cpp): the VibeVoice acoustic/semantic tokenizers on INT8 weights *and* INT8 activations through the fused `GGML_TYPE_I8_S` ops, feeding a ternary `GGML_TYPE_I2_S` BitNet Qwen2 decoder. Offline, CPU only |
Loading