Подключение Docker-контейнера omnivoice-cpp к Open WebUI
Захотелось добавить к llm-порталу возможность синтеза речи. После анализа доступных вариантов выбор пал на систему omnivoice-cpp по следующим критериям:
1. Быстрая работа (можно запускать даже на CPU, на GPU генерация практически мгновенная;
2. Приятное на слух звучание синтезированного голоса;
3. Реализован сервер с поддержкой openai API;
4. Возможность параметрического "конструирования" желаемого голоса (пример на https://omnivoice.app/voice-design);
5. Работает без python.
Отправной точкой для реализации стал проект https://github.com/ServeurpersoCom/omnivoice.cpp.
Чтобы реализовать возможность конструирования голоса через поле "голос" в web-интерфейсе open webui был немного изменён файл tts-server.cpp:
К строкам
if (!req.instructions.empty()) {
p.instruct = req.instructions.c_str();
}
добавлено
else if (!req.voice.empty()) {
p.instruct = req.voice.c_str();
}
Теперь значение параметра voice интерпретируется как характеристики голоса.
Сборка производится стандаптным способом:
./buildvulkan.sh
Для запуска системы используется Dockerfile:
FROM debian:trixie-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
wget curl gnupg lsb-release \
libvulkan1 vulkan-tools mesa-vulkan-drivers libvulkan-dev mesa-utils \
libgomp1 \
&& rm -rf /var/lib/apt/lists/*
ENV VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/radeon_icd.json
# Копирование приложения в контейнер
COPY ./tts-server /app/
COPY ./*so* /usr/local/lib/
RUN ldconfig && \
echo "/usr/local/lib" > /etc/ld.so.conf.d/custom-libs.conf && \
ldconfig
ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
WORKDIR /app
CMD ["/app/tts-server"]
В docker-compose.yml добавлено:
services:
omnivoice-server:
build: app
security_opt:
- apparmor:flatpak
ports:
- "8000:8000"
volumes:
- ./model:/models
devices:
- "/dev/kfd:/dev/kfd"
- "/dev/dri:/dev/dri"
group_add:
- video
ipc: host
cap_add:
- SYS_PTRACE
environment:
- HSA_OVERRIDE_GFX_VERSION=11.0.0
command: >
/app/tts-server
--model /models/omnivoice-base-Q4_K_M.gguf
--codec /models/omnivoice-tokenizer-Q4_K_M.gguf
--host 0.0.0.0
--port 8000
logging:
options:
max-size: "1m"
max-file: "1"
В open webui в настройках администрирования указывается:
Система синтеза речи: OpenAI
Базовый адрес API: http://omnivoice-server:8000/v1
Ключ API: любое значение.
Модель TTS: любое значение
В поле "голос" вносятся параметры голоса, состоящие из сделующих вариантов:
- Пол: male, female
- Возраст спикера: child, teenagr, young adlut, middle-aged, elderly
- Высота тона: very low pitch, low pitch, moderate pitch, high pitch, very high pitch
- Акцент: american accent, british accent, auctralian accent, chinese accent, canadian accent, indian accent, korean accent, portuguese accent, russian accent, japanese accent
- "Шепчущий" голос: whisper
В дальнейшем планируется добавить перевод параметров голоса на русский язык, реализовать возможность выбора "голосов-клонов" по имени.
Свободное клонирование голоса из web-интерфейса к реализации не планируется из-за возможных вопросов безопасности и этики.
Необходимая для работы системы модель досупна по ссылке.