Add iiwa_voice package with environment setup and docker-compose configuration
This commit is contained in:
@@ -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 \
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
[develop]
|
||||||
|
script_dir=$base/lib/iiwa_voice
|
||||||
|
[install]
|
||||||
|
install_scripts=$base/lib/iiwa_voice
|
||||||
@@ -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': [
|
||||||
|
],
|
||||||
|
},
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user