diff --git a/index.html b/index.html new file mode 100644 index 0000000..34037c7 --- /dev/null +++ b/index.html @@ -0,0 +1,82 @@ + + + + + + Bubble Bobble JS + + + +

Bubble Bobble JS

+ +
+
Score: 0
+
Vies: 3
+
Niveau: 1
+
+ +
+ +
+ +
+

Contrôles: Flèches pour déplacer, ESPACE pour sauter, CTRL pour tirer des bulles

+ + +
+ + + + \ No newline at end of file diff --git a/install-petitsmodelesvastai.md b/install-petitsmodelesvastai.md new file mode 100644 index 0000000..6e04c49 --- /dev/null +++ b/install-petitsmodelesvastai.md @@ -0,0 +1,30 @@ +cat << 'EOF' > /workspace/REINSTALL_CLEAN.md +# 📓 IA WORKSPACE : BACKUP COMPLET + +## 🎤 1. SYNTHÈSE VOCALE (PIPER TTS) +# Installation Système +apt-get update && apt-get install -y espeak-ng-data libespeak-ng1 ffmpeg wget + +# Installation Python (venv) +source /venv/main/bin/activate +pip install piper-tts flask uvicorn requests + +# Téléchargement Modèles +cd /workspace +wget -O voice.onnx https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR/siwis/low/fr_FR-siwis-low.onnx +wget -O voice.onnx.json https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR/siwis/low/fr_FR-siwis-low.onnx.json + +## 🎨 2. GÉNÉRATION D'IMAGES (COMFYUI) +cd /workspace +git clone https://github.com/comfyanonymous/ComfyUI.git +cd ComfyUI +pip install -r requirements.txt + +# Modèle SDXL +cd /workspace/ComfyUI/models/checkpoints/ +wget https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors + +## 🔗 3. URL OPEN WEBUI +- TTS: http://localhost:8000/v1 (Modèle: voice.onnx) +- IMAGE: http://localhost:8188 +EOF \ No newline at end of file diff --git a/jetonvastaigitea.txt b/jetonvastaigitea.txt new file mode 100644 index 0000000..ff6e992 --- /dev/null +++ b/jetonvastaigitea.txt @@ -0,0 +1,3 @@ +980621d1d7f71f71a403b6c31078bf8f3734441c + +https://git.syoul.fr/nicoboy/VASTAI-STUDIO-AUDIO/raw/branch/main/provisioning_script.sh?token=980621d1d7f71f71a403b6c31078bf8f3734441c \ No newline at end of file diff --git a/server.py(gradio) b/server.py(gradio) new file mode 100644 index 0000000..f706d28 --- /dev/null +++ b/server.py(gradio) @@ -0,0 +1,43 @@ +import gradio as gr +import torch +import scipy.io.wavfile +import numpy as np +import tempfile +from audiocraft.models import MusicGen, AudioGen + +print("🔄 Chargement des modèles...") +music_model = MusicGen.get_pretrained("facebook/musicgen-small") +audio_model = AudioGen.get_pretrained("facebook/audiogen-medium") + +def generate_music(prompt, duration=10): + music_model.set_generation_params(duration=duration) + wav = music_model.generate([prompt]) + wav_np = wav[0, 0].cpu().numpy() + with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f: + scipy.io.wavfile.write(f.name, music_model.sample_rate, (wav_np * 32767).astype(np.int16)) + return f.name + +def generate_sound(prompt, duration=5): + audio_model.set_generation_params(duration=duration) + wav = audio_model.generate([prompt]) + wav_np = wav[0, 0].cpu().numpy() + with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f: + scipy.io.wavfile.write(f.name, audio_model.sample_rate, (wav_np * 32767).astype(np.int16)) + return f.name + +with gr.Blocks(title="🎙️ Studio Audio IA") as demo: + gr.Markdown("## 🎙️ Studio Audio IA") + with gr.Tab("🎵 Musique"): + p1 = gr.Textbox(label="Prompt") + d1 = gr.Slider(5, 30, value=10, step=5, label="Durée (s)") + b1 = gr.Button("Générer") + o1 = gr.Audio(label="Résultat") + b1.click(generate_music, inputs=[p1, d1], outputs=o1) + with gr.Tab("🔊 Bruitages"): + p2 = gr.Textbox(label="Prompt") + d2 = gr.Slider(2, 15, value=5, label="Durée (s)") + b2 = gr.Button("Générer") + o2 = gr.Audio(label="Résultat") + b2.click(generate_sound, inputs=[p2, d2], outputs=o2) + +demo.launch(server_name="0.0.0.0", server_port=7860, share=False) \ No newline at end of file diff --git a/tts_server.py b/tts_server.py new file mode 100644 index 0000000..3a21276 --- /dev/null +++ b/tts_server.py @@ -0,0 +1,52 @@ +import os +import subprocess +import uuid +from flask import Flask, request, send_file, jsonify + +app = Flask(__name__) + +# CONFIGURATION +PIPER_MODEL = "/workspace/voice.onnx" +OUTPUT_DIR = "/workspace/temp_audio" + +# Créer le dossier temporaire s'il n'existe pas +os.makedirs(OUTPUT_DIR, exist_ok=True) + +@app.route('/v1/audio/speech', methods=['POST']) +def text_to_speech(): + data = request.json + text = data.get("input") + + if not text: + return jsonify({"error": "No input text provided"}), 400 + + # Générer un nom de fichier unique + file_id = str(uuid.uuid4()) + output_file = os.path.join(OUTPUT_DIR, f"{file_id}.wav") + + try: + # Commande Piper : lit le texte via stdin et écrit dans un fichier + # On utilise echo pour envoyer le texte à Piper + command = f'echo "{text}" | piper --model {PIPER_MODEL} --output_file {output_file}' + + # Exécution de la commande + subprocess.run(command, shell=True, check=True) + + # Envoyer le fichier généré à Open WebUI + return send_file(output_file, mimetype="audio/wav") + + except subprocess.CalledProcessError as e: + return jsonify({"error": f"Piper failed: {str(e)}"}), 500 + except Exception as e: + return jsonify({"error": str(e)}), 500 + +@app.route('/v1/models', methods=['GET']) +def list_models(): + # Nécessaire pour que certaines interfaces valident la connexion + return jsonify({ + "data": [{"id": "voice.onnx", "object": "model", "owned_by": "piper"}] + }) + +if __name__ == '__main__': + # Le serveur écoute sur toutes les interfaces sur le port 8000 + app.run(host='0.0.0.0', port=8000) \ No newline at end of file