| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Text-to-Speech</title> |
| </head> |
| <body> |
| <h1>Text-to-Speech Conversion</h1> |
| <form action="/convert" method="post"> |
| <textarea name="text" rows="5" cols="50" placeholder="Enter text here"></textarea><br> |
| <select name="voice"> |
| <option value="">Select Voice</option> |
| |
| </select><br> |
| <label for="rate">Speech Rate Adjustment (%):</label> |
| <input type="range" id="rate" name="rate" min="-50" max="50" value="0"><br> |
| <label for="pitch">Pitch Adjustment (Hz):</label> |
| <input type="range" id="pitch" name="pitch" min="-20" max="20" value="0"><br> |
| <input type="submit" value="Convert"> |
| </form> |
| <script> |
| async function populateVoices() { |
| const response = await fetch('/voices'); |
| const voices = await response.json(); |
| const select = document.querySelector('select[name="voice"]'); |
| for (const [key, value] of Object.entries(voices)) { |
| const option = document.createElement('option'); |
| option.value = key; |
| option.textContent = key; |
| select.appendChild(option); |
| } |
| } |
| populateVoices(); |
| </script> |
| </body> |
| </html> |