Подключение Docker-контейнера omnivoice-cpp к Open WebUI

Share
Подключение 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: любое значение

В поле "голос" вносятся параметры голоса, состоящие из сделующих вариантов:

  1. Пол: male, female
  2. Возраст спикера: child, teenagr, young adlut, middle-aged, elderly
  3. Высота тона: very low pitch, low pitch, moderate pitch, high pitch, very high pitch
  4. Акцент: american accent, british accent, auctralian accent, chinese accent, canadian accent, indian accent, korean accent, portuguese accent, russian accent, japanese accent
  5. "Шепчущий" голос: whisper

В дальнейшем планируется добавить перевод параметров голоса на русский язык, реализовать возможность выбора "голосов-клонов" по имени.

Свободное клонирование голоса из web-интерфейса к реализации не планируется из-за возможных вопросов безопасности и этики.

Необходимая для работы системы модель досупна по ссылке.