diff --git a/fishspeechv2/Chart.yaml b/fishspeechv2/Chart.yaml index 34ab1e790..9edfcb831 100644 --- a/fishspeechv2/Chart.yaml +++ b/fishspeechv2/Chart.yaml @@ -3,4 +3,4 @@ appVersion: 'webui-cuda-cu129-20260422' description: Fish Speech - Open-Source Multilingual Text-to-Speech with Voice Cloning name: fishspeechv2 type: application -version: '1.0.8' +version: '1.0.16' \ No newline at end of file diff --git a/fishspeechv2/OlaresManifest.yaml b/fishspeechv2/OlaresManifest.yaml index 048d8d418..fe7c1e5ba 100644 --- a/fishspeechv2/OlaresManifest.yaml +++ b/fishspeechv2/OlaresManifest.yaml @@ -8,9 +8,10 @@ metadata: description: SOTA Open Source TTS appid: fishspeechv2 title: Fish Speech - version: '1.0.8' + version: '1.0.16' categories: - AI + sharedEntrances: - name: fishspeechv2 title: Fish Speech @@ -58,6 +59,9 @@ spec: - GUI Inference: Offers a PyQt6 graphical interface that works seamlessly with the API server. Supports Linux, Windows, and macOS. upgradeDescription: | + + Add the Helm release revision to the download Job name so upgrades do not patch its immutable pod template. + Replace the Bitnami OpenResty proxy with official OpenResty and run it as UID/GID 1000 with writable runtime paths. - feat(model): switch bundled checkpoint to fishaudio/s2-pro (latest pro-tier expressive TTS / voice-cloning release). - chore(runtime): the fishspeech container's command now polls for the s2-pro download Job's `.s2-pro.done` marker before launching the WebUI, so it no longer starts before the weights are on disk. - fix(cuda): bypass `uv run` at container start and launch `run_webui.py` directly with `/app/.venv/bin/python` (plus `UV_NO_SYNC=1` / `UV_FROZEN=1`). Previously the image's `start_webui.sh` used `uv run`, which performed an implicit `uv sync` without `--extra cu129` at runtime and silently downgraded torch to cu126 — Blackwell (sm_120) then failed with "no kernel image is available for execution on the device". The baked cu129 venv is now preserved as-is. @@ -69,6 +73,11 @@ spec: locale: - en-US - zh-CN + - de-DE + - es-ES + - it-IT + - fr-FR + - ja-JP doc: https://speech.fish.audio/ license: - text: Apache-2.0 diff --git a/fishspeechv2/fishspeechv2/Chart.yaml b/fishspeechv2/fishspeechv2/Chart.yaml index 1fa7e88ad..550c0854d 100644 --- a/fishspeechv2/fishspeechv2/Chart.yaml +++ b/fishspeechv2/fishspeechv2/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: '1.25.3-2' +appVersion: '1.29.2.5' description: Fish Speech Client Proxy name: fishspeechv2 type: application diff --git a/fishspeechv2/fishspeechv2/templates/clientproxy.yaml b/fishspeechv2/fishspeechv2/templates/clientproxy.yaml index 3628b817a..30e654bb3 100644 --- a/fishspeechv2/fishspeechv2/templates/clientproxy.yaml +++ b/fishspeechv2/fishspeechv2/templates/clientproxy.yaml @@ -12,9 +12,19 @@ data: } server { + + client_body_temp_path /tmp/client_body; + + proxy_temp_path /tmp/proxy; + + fastcgi_temp_path /tmp/fastcgi; + + uwsgi_temp_path /tmp/uwsgi; + + scgi_temp_path /tmp/scgi; listen 8080; - access_log /opt/bitnami/openresty/nginx/logs/access.log; - error_log /opt/bitnami/openresty/nginx/logs/error.log; + access_log /dev/stdout; + error_log /dev/stderr; location /gradio_api/info { proxy_pass http://fishspeech.fishspeechv2server-shared:7860; @@ -159,15 +169,22 @@ spec: items: - key: nginx.conf path: nginx.conf + - name: nginx-runtime + emptyDir: {} containers: - name: nginx - image: docker.io/beclab/aboveos-bitnami-openresty:1.25.3-2 + image: "docker.io/openresty/openresty:1.29.2.5-bookworm-fat" + command: + - /usr/local/openresty/bin/openresty + args: + - -g + - "daemon off; pid /tmp/nginx.pid;" + securityContext: + runAsUser: 1000 + runAsGroup: 1000 ports: - containerPort: 8080 protocol: TCP - env: - - name: OPENRESTY_CONF_FILE - value: /etc/nginx/nginx.conf readinessProbe: exec: command: @@ -190,11 +207,10 @@ spec: memory: 64Mi volumeMounts: - name: nginx-config - mountPath: /etc/nginx/nginx.conf - subPath: nginx.conf - - name: nginx-config - mountPath: /opt/bitnami/openresty/nginx/conf/server_blocks/nginx.conf + mountPath: /etc/nginx/conf.d/default.conf subPath: nginx.conf + - name: nginx-runtime + mountPath: /var/run/openresty --- apiVersion: v1 diff --git a/fishspeechv2/fishspeechv2server/templates/deployment.yaml b/fishspeechv2/fishspeechv2server/templates/deployment.yaml index 169a5a08e..5178d71a4 100644 --- a/fishspeechv2/fishspeechv2server/templates/deployment.yaml +++ b/fishspeechv2/fishspeechv2server/templates/deployment.yaml @@ -177,7 +177,7 @@ spec: apiVersion: batch/v1 kind: Job metadata: - name: {{ .Release.Name }}-download-models + name: {{ .Release.Name }}-download-models-{{ .Release.Revision }} namespace: {{ .Release.Namespace }} labels: app: {{ .Release.Name }}-download-models @@ -188,6 +188,9 @@ spec: metadata: labels: app: {{ .Release.Name }}-download-models + gateway.olares.io/shared-caller-outbound: "false" + annotations: + linkerd.io/inject: disabled spec: restartPolicy: OnFailure containers: diff --git a/fishspeechv2/i18n/de-DE/OlaresManifest.yaml b/fishspeechv2/i18n/de-DE/OlaresManifest.yaml new file mode 100644 index 000000000..2a006e931 --- /dev/null +++ b/fishspeechv2/i18n/de-DE/OlaresManifest.yaml @@ -0,0 +1,37 @@ +metadata: + title: Fish Speech + description: SOTA Open-Source-TTS +spec: + fullDescription: | + **WICHTIGER HINWEIS** + Dies ist eine Shared App. Im gesamten Olares-System wird nur ein Dienst installiert. Jeder Nutzer kann einen Desktop-Eintrag installieren, um den Shared Entrance für den API-Aufruf zu nutzen. + + **ÜBERBLICK** + Wahrhaft menschenähnliche Text-to-Speech und Voice Cloning + + Gebündelter Checkpoint: [fishaudio/s2-pro](https://huggingface.co/fishaudio/s2-pro) — die neueste Pro-Tier-Veröffentlichung der expressiven TTS-/Voice-Cloning-Familie von Fish Audio. + + FishAudio-S2 Pro ist ein expressives Text-to-Speech-(TTS)- und Voice-Cloning-Modell von Fish Audio, das Sprache natürlich, realistisch und emotional reich erzeugen soll — nicht roboterhaft, nicht flach und nicht auf Studio-Narration beschränkt. + + FishAudio-S2 Pro konzentriert sich darauf, wie Menschen wirklich sprechen: mit Emotion, Variation, Pausen und Absicht. + + Funktionen + - Zero-shot- & Few-shot-TTS: 10- bis 30-sekündige Sprachprobe eingeben, um hochwertige TTS-Ausgabe zu erzeugen. + + - Mehrsprachig & cross-lingual: Mehrsprachigen Text einfach in das Eingabefeld kopieren — ohne Sprachsorge. Derzeit unterstützt: Englisch, Japanisch, Koreanisch, Chinesisch, Französisch, Deutsch, Arabisch und Spanisch. + + - Keine Phonem-Abhängigkeit: Das Modell generalisiert stark und braucht keine Phoneme für TTS. Es verarbeitet Text in beliebigen Schriftsystemen. + + - Hohe Genauigkeit: Niedrige CER (Character Error Rate) von ca. 0.4 % und WER (Word Error Rate) von ca. 0.8 % für Seed-TTS Eval. + + - Schnell: Mit torch compile beschleunigt; Echtzeitfaktor ca. 1:7 auf einer Nvidia RTX 4090 GPU. + + - WebUI-Inferenz: Einfache, Gradio-basierte Web-UI kompatibel mit Chrome, Firefox, Edge und anderen Browsern. + + - GUI-Inferenz: PyQt6-Oberfläche, die nahtlos mit dem API-Server arbeitet. Unterstützt Linux, Windows und macOS. + + upgradeDescription: | + - feat(model): gebündelten Checkpoint auf fishaudio/s2-pro umgestellt (neueste Pro-Tier expressive TTS-/Voice-Cloning-Veröffentlichung). + - chore(runtime): der Befehl des fishspeech-Containers pollt nun den `.s2-pro.done`-Marker des s2-pro-Download-Jobs, bevor die WebUI startet, damit sie nicht vor dem Vorhandensein der Gewichte startet. + - fix(cuda): `uv run` beim Containerstart umgehen und `run_webui.py` direkt mit `/app/.venv/bin/python` starten (plus `UV_NO_SYNC=1` / `UV_FROZEN=1`). Zuvor nutzte `start_webui.sh` des Images `uv run`, was zur Laufzeit ein implizites `uv sync` ohne `--extra cu129` ausführte und torch stillschweigend auf cu126 herabstufte — Blackwell (sm_120) scheiterte dann mit „no kernel image is available for execution on the device“. Das gebackene cu129-venv bleibt nun unverändert. + - fix(docker): CUDA 12.6 → 12.9 für Blackwell-(sm_120)-Unterstützung (#1225). CUDA 12.6 / cu126 scheitert mit „no kernel image available“ auf Blackwell-GPUs (RTX 5000 Serie, sm_120); Upgrade auf CUDA 12.9 / cu129 behebt das. CUDA_VER und UV_EXTRA sind als überschreibbare Build-Args in compose.base.yml exponiert, sodass Nutzer mit älteren Treibern weiterhin CUDA_VER=12.6.0 UV_EXTRA=cu126 setzen können. diff --git a/fishspeechv2/i18n/es-ES/OlaresManifest.yaml b/fishspeechv2/i18n/es-ES/OlaresManifest.yaml new file mode 100644 index 000000000..a71a9e10f --- /dev/null +++ b/fishspeechv2/i18n/es-ES/OlaresManifest.yaml @@ -0,0 +1,37 @@ +metadata: + title: Fish Speech + description: TTS open source de última generación +spec: + fullDescription: | + **NOTA IMPORTANTE** + Esta es una app compartida. Solo se instalará un servicio en todo el sistema Olares. Cada usuario puede instalar una entrada de escritorio para acceder o usar la entrada compartida y llamar a la API del servicio. + + **RESUMEN** + Text-to-Speech y clonación de voz verdaderamente humanos + + Checkpoint incluido: [fishaudio/s2-pro](https://huggingface.co/fishaudio/s2-pro) — la última versión pro de la familia TTS / clonación de voz expresiva de Fish Audio. + + FishAudio-S2 Pro es un modelo expresivo de text-to-speech (TTS) y clonación de voz de Fish Audio, diseñado para generar habla natural, realista y emocionalmente rica — no robótica, no plana ni limitada a narración de estudio. + + FishAudio-S2 Pro se centra en cómo hablan realmente las personas: con emoción, variación, pausas e intención. + + Características + - TTS zero-shot y few-shot: introduzca una muestra vocal de 10 a 30 segundos para generar TTS de alta calidad. + + - Soporte multilingüe y cross-lingual: pegue texto multilingüe en el cuadro — sin preocuparse por el idioma. Actualmente: inglés, japonés, coreano, chino, francés, alemán, árabe y español. + + - Sin dependencia de fonemas: fuerte generalización; no depende de fonemas para TTS. Maneja texto en cualquier escritura. + + - Alta precisión: CER (Character Error Rate) baja de ~0.4 % y WER (Word Error Rate) de ~0.8 % en Seed-TTS Eval. + + - Rápido: acelerado con torch compile; factor en tiempo real ~1:7 en una GPU Nvidia RTX 4090. + + - Inferencia WebUI: UI web fácil basada en Gradio, compatible con Chrome, Firefox, Edge y otros. + + - Inferencia GUI: interfaz PyQt6 que funciona con el servidor API. Compatible con Linux, Windows y macOS. + + upgradeDescription: | + - feat(model): cambiar el checkpoint incluido a fishaudio/s2-pro (última versión pro de TTS / clonación de voz expresiva). + - chore(runtime): el comando del contenedor fishspeech ahora espera el marcador `.s2-pro.done` del Job de descarga s2-pro antes de lanzar la WebUI, para no arrancar antes de que los pesos estén en disco. + - fix(cuda): evitar `uv run` al inicio del contenedor y lanzar `run_webui.py` directamente con `/app/.venv/bin/python` (más `UV_NO_SYNC=1` / `UV_FROZEN=1`). Antes, `start_webui.sh` usaba `uv run`, que hacía un `uv sync` implícito sin `--extra cu129` y degradaba torch a cu126 — Blackwell (sm_120) fallaba con "no kernel image is available for execution on the device". El venv cu129 embebido se conserva tal cual. + - fix(docker): subir CUDA 12.6 → 12.9 para soporte Blackwell (sm_120) (#1225). CUDA 12.6 / cu126 falla con "no kernel image available" en GPUs Blackwell (serie RTX 5000, sm_120); actualizar a CUDA 12.9 / cu129 lo corrige. CUDA_VER y UV_EXTRA se exponen como build args anulables en compose.base.yml para que usuarios con drivers antiguos puedan pasar CUDA_VER=12.6.0 UV_EXTRA=cu126. diff --git a/fishspeechv2/i18n/fr-FR/OlaresManifest.yaml b/fishspeechv2/i18n/fr-FR/OlaresManifest.yaml new file mode 100644 index 000000000..853c94964 --- /dev/null +++ b/fishspeechv2/i18n/fr-FR/OlaresManifest.yaml @@ -0,0 +1,37 @@ +metadata: + title: Fish Speech + description: TTS open source SOTA +spec: + fullDescription: | + **NOTE IMPORTANTE** + Il s'agit d'une app partagée. Un seul service sera installé sur l'ensemble du système Olares. Chaque utilisateur peut installer une entrée bureau pour accéder ou utiliser l'entrée partagée afin d'appeler l'API du service. + + **APERÇU** + Text-to-Speech et clonage vocal véritablement humains + + Checkpoint inclus : [fishaudio/s2-pro](https://huggingface.co/fishaudio/s2-pro) — la dernière version pro de la famille TTS / clonage vocal expressif de Fish Audio. + + FishAudio-S2 Pro est un modèle expressif de text-to-speech (TTS) et de clonage vocal développé par Fish Audio, conçu pour générer une parole naturelle, réaliste et riche en émotion — ni robotique, ni plate, ni limitée à la narration studio. + + FishAudio-S2 Pro se concentre sur la façon dont les humains parlent vraiment : avec émotion, variation, pauses et intention. + + Fonctionnalités + - TTS zero-shot et few-shot : fournissez un échantillon vocal de 10 à 30 secondes pour générer un TTS de haute qualité. + + - Support multilingue et cross-lingual : collez du texte multilingue dans la zone de saisie — sans vous soucier de la langue. Pris en charge : anglais, japonais, coréen, chinois, français, allemand, arabe et espagnol. + + - Pas de dépendance aux phonèmes : forte généralisation ; ne repose pas sur les phonèmes pour le TTS. Gère le texte dans n'importe quel système d'écriture. + + - Très précis : faible CER (Character Error Rate) d'environ 0.4 % et WER (Word Error Rate) d'environ 0.8 % pour Seed-TTS Eval. + + - Rapide : accéléré par torch compile ; facteur temps réel d'environ 1:7 sur GPU Nvidia RTX 4090. + + - Inférence WebUI : interface web Gradio facile à utiliser, compatible Chrome, Firefox, Edge et autres. + + - Inférence GUI : interface graphique PyQt6 qui fonctionne avec le serveur API. Compatible Linux, Windows et macOS. + + upgradeDescription: | + - feat(model) : bascule du checkpoint inclus vers fishaudio/s2-pro (dernière version pro TTS / clonage vocal expressif). + - chore(runtime) : la commande du conteneur fishspeech interroge désormais le marqueur `.s2-pro.done` du Job de téléchargement s2-pro avant de lancer la WebUI, pour ne pas démarrer avant que les poids soient sur disque. + - fix(cuda) : contourner `uv run` au démarrage du conteneur et lancer `run_webui.py` directement avec `/app/.venv/bin/python` (plus `UV_NO_SYNC=1` / `UV_FROZEN=1`). Auparavant, `start_webui.sh` utilisait `uv run`, qui faisait un `uv sync` implicite sans `--extra cu129` et rétrogradait torch vers cu126 — Blackwell (sm_120) échouait alors avec « no kernel image is available for execution on the device ». Le venv cu129 embarqué est désormais préservé. + - fix(docker) : passer CUDA 12.6 → 12.9 pour le support Blackwell (sm_120) (#1225). CUDA 12.6 / cu126 échoue avec « no kernel image available » sur les GPU Blackwell (série RTX 5000, sm_120) ; la mise à niveau vers CUDA 12.9 / cu129 corrige cela. CUDA_VER et UV_EXTRA sont exposés comme build args surchargeables dans compose.base.yml pour que les utilisateurs avec d'anciens pilotes puissent passer CUDA_VER=12.6.0 UV_EXTRA=cu126. diff --git a/fishspeechv2/i18n/it-IT/OlaresManifest.yaml b/fishspeechv2/i18n/it-IT/OlaresManifest.yaml new file mode 100644 index 000000000..7621a28da --- /dev/null +++ b/fishspeechv2/i18n/it-IT/OlaresManifest.yaml @@ -0,0 +1,37 @@ +metadata: + title: Fish Speech + description: TTS open source SOTA +spec: + fullDescription: | + **NOTA IMPORTANTE** + Questa è un'app condivisa. Nell'intero sistema Olares verrà installato un solo servizio. Ogni utente può installare una voce desktop per accedere o usare l'entrance condivisa e chiamare l'API del servizio. + + **PANORAMICA** + Text-to-Speech e Voice Cloning davvero umani + + Checkpoint incluso: [fishaudio/s2-pro](https://huggingface.co/fishaudio/s2-pro) — l'ultima release pro-tier della famiglia TTS / voice-cloning espressiva di Fish Audio. + + FishAudio-S2 Pro è un modello espressivo di text-to-speech (TTS) e voice cloning di Fish Audio, progettato per generare parlato naturale, realistico ed emotivamente ricco — non robotico, non piatto e non limitato alla narrazione da studio. + + FishAudio-S2 Pro si concentra su come parlano davvero le persone: con emozione, variazioni, pause e intenzione. + + Funzionalità + - TTS zero-shot e few-shot: inserisci un campione vocale di 10–30 secondi per generare TTS di alta qualità. + + - Supporto multilingue e cross-lingual: incolla testo multilingue nell'input — senza preoccuparti della lingua. Attualmente: inglese, giapponese, coreano, cinese, francese, tedesco, arabo e spagnolo. + + - Nessuna dipendenza dai fonemi: forte generalizzazione; non richiede fonemi per il TTS. Gestisce testo in qualsiasi script. + + - Alta accuratezza: CER (Character Error Rate) bassa ~0.4% e WER (Word Error Rate) ~0.8% su Seed-TTS Eval. + + - Veloce: accelerato con torch compile; fattore real-time circa 1:7 su GPU Nvidia RTX 4090. + + - Inferenza WebUI: UI web Gradio facile da usare, compatibile con Chrome, Firefox, Edge e altri. + + - Inferenza GUI: interfaccia grafica PyQt6 che lavora con il server API. Supporta Linux, Windows e macOS. + + upgradeDescription: | + - feat(model): passaggio del checkpoint incluso a fishaudio/s2-pro (ultima release pro-tier TTS / voice-cloning espressiva). + - chore(runtime): il comando del container fishspeech ora attende il marker `.s2-pro.done` del Job di download s2-pro prima di avviare la WebUI, così non parte prima che i pesi siano su disco. + - fix(cuda): bypass di `uv run` all'avvio del container e lancio diretto di `run_webui.py` con `/app/.venv/bin/python` (più `UV_NO_SYNC=1` / `UV_FROZEN=1`). Prima `start_webui.sh` usava `uv run`, che eseguiva un `uv sync` implicito senza `--extra cu129` e degradava torch a cu126 — Blackwell (sm_120) falliva con "no kernel image is available for execution on the device". Il venv cu129 baked è ora preservato. + - fix(docker): aggiornamento CUDA 12.6 → 12.9 per supporto Blackwell (sm_120) (#1225). CUDA 12.6 / cu126 fallisce con "no kernel image available" su GPU Blackwell (serie RTX 5000, sm_120); l'upgrade a CUDA 12.9 / cu129 lo risolve. CUDA_VER e UV_EXTRA sono esposti come build args sovrascrivibili in compose.base.yml così utenti con driver più vecchi possono passare CUDA_VER=12.6.0 UV_EXTRA=cu126. diff --git a/fishspeechv2/i18n/ja-JP/OlaresManifest.yaml b/fishspeechv2/i18n/ja-JP/OlaresManifest.yaml new file mode 100644 index 000000000..65de7d32c --- /dev/null +++ b/fishspeechv2/i18n/ja-JP/OlaresManifest.yaml @@ -0,0 +1,37 @@ +metadata: + title: Fish Speech + description: SOTA オープンソース TTS +spec: + fullDescription: | + **重要なお知らせ** + これは共有アプリです。Olares システム全体にインストールされるサービスは 1 つだけです。各ユーザーはデスクトップエントリをインストールして共有エントランス経由でサービス API を利用できます。 + + **概要** + 真に人間らしい Text-to-Speech とボイスクローニング + + 同梱チェックポイント: [fishaudio/s2-pro](https://huggingface.co/fishaudio/s2-pro) — Fish Audio の表現力豊かな TTS / ボイスクローニング系列の最新プロティア版。 + + FishAudio-S2 Pro は Fish Audio が開発した表現力豊かなテキスト読み上げ(TTS)およびボイスクローニングモデルで、自然でリアル、感情豊かな音声を生成するよう設計されています — ロボット的でも平坦でもなく、スタジオ風ナレーションに限定されません。 + + FishAudio-S2 Pro は人が実際に話す様子に焦点を当てます: 感情、抑揚、間、意図。 + + 機能 + - ゼロショット & フューショット TTS: 10〜30 秒の音声サンプルを入力して高品質 TTS を生成。 + + - 多言語・クロスリンガル対応: 入力欄に多言語テキストを貼るだけ — 言語を気にする必要なし。現在対応: 英語、日本語、韓国語、中国語、フランス語、ドイツ語、アラビア語、スペイン語。 + + - 音素依存なし: 強い汎化能力があり、TTS に音素を必要としません。あらゆる文字体系のテキストを処理可能。 + + - 高精度: Seed-TTS Eval で CER(文字誤り率)約 0.4%、WER(単語誤り率)約 0.8%。 + + - 高速: torch compile で加速。Nvidia RTX 4090 GPU でリアルタイム係数約 1:7。 + + - WebUI 推論: Gradio ベースの使いやすい Web UI。Chrome、Firefox、Edge などに対応。 + + - GUI 推論: API サーバーと連携する PyQt6 グラフィカルインターフェース。Linux、Windows、macOS 対応。 + + upgradeDescription: | + - feat(model): 同梱チェックポイントを fishaudio/s2-pro に切替(最新プロティアの表現力 TTS / ボイスクローニング)。 + - chore(runtime): fishspeech コンテナのコマンドが WebUI 起動前に s2-pro ダウンロード Job の `.s2-pro.done` マーカーをポーリングするようになり、重みがディスクに揃う前に起動しなくなりました。 + - fix(cuda): コンテナ起動時の `uv run` を回避し `/app/.venv/bin/python` で `run_webui.py` を直接起動(加えて `UV_NO_SYNC=1` / `UV_FROZEN=1`)。以前はイメージの `start_webui.sh` が `uv run` を使い、ランタイムで `--extra cu129` なしの暗黙的 `uv sync` が走り torch が cu126 に静かにダウングレード — Blackwell (sm_120) で "no kernel image is available for execution on the device" が発生。焼き込み済み cu129 venv はそのまま保持されます。 + - fix(docker): Blackwell (sm_120) 対応のため CUDA 12.6 → 12.9 に更新 (#1225)。CUDA 12.6 / cu126 は Blackwell GPU(RTX 5000 シリーズ、sm_120)で "no kernel image available" となり、CUDA 12.9 / cu129 へのアップグレードで解消。compose.base.yml で CUDA_VER と UV_EXTRA を上書き可能なビルド引数として公開し、古いドライバ利用者は CUDA_VER=12.6.0 UV_EXTRA=cu126 を渡せます。