| <!DOCTYPE html> |
| <html lang="fa" dir="rtl"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>تولید صدا با Stable Audio 3</title> |
| <style> |
| body { |
| font-family: Tahoma, Arial, sans-serif; |
| background-color: #f4f4f9; |
| color: #333; |
| padding: 20px; |
| max-width: 600px; |
| margin: 0 auto; |
| } |
| .container { |
| background: white; |
| padding: 20px; |
| border-radius: 8px; |
| box-shadow: 0 4px 6px rgba(0,0,0,0.1); |
| } |
| h1 { |
| font-size: 20px; |
| text-align: center; |
| margin-bottom: 20px; |
| } |
| .form-group { |
| margin-bottom: 15px; |
| } |
| label { |
| display: block; |
| margin-bottom: 5px; |
| font-weight: bold; |
| } |
| input, select, textarea { |
| width: 100%; |
| padding: 8px; |
| box-sizing: border-box; |
| border: 1px solid #ccc; |
| border-radius: 4px; |
| font-family: inherit; |
| } |
| button { |
| width: 100%; |
| padding: 10px; |
| background-color: #4CAF50; |
| color: white; |
| border: none; |
| border-radius: 4px; |
| cursor: pointer; |
| font-size: 16px; |
| font-family: inherit; |
| } |
| button:disabled { |
| background-color: #cccccc; |
| cursor: not-allowed; |
| } |
| #status { |
| margin-top: 15px; |
| text-align: center; |
| font-weight: bold; |
| } |
| audio { |
| width: 100%; |
| margin-top: 15px; |
| } |
| </style> |
| </head> |
| <body> |
| <div class="container"> |
| <h1>ابزار تولید صدا با Stable Audio 3</h1> |
| |
| <div class="form-group"> |
| <label for="variant">مدل (Model):</label> |
| <select id="variant"> |
| <option value="medium">Medium — general audio (largest)</option> |
| <option value="small-music">Small Music — 0.6B, music-focused</option> |
| <option value="small-sfx">Small SFX — 0.6B, sound effects</option> |
| </select> |
| </div> |
|
|
| <div class="form-group"> |
| <label for="prompt">پرامپت (توصیف صدا به انگلیسی):</label> |
| <textarea id="prompt" rows="3">A dream-like Synthpop instrumental that would accompany a dream-sequence in a surrealist movie 120 BPM</textarea> |
| </div> |
|
|
| <div class="form-group"> |
| <label for="duration">مدت زمان به ثانیه (حداکثر 380):</label> |
| <input type="number" id="duration" value="60" min="1" max="380"> |
| </div> |
|
|
| <div class="form-group"> |
| <label for="steps">مراحل (Steps):</label> |
| <input type="number" id="steps" value="8"> |
| </div> |
|
|
| <div class="form-group"> |
| <label for="cfg_scale">مقیاس CFG:</label> |
| <input type="number" step="0.1" id="cfg_scale" value="1.0"> |
| </div> |
|
|
| <div class="form-group"> |
| <label for="sampler_type">نوع نمونهبردار (Sampler):</label> |
| <select id="sampler_type"> |
| <option value="pingpong">pingpong</option> |
| </select> |
| </div> |
|
|
| <div class="form-group"> |
| <label for="seed">سید (Seed):</label> |
| <input type="number" id="seed" value="0"> |
| </div> |
|
|
| <button id="generateBtn">تولید صدا</button> |
|
|
| <div id="status"></div> |
| <audio id="audioPlayer" controls style="display: none;"></audio> |
| </div> |
|
|
| |
| <script type="module"> |
| import { Client } from "https://esm.sh/@gradio/client"; |
| |
| const generateBtn = document.getElementById('generateBtn'); |
| const statusDiv = document.getElementById('status'); |
| const audioPlayer = document.getElementById('audioPlayer'); |
| |
| generateBtn.addEventListener('click', async () => { |
| const variant = document.getElementById('variant').value; |
| const prompt = document.getElementById('prompt').value; |
| const duration = parseFloat(document.getElementById('duration').value); |
| const steps = parseInt(document.getElementById('steps').value); |
| const cfg_scale = parseFloat(document.getElementById('cfg_scale').value); |
| const sampler_type = document.getElementById('sampler_type').value; |
| const seed = parseInt(document.getElementById('seed').value); |
| |
| if (!prompt) { |
| statusDiv.innerText = 'لطفاً متن پرامپت را وارد کنید.'; |
| return; |
| } |
| |
| try { |
| generateBtn.disabled = true; |
| statusDiv.innerText = 'در حال اتصال به سرور و تولید صدا... این فرآیند ممکن است کمی زمانبر باشد.'; |
| audioPlayer.style.display = 'none'; |
| |
| |
| const client = await Client.connect("stabilityai/stable-audio-3"); |
| |
| |
| const result = await client.predict("/infer", { |
| variant_key: variant, |
| prompt: prompt, |
| duration: duration, |
| steps: steps, |
| cfg_scale: cfg_scale, |
| sampler_type: sampler_type, |
| seed: seed, |
| }); |
| |
| |
| if (result && result.data && result.data[0]) { |
| const audioData = result.data[0]; |
| const audioUrl = audioData.url; |
| |
| audioPlayer.src = audioUrl; |
| audioPlayer.style.display = 'block'; |
| statusDiv.innerText = 'تولید صدا با موفقیت انجام شد.'; |
| } else { |
| statusDiv.innerText = 'پاسخ نامعتبر از سرور دریافت شد.'; |
| } |
| } catch (error) { |
| console.error(error); |
| statusDiv.innerText = 'خطایی رخ داد: ' + error.message; |
| } finally { |
| generateBtn.disabled = false; |
| } |
| }); |
| </script> |
| </body> |
| </html> |