Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
a694e77
Merge pull request #9 from Sentience-Robotics/dev
Popochounet Jan 30, 2026
2a3d9af
feat(gesture): all gesture ray module from EMAGE
bernTP May 26, 2026
17098ac
feat(tts): all files related to CosyTTS
bernTP May 26, 2026
2847f72
feat(helm): local cluster featuring AMD and NVIDIA
bernTP May 26, 2026
251382b
Merge branch 'tpm/#29/emage-gesture' into tpm/#32/tts-gesture-rag
bernTP May 26, 2026
145cbce
Merge branch 'tpm/#30/local-kube-example' into tpm/#32/tts-gesture-rag
bernTP May 26, 2026
5e9eb3b
Merge branches
bernTP May 26, 2026
bb455c4
Merge branch 'tpm/#28/tts-huri-module' into tpm/#32/tts-gesture-rag
bernTP May 27, 2026
a237d26
fixed(tts): module deplyment and init
bernTP May 27, 2026
d104b7b
fixed(rag): streaming tokens + removing deprecated docker_services si…
bernTP May 27, 2026
616087a
feated(helm): modules loading between local nvidia and amd example he…
bernTP May 27, 2026
fe93959
fixed(tts): gesture and tts connection using pts + summarizing data f…
bernTP May 29, 2026
b728cd8
fixed(rag): init arguments not being taken in kube values + hot value…
bernTP May 29, 2026
ad7f658
fixed(tts): fixed bi stream capacity + debug logs support directly in…
bernTP May 29, 2026
080f342
feated(stt): using kube PVC to store whisper model
bernTP May 29, 2026
5146a0e
feat(kube): ingress template to avoid port forwarding huri for the so…
bernTP May 29, 2026
d17f6bf
feat(kube): new values to support new ingress and stt cache system (+…
bernTP May 29, 2026
69c614b
fix(tts): text to speech missing tokens in audio
bernTP May 31, 2026
01ac7ef
feat(client): option to save streamed TTS audio to .wav files
bernTP May 31, 2026
28e279f
fix(stt): missing lookup for PVC on kube init
bernTP May 31, 2026
734aaf9
feat(gesture): warmup to generate output faster on first time
bernTP Jun 1, 2026
191b6b0
feat(tts): using CosyVoice3 model
bernTP Jun 1, 2026
5bc82be
fixed(stt): audio_in event for the pipeline, so that text is read by RAG
bernTP Jun 1, 2026
14a06bf
fix(stt): going back to previous STT impelmentation, with a simpler h…
bernTP Jun 1, 2026
a1f5e6d
feat(rag): profile data from RAG based of uid
bernTP Jun 1, 2026
2e74004
fixed(huri): Qdrant too old dependancy + new nvidia dependancies
bernTP Jun 1, 2026
1164213
feat(huri): core config uid fetching
bernTP Jun 1, 2026
109491a
feat(huri): automatically exclude outputed .wav files
bernTP Jun 1, 2026
f9d3a93
feat(rag): improved prompt to avoid too long sentences
bernTP Jun 1, 2026
a048d9a
feat(sender): sending topic type to clients
bernTP Jun 1, 2026
2e40400
fix(rag): missing previous prompt context
bernTP Jun 2, 2026
0b39013
fix(gesture): smoother transition from sliding window + small desync …
bernTP Jun 2, 2026
818bad8
fixed(gesture): warmup now works when cold starting
bernTP Jun 2, 2026
fa4bb76
feat(huri): refactorisation on modules and removing temp features
bernTP Jun 10, 2026
93237f7
fixed(rag): qdrant is installed on all dockerfiles
bernTP Jun 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,12 @@ cython_debug/
# PyPI configuration file
.pypirc

# Helm
**/charts/*.tgz

# Others
.trash
docs
docs

# HuRI client outputs
*.wav
44 changes: 44 additions & 0 deletions config/client_full.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
huri_url: ws://localhost:8000/session

topic_list: [transcript, question, token, motion]

senders:
audio:
name: audio
args:
sample_rate: 16000
frame_duration: 0.030

modules:
mic:
name: mic
args:
vad_agressiveness: 3
silence_duration: 1.5
block_duration: ${senders.audio.args.frame_duration}
logging: INFO
stt:
name: stt
args:
language: en
block_duration: ${senders.audio.args.frame_duration}
logging: INFO
tag:
name: tag
logging: INFO
rag:
name: rag
args:
language: en
tone: formal
response_format: paragraph
max_length: 1024
logging: INFO
tts:
name: tts
args:
min_clause_chars: 20
logging: INFO
gesture:
name: gesture
logging: INFO
35 changes: 0 additions & 35 deletions config/huri.yaml

This file was deleted.

79 changes: 79 additions & 0 deletions deploy/Dockerfile.amd
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
FROM rayproject/ray:2.55.1-py312
WORKDIR /app
USER root
RUN apt-get update && apt-get install -y \
build-essential \
curl \
gnupg2 \
&& rm -rf /var/lib/apt/lists/*

# Add ROCm 7.2.3 repository (Ubuntu 22.04 Jammy)
RUN curl -fsSL https://repo.radeon.com/rocm/rocm.gpg.key | gpg --dearmor -o /etc/apt/keyrings/rocm.gpg \
&& printf 'deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/7.2.3 jammy main\ndeb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/7.2 jammy main\n' \
> /etc/apt/sources.list.d/rocm.list \
&& printf 'Package: *\nPin: release o=repo.radeon.com\nPin-Priority: 600\n' \
> /etc/apt/preferences.d/rocm-pin-600

# Install ROCm runtime + libraries
RUN apt-get update && apt-get install -y \
rocm-hip-runtime \
rocm-hip-libraries \
rocm-device-libs \
rocm-smi-lib \
rocblas \
hipblas \
miopen-hip \
rccl \
rocsolver \
rocfft \
rocrand \
hipsparse \
&& rm -rf /var/lib/apt/lists/*

# Set ROCm environment
ENV ROCM_PATH=/opt/rocm
ENV PATH="${ROCM_PATH}/bin:${PATH}"
ENV LD_LIBRARY_PATH="${ROCM_PATH}/lib:${LD_LIBRARY_PATH}"

USER ray


COPY serve_requirements.txt /app
RUN pip install --no-cache-dir -r serve_requirements.txt

# 1. AMD's PyTorch built for ROCm (NOT the PyPI one — it's built for ROCm 6.2 and will silently break)
ARG ROCM_VERSION=7.2
ARG PYTHON_VERSION=cp312
ARG TRITON_VERSION=3.4.0+rocm7.2.0.git0cace8d2

RUN pip install --no-cache-dir \
"https://repo.radeon.com/rocm/manylinux/rocm-rel-${ROCM_VERSION}/triton-${TRITON_VERSION}-${PYTHON_VERSION}-${PYTHON_VERSION}-linux_x86_64.whl"

RUN pip install --no-cache-dir \
--extra-index-url https://repo.radeon.com/rocm/pypi/ \
"https://repo.radeon.com/rocm/manylinux/rocm-rel-${ROCM_VERSION}/torch-2.8.0+rocm${ROCM_VERSION}.0.lw.gitbf943426-${PYTHON_VERSION}-${PYTHON_VERSION}-linux_x86_64.whl" \
"https://repo.radeon.com/rocm/manylinux/rocm-rel-${ROCM_VERSION}/torchaudio-2.8.0+rocm${ROCM_VERSION}.0.git6e1c7fe9-${PYTHON_VERSION}-${PYTHON_VERSION}-linux_x86_64.whl"

RUN pip install --no-cache-dir filelock sympy networkx jinja2 fsspec numpy

USER root

# 3. Official CTranslate2 ROCm wheel (it's inside a zip on the releases page)
RUN apt-get update && apt-get install -y unzip curl \
&& curl -L https://github.com/OpenNMT/CTranslate2/releases/download/v4.7.1/rocm-python-wheels-Linux.zip \
-o /tmp/ct2-rocm.zip \
&& unzip -j /tmp/ct2-rocm.zip 'temp-linux/ctranslate2-4.7.1-cp312-*manylinux*x86_64.whl' -d /tmp/ct2 \
&& pip install --no-cache-dir /tmp/ct2/ctranslate2-4.7.1-cp312-*.whl \
&& rm -rf /tmp/ct2 /tmp/ct2-rocm.zip

USER ray

# 4. faster-whisper
RUN pip install --no-cache-dir faster-whisper

# 5. RAG / LLM extras (httpx, qdrant-client, sentence-transformers, …)
# Installed last so the ROCm torch wheel installed above is the resolved one.
COPY requirements-amd.txt /app
RUN pip install --no-cache-dir -r requirements-amd.txt

COPY src /app/src
16 changes: 16 additions & 0 deletions deploy/Dockerfile.base
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
FROM rayproject/ray:2.55.1-py312

WORKDIR /app


USER root
RUN apt-get update && apt-get install -y \
build-essential \
&& rm -rf /var/lib/apt/lists/*

USER ray

COPY serve_requirements.txt /app
RUN pip install --no-cache-dir -r serve_requirements.txt

COPY src /app/src
31 changes: 31 additions & 0 deletions deploy/Dockerfile.nvidia
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
FROM rayproject/ray:2.55.1-py312-gpu

WORKDIR /app

# Full CUDA 12.1 dependency stack (CosyVoice2, faster-whisper, TensorRT, …).
# PyTorch cu121 wheels live on the PyTorch index; TensorRT wheels on the NGC index.
COPY requirements-nvidia.txt /app
RUN pip install --no-cache-dir \
--extra-index-url https://download.pytorch.org/whl/cu121 \
--extra-index-url https://pypi.ngc.nvidia.com \
-r requirements-nvidia.txt

COPY serve_requirements.txt /app
RUN pip install --no-cache-dir -r serve_requirements.txt

USER root

RUN apt-get update && apt-get install -y --no-install-recommends git \
&& rm -rf /var/lib/apt/lists/*

USER ray

# CosyVoice2 has no setup.py/pyproject.toml so it cannot be pip-installed.
# Clone at a pinned commit for supply-chain integrity and expose it via PYTHONPATH.
RUN git clone https://github.com/FunAudioLLM/CosyVoice.git /app/cosyvoice \
&& git -C /app/cosyvoice checkout 074ca6dc9e80a2f424f1f74b48bdd7d3fea531cc \
&& git -C /app/cosyvoice submodule update --init --recursive

ENV PYTHONPATH="/app/cosyvoice:${PYTHONPATH:-}"

COPY src /app/src
6 changes: 6 additions & 0 deletions deploy/examples/local_nvidia_amd/Chart.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
dependencies:
- name: kuberay-operator
repository: https://ray-project.github.io/kuberay-helm/
version: 1.6.0
digest: sha256:b9057481d9a5e2d8b8798488b0b321bbd3f6e43dcb5a9dea18b181641a63b400
generated: "2026-05-22T17:28:37.5934885+02:00"
20 changes: 20 additions & 0 deletions deploy/examples/local_nvidia_amd/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
apiVersion: v2
name: huri
description: HuRI service powered by Ray Serve on KubeRay
type: application
version: 0.1.0
appVersion: "2.52.0"
keywords:
- ray
- kuberay
- ray-serve
- robotics
- hri
maintainers:
- name: Sentience Robotics

dependencies:
- name: kuberay-operator
version: "1.6.0"
repository: "https://ray-project.github.io/kuberay-helm/"
condition: kuberay.install
72 changes: 72 additions & 0 deletions deploy/examples/local_nvidia_amd/templates/_helpers.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "huri.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Create a default fully-qualified app name.
Truncated at 63 chars because some Kubernetes name fields have this limit.
*/}}
{{- define "huri.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}

{{/*
Chart label: <name>-<version>.
*/}}
{{- define "huri.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
Common labels applied to every resource.
*/}}
{{- define "huri.labels" -}}
helm.sh/chart: {{ include "huri.chart" . }}
{{ include "huri.selectorLabels" . }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}

{{/*
Selector labels (used in matchLabels / ingress backends).
*/}}
{{- define "huri.selectorLabels" -}}
app.kubernetes.io/name: {{ include "huri.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

{{/*
Name of the KubeRay-managed serve service.
KubeRay appends "-serve-svc" to the RayService name.
*/}}
{{- define "huri.serveSvcName" -}}
{{- printf "%s-serve-svc" (include "huri.fullname" .) }}
{{- end }}

{{/*
Name of the KubeRay-managed head service.
KubeRay appends "-head-svc" to the RayService name.
*/}}
{{- define "huri.headSvcName" -}}
{{- printf "%s-head-svc" (include "huri.fullname" .) }}
{{- end }}

{{/*
Name of the stable dashboard service managed by this chart.
Selects the head pod via stable labels, avoiding KubeRay's random-suffix service.
*/}}
{{- define "huri.headDashboardSvcName" -}}
{{- printf "%s-head-dashboard-svc" (include "huri.fullname" .) }}
{{- end }}
Loading