From 342966e867a3d2b83539f65ff8af4a4dba4eff69 Mon Sep 17 00:00:00 2001 From: alf Date: Fri, 19 Jun 2026 20:17:43 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20clarifie=20VOICE=5FDEPLOYMENT=5FSPEC=20?= =?UTF-8?q?=C2=A71=20=E2=80=94=20/voices=20scanne=20WAV=20(=C3=A0=20conver?= =?UTF-8?q?tir)=20+=20cvps=20(pr=C3=AAte)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recadrage suite échange : pas un blocage fonctionnel ; c'est l'inventaire voulu (distinguer voix à convertir vs prêtes, garder les prêtes visibles après suppression WAV). Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/VOICE_DEPLOYMENT_SPEC.md | 37 +++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/docs/VOICE_DEPLOYMENT_SPEC.md b/docs/VOICE_DEPLOYMENT_SPEC.md index b2ba8bb..c388b16 100644 --- a/docs/VOICE_DEPLOYMENT_SPEC.md +++ b/docs/VOICE_DEPLOYMENT_SPEC.md @@ -29,26 +29,29 @@ --- -## 1. Adaptation **BLOQUANTE** — `/voices` doit refléter les `.cvps` déployés +## 1. Adaptation — `/voices` scanne WAV **et** `.cvps` (inventaire à-convertir / prête) -**Problème** : Kazeia-central supprime le WAV de la tablette après enrôlement (le WAV -est archivé sur le PC). Une voix qui n'a plus que son `.cvps` n'a **ni `.wav` ni -embedding Qwen3** → l'`ids = wav ∪ prefix` actuel **l'omet**. La voix est déployée et -fonctionnelle, mais **invisible** de `/voices` (donc du picker admin et de -Kazeia-central). Incident « zelda » généralisé. +**Intention** : `/voices` doit refléter le cycle de vie d'une voix en scannant **les +deux** dossiers, chacun pour un état : +- **WAV présent, pas de `.cvps`** → voix **« à convertir »** (enregistrée, en attente + d'enrôlement par Kazeia-central). +- **`.cvps` présent** → voix **« prête »** (enrôlée + déployée). -**Demande** : étendre `voicesCursor()` pour **inclure les basenames de -`/cosyvoice/*.cvps`** dans l'union d'ids, et exposer leur présence. +Conséquence voulue : après conversion+déploiement puis suppression du WAV (le WAV est +archivé côté PC), la voix **reste affichée « prête »** grâce au scan `.cvps` — elle ne +disparaît pas de l'inventaire. (Aujourd'hui `voicesCursor()` ne scanne que +`WAV ∪ embeddings Qwen3` → une voix `.cvps`-seule serait omise.) -- Union d'ids = `basenames(*.wav) ∪ basenames(prefix.bin) ∪ basenames(*.cvps)`. -- Nouvelle colonne **`cvps_exists`** (0/1) à `/voices`. -- `state` : une voix avec `.cvps` présent est **`ready`** (CosyVoice = TTS de prod). - Proposition de cascade : `ready` si `cvps_exists` **ou** (prefix+suffix Qwen3) ; - `recorded` si seul le WAV ; `error` sinon. -- Colonnes inchangées par ailleurs (compat ascendante : ajout additif d'une colonne). +**Demande** : étendre `voicesCursor()` — +- Union d'ids = `basenames(*.wav) ∪ basenames(prefix.bin) ∪ basenames(cosyvoice/*.cvps)`. +- Nouvelle colonne **`cvps_exists`** (0/1). +- `state` (cascade) : **`ready`** si `cvps_exists` (ou prefix+suffix Qwen3 legacy) ; + **`recorded`** (= « à convertir ») si seul le WAV ; `error` sinon. +- Ajout additif (colonne en plus) → compat ascendante. -> Sans cette adaptation, le reste du workflow « enrôle → déploie → supprime le WAV » -> casse l'inventaire. C'est le **prérequis n°1**. +> Pas un prérequis fonctionnel (la synthèse charge le `.cvps` par son nom, sans cette +> liste), mais c'est l'**inventaire voulu** : distinguer voix à convertir vs prêtes, et +> garder les voix prêtes visibles une fois le WAV supprimé. --- @@ -111,7 +114,7 @@ Deux options : | # | Adaptation | Criticité | Forme | | --- | --- | --- | --- | -| 1 | `/voices` inclut les `.cvps` (`cvps_exists`, `state=ready`, ids ∪ cvps) | **bloquant** | curseur `voicesCursor()` | +| 1 | `/voices` scanne WAV (« à convertir ») **et** `.cvps` (« prête »), col. `cvps_exists` | inventaire voulu | curseur `voicesCursor()` | | 2 | `voices_reload` (rescan + `RELOAD_VOICES`, constante `ACTION_RELOAD_VOICES`) | important | méthode `call()` | | 4 | exclusivité on-device | conditionnel (si multi-patients/tablette) | à décider §4 |