# Dockerfile для обучения wake word модели openWakeWord # Python 3.11 + torch 2.5 (последний совместимый с py3.11) + рабочие зависимости 2026 FROM python:3.11-slim WORKDIR /app # Системные зависимости (включая build-essential для webrtcvad) RUN apt-get update && apt-get install -y \ git wget curl ffmpeg libsndfile1 \ build-essential python3-dev \ && rm -rf /var/lib/apt/lists/* # Клонируем openWakeWord и piper-sample-generator RUN git clone https://github.com/dscripka/openWakeWord /openWakeWord RUN git clone https://github.com/rhasspy/piper-sample-generator /piper-sample-generator # Torch 2.5.0 — последний для Python 3.11, CPU версия (обучение не требует GPU) RUN pip install --no-cache-dir \ torch==2.5.0 \ torchaudio==2.5.0 \ --index-url https://download.pytorch.org/whl/cpu # Зависимости обучения с совместимыми версиями RUN pip install --no-cache-dir \ mutagen==1.47.0 \ torchinfo==1.8.0 \ torchmetrics==1.2.0 \ speechbrain==1.0.3 \ audiomentations==0.43.1 \ torch-audiomentations==0.12.0 \ pronouncing==0.2.0 \ "datasets==2.20.0" \ "pyarrow==14.0.2" \ "fsspec==2023.12.2" \ acoustics==0.2.6 \ webrtcvad \ onnx \ onnxruntime \ onnx2tf \ pyyaml scipy scikit-learn tqdm # TFLite конвертация через onnx2tf (замена мёртвого onnx_tf) # Патчим train.py чтобы использовал onnx2tf вместо onnx_tf RUN pip install --no-cache-dir \ tensorflow-cpu==2.21.0 \ tensorflow_probability==0.24.0 RUN pip install --no-cache-dir -e /openWakeWord # Патч: заменяем onnx_tf на onnx2tf в train.py RUN python - <<'EOF' import re, pathlib train_py = pathlib.Path("/openWakeWord/openwakeword/train.py") text = train_py.read_text() # Заменяем импорт onnx_tf text = text.replace( "import onnx_tf", "import onnx2tf as onnx_tf_compat" ) text = text.replace( "from onnx_tf.backend import prepare", "# onnx_tf replaced by onnx2tf" ) # Заменяем вызов convert_onnx_to_tflite если он есть text = re.sub( r"onnx_tf\.backend\.prepare\(.*?\)", "None # onnx2tf handles tflite conversion differently", text, flags=re.DOTALL ) train_py.write_text(text) print("train.py patched OK") EOF # Устанавливаем piper-sample-generator RUN pip install --no-cache-dir -e /piper-sample-generator 2>/dev/null || \ pip install --no-cache-dir piper-tts # Скачиваем TTS модель LibriTTS-R medium (~66 MB) для генерации примеров RUN mkdir -p /piper-sample-generator/models && \ wget -q --show-progress \ -O /piper-sample-generator/models/en_US-libritts_r-medium.onnx \ "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx" && \ wget -q \ -O /piper-sample-generator/models/en_US-libritts_r-medium.onnx.json \ "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx.json" RUN mkdir -p /data /output /samples COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]