114 lines
5.9 KiB
Markdown
114 lines
5.9 KiB
Markdown
# omnivoice.cpp - docker version
|
||
|
||
Локальный искусственный интеллект для синтеза речи (Text-to-Speech) с
|
||
клонированием и конструированием голоса, работающий на базе GGML.
|
||
Порт проекта OmniVoice на C++17. Поддержка 646 языков, выходной сигнал 24 кГц (моно),
|
||
контейнер работает на CPU и Vulkan.
|
||
|
||
## Возможности
|
||
- Клонирование голоса по эталонному WAV-файлу и его транскрипту
|
||
- Конструирование голоса через ключевые атрибуты (пол, возраст, высота тона, стиль, громкость, эмоции)
|
||
- Авто-голос с сохранением идентичности говорящего на длинных текстах
|
||
- Длительный синтез с учетом пунктуации, выделение голосовых промптов, кроссфейд и удаление тишины по стандартам pydub
|
||
- Побитовая детерминированность в жадном режиме (greedy mode), генерация через семафорное распределенное случайное число (PRNG Philox)
|
||
- Квантование модели Qwen3 (612 млн параметров) в формат Q8_0
|
||
- Два консольных инструмента: omnivoice-tts (текст -> WAV) и omnivoice-codec (WAV <-> RVQ коды)
|
||
- OpenAI API-совместивый сервер с возможностью интеграции в Open WebUI (tools/tts-server)
|
||
|
||
## Сборка образа Docker
|
||
|
||
```
|
||
git clone --recurse-submodules https://github.com/ServeurpersoCom/omnivoice.cpp.git
|
||
cd omnivoice.cpp
|
||
./buildvulkan.sh # Most GPUs (Vulkan) and CPU (if GPU unavailable) reference
|
||
docker-compose build
|
||
```
|
||
|
||
## Конвертация моделей
|
||
|
||
Предварительно сконвертированные GGUF доступны на Hugging Face:
|
||
|
||
https://huggingface.co/Serveurperso/OmniVoice-GGUF
|
||
|
||
Положите их в папку models/ и переходите к быстрому старту. Для конвертации из исходного чекпоинта:
|
||
|
||
```
|
||
./checkpoints.sh # hf download k2-fsa/OmniVoice -> checkpoints/
|
||
./convert.py # 2 GGUFs in BF16 -> models/
|
||
./quantize.sh # base LM Q8_0 (tokenizer stays at native dtype)
|
||
```
|
||
|
||
## Быстрый старт
|
||
|
||
```
|
||
echo "Hello world." | ./build/omnivoice-tts \
|
||
--model models/omnivoice-base-Q8_0.gguf \
|
||
--codec models/omnivoice-tokenizer-F32.gguf \
|
||
--lang English -o hello.wav
|
||
```
|
||
|
||
Копирование голоса :
|
||
|
||
```
|
||
./build/omnivoice-tts \
|
||
--model models/omnivoice-base-Q8_0.gguf \
|
||
--codec models/omnivoice-tokenizer-F32.gguf \
|
||
--ref-wav ref.wav --ref-text ref.txt \
|
||
--lang English -o out.wav < prompt.txt
|
||
```
|
||
|
||
Готовый эталон (clone.sh): утилита `omnivoice-codec` кодирует эталонный WAV
|
||
в компактный латент .rvq. Она применяет точную предобработку эталона для синтеза,
|
||
поэтому коды битово идентичны файлу из `--ref-wav`. Передача через --ref-rvq
|
||
пропускает кодировку кодеком при каждом синтезе:
|
||
|
||
```
|
||
build/omnivoice-codec --model models/omnivoice-tokenizer-F32.gguf -i ref.wav
|
||
build/omnivoice-tts \
|
||
--model models/omnivoice-base-Q8_0.gguf \
|
||
--codec models/omnivoice-tokenizer-F32.gguf \
|
||
--ref-rvq ref.rvq --ref-text ref.txt \
|
||
--lang English -o out.wav < prompt.txt
|
||
```
|
||
|
||
## Встраивание библиотеки
|
||
Консольные утилиты — это тонкая оболочка над открытым ABI.
|
||
Однозаголовочная библиотека, единый префикс имени, чистая C-связка.
|
||
Это позволяет использовать её одинаково в C, C++, Python (ctypes),
|
||
Rust (bindgen) и Go (cgo).
|
||
|
||
```c
|
||
#include "omnivoice.h"
|
||
|
||
struct ov_init_params iparams;
|
||
ov_init_default_params(&iparams);
|
||
iparams.model_path = "models/omnivoice-base-Q8_0.gguf";
|
||
iparams.codec_path = "models/omnivoice-tokenizer-F32.gguf";
|
||
|
||
struct ov_context * ov = ov_init(&iparams);
|
||
|
||
struct ov_tts_params params;
|
||
ov_tts_default_params(¶ms);
|
||
params.text = "Hello world.";
|
||
params.lang = "English";
|
||
|
||
struct ov_audio audio = { 0 };
|
||
ov_synthesize(ov, ¶ms, &audio);
|
||
/* audio.samples, audio.n_samples, audio.sample_rate, audio.channels */
|
||
ov_audio_free(&audio);
|
||
ov_free(ov);
|
||
```
|
||
|
||
tests/abi-c.c собирается с флагами -std=c99 -Wall -Werror -pedantic при каждой сборке. Любая регрессия, ломающая совместимость с чистым C, остановит сборку, а не просто станет опциональной целью.
|
||
|
||
Для создания связывающей разделяемой библиотеки (libomnivoice.so / .dll / .dylib) используйте конфигурацию cmake -DOMNIVOICE_SHARED=ON .... Разделяемый объект экспортирует только символы ov_*; все внутренние pipeline_* и backend_* остаются скрытыми внутри .so.
|
||
|
||
Ознакомьтесь с docs/ARCHITECTURE.md для сведений о модели, структуре GGUF, конвейере вывода (inference pipeline), всех флагах CLI, справке по общедоступному API и результатах валидации.
|
||
|
||
## Лицензия
|
||
|
||
MIT. См. [LICENSE](LICENSE).
|
||
|
||
Исходная модель : OmniVoice от Xiaomi / k2-fsa, Apache 2.0.
|
||
Аудиокодек: Higgs Audio v2 (`bosonai/higgs-audio-v2-tokenizer`), Apache 2.0.
|