Add iiwa_voice package with environment setup and docker-compose configuration

This commit is contained in:
Даниил Грабарь
2026-04-20 12:42:45 +10:00
parent 5eefd2fc90
commit 0445776d48
8 changed files with 193 additions and 0 deletions
+1
View File
@@ -25,6 +25,7 @@ sudo apt install -y ros-${ROS_DISTRO}-webots-ros2 \
ros-${ROS_DISTRO}-rosbag2-storage-mcap \ ros-${ROS_DISTRO}-rosbag2-storage-mcap \
ros-${ROS_DISTRO}-librealsense2 \ ros-${ROS_DISTRO}-librealsense2 \
ros-${ROS_DISTRO}-realsense2* \ ros-${ROS_DISTRO}-realsense2* \
libportaudio2 \
``` ```
+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>iiwa_voice</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="grabardm@ml-dev.ru">daniel</maintainer>
<license>TODO: License declaration</license>
<test_depend>ament_copyright</test_depend>
<test_depend>ament_flake8</test_depend>
<test_depend>ament_pep257</test_depend>
<test_depend>python3-pytest</test_depend>
<export>
<build_type>ament_python</build_type>
</export>
</package>
+40
View File
@@ -0,0 +1,40 @@
# =============================================================================
# Qwen3-TTS — настройки окружения (.env)
# Скопируйте этот файл в .env и заполните своими значениями
# =============================================================================
# --- Hugging Face ---------------------------------------------------------
# Токен нужен только если модели приватные или у вас rate-limit
HF_TOKEN=
# Путь для кэша весов моделей (рекомендуется SSD с ~20 ГБ свободного места)
HF_CACHE_DIR=./hf_cache
# --- GPU ------------------------------------------------------------------
# Сколько GPU выделить каждому сервису (обычно 1)
GPU_COUNT=1
# Видимые GPU (например "0" или "0,1" для multi-GPU)
CUDA_VISIBLE_DEVICES=0
# Утилизация памяти GPU (0.0–1.0). Уменьшите при OOM.
GPU_MEM_UTIL=0.90
# Максимальная длина контекста
MAX_MODEL_LEN=4096
# --- Порты ----------------------------------------------------------------
CUSTOMVOICE_PORT=8091
VOICEDESIGN_PORT=8092
BASE_PORT=8093
# --- Модели ---------------------------------------------------------------
# По умолчанию 1.7B. Замените на 0.6B для экономии VRAM (~4 ГБ вместо ~8 ГБ)
# MODEL_SIZE=Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice
MODEL_SIZE=Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice
# MODEL_VOICEDESIGN=Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign
MODEL_VOICEDESIGN=Qwen/Qwen3-TTS-12Hz-0.6B-VoiceDesign
# MODEL_BASE=Qwen/Qwen3-TTS-12Hz-1.7B-Base
MODEL_BASE=Qwen/Qwen3-TTS-12Hz-0.6B-Base
+101
View File
@@ -0,0 +1,101 @@
# =============================================================================
# Qwen3-TTS — vLLM-Omni (docker-compose.yml)
# Три варианта модели на разных портах:
# customvoice → :8091 (заранее настроенные голоса: Vivian, Ryan …)
# voicedesign → :8092 (создание голоса по текстовому описанию)
# base → :8093 (клонирование голоса из ~3 сек. аудио)
#
# Запуск всех сервисов: docker compose up -d
# Только один сервис: docker compose up -d qwen3-tts-customvoice
# Логи: docker compose logs -f qwen3-tts-customvoice
# =============================================================================
x-tts-common: &tts-common
image: vllm/vllm-omni:v0.18.0
ipc: host
ulimits:
memlock: -1
stack: 67108864
restart: unless-stopped
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: ${GPU_COUNT:-1} # кол-во GPU на сервис (см. .env)
capabilities: [gpu]
volumes:
- ${HF_CACHE_DIR:-./hf_cache}:/root/.cache/huggingface
- ./output_audio:/output_audio # сохранение WAV-файлов
environment:
HF_TOKEN: ${HF_TOKEN:-} # токен Hugging Face (если нужен)
VLLM_USE_V1: "0" # офлайн-режим совместимости
VLLM_WORKER_MULTIPROC_METHOD: spawn # требуется для TTS-воркеров
CUDA_VISIBLE_DEVICES: ${CUDA_VISIBLE_DEVICES:-0}
healthcheck:
test: ["CMD", "python3", "-c",
"import urllib.request; urllib.request.urlopen('http://localhost:${_PORT:-8091}/health')"]
interval: 30s
timeout: 10s
retries: 5
start_period: 120s # модель грузится долго
# =============================================================================
services:
# ---------------------------------------------------------------------------
# 1. CustomVoice — готовые голоса (Vivian, Ryan и др.)
# POST /v1/audio/speech { "input": "...", "voice": "Vivian" }
# ---------------------------------------------------------------------------
qwen3-tts-customvoice:
<<: *tts-common
container_name: qwen3-tts-customvoice
ports:
- "${CUSTOMVOICE_PORT:-8091}:8091"
command: >
${MODEL_SIZE:-Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice}
--omni
--port 8091
--gpu-memory-utilization ${GPU_MEM_UTIL:-0.90}
--max-model-len ${MAX_MODEL_LEN:-4096}
profiles:
- customvoice
- all
# ---------------------------------------------------------------------------
# 2. VoiceDesign — синтез голоса по описанию на естественном языке
# POST /v1/audio/speech { "input": "...", "voice": "a calm female voice" }
# ---------------------------------------------------------------------------
qwen3-tts-voicedesign:
<<: *tts-common
container_name: qwen3-tts-voicedesign
ports:
- "${VOICEDESIGN_PORT:-8092}:8091"
command: >
${MODEL_VOICEDESIGN:-Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign}
--omni
--port 8091
--gpu-memory-utilization ${GPU_MEM_UTIL:-0.90}
--max-model-len ${MAX_MODEL_LEN:-4096}
profiles:
- voicedesign
- all
# ---------------------------------------------------------------------------
# 3. Base — клонирование голоса из референс-аудио
# POST /v1/audio/speech { "input": "...", + ref_audio файл }
# ---------------------------------------------------------------------------
qwen3-tts-base:
<<: *tts-common
container_name: qwen3-tts-base
ports:
- "${BASE_PORT:-8093}:8091"
command: >
${MODEL_BASE:-Qwen/Qwen3-TTS-12Hz-1.7B-Base}
--omni
--port 8091
--gpu-memory-utilization ${GPU_MEM_UTIL:-0.90}
--max-model-len ${MAX_MODEL_LEN:-4096}
profiles:
- base
- all
View File
+4
View File
@@ -0,0 +1,4 @@
[develop]
script_dir=$base/lib/iiwa_voice
[install]
install_scripts=$base/lib/iiwa_voice
+29
View File
@@ -0,0 +1,29 @@
from setuptools import find_packages, setup
package_name = 'iiwa_voice'
setup(
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['test']),
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='daniel',
maintainer_email='grabardm@ml-dev.ru',
description='TODO: Package description',
license='TODO: License declaration',
extras_require={
'test': [
'pytest',
],
},
entry_points={
'console_scripts': [
],
},
)