عملی سبق

Text-to-Speech Implementation

متن کو قدرتی آواز میں تبدیل کرنا سیکھیں

⏱️20 منٹ
📖Intermediate Level
🔊Text-to-Speech

اس سبق میں آپ سیکھیں گے کہ کیسے Web Speech Synthesis API استعمال کرکے متن کو آواز میں تبدیل کیا جائے۔ یہ feature accessibility اور user experience کو بہتر بناتا ہے۔

📋 Prerequisites: HTML, CSS, JavaScript کی بنیادی معلومات ضروری ہے۔

🔊Web Speech Synthesis API

Web Speech Synthesis API ایک browser API ہے جو text-to-speech functionality فراہم کرتی ہے:

✅ Features:

  • Browser built-in API
  • Multiple voices
  • Rate, pitch, volume control
  • Language selection
  • Play, pause, stop controls

📊 Browser Support:

  • Chrome: ✅ Full
  • Edge: ✅ Full
  • Safari: ✅ Full
  • Firefox: ✅ Full

🎵Voice Selection

مختلف browsers مختلف voices فراہم کرتے ہیں:

Available Voice Types:

  • System Voices: OS میں pre-installed voices
  • Online Voices: Cloud-based voices (better quality)
  • Language-specific: Urdu, Arabic, English, etc.

💡 نوٹ: Urdu voices کی availability browser اور OS پر منحصر ہے۔ اگر Urdu voice نہیں ملتی، تو code میں fallback mechanism شامل ہے۔

⚙️Implementation Steps

1. API Initialization

let synth = window.speechSynthesis;
let utterance = new SpeechSynthesisUtterance(text);

2. Configuration

utterance.lang = 'ur-PK';  // Language
utterance.rate = 1.0;      // Speed (0.1 to 10)
utterance.pitch = 1.0;     // Pitch (0 to 2)
utterance.volume = 1.0;    // Volume (0 to 1)
utterance.voice = voices[0]; // Voice selection

3. Controls

synth.speak(utterance);  // Play
synth.pause();            // Pause
synth.resume();           // Resume
synth.cancel();           // Stop

💻مکمل HTML کوڈ

نیچے دیا گیا کوڈ مکمل Text-to-Speech app ہے۔ اسے کاپی کریں اور test کریں۔

Complete Text-to-Speech App
<!DOCTYPE html>
<html lang="ur">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>متن سے آواز</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body { 
            font-family: system-ui, sans-serif; 
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            padding: 20px; 
            direction: rtl;
            min-height: 100vh;
        }
        .container { 
            max-width: 700px; 
            margin: 0 auto; 
            background: white; 
            padding: 30px; 
            border-radius: 16px; 
            box-shadow: 0 10px 40px rgba(0,0,0,0.2);
        }
        h1 {
            text-align: center;
            color: #1e293b;
            margin-bottom: 30px;
            font-size: 28px;
        }
        .input-area {
            margin-bottom: 20px;
        }
        textarea {
            width: 100%;
            padding: 15px;
            border: 2px solid #e2e8f0;
            border-radius: 12px;
            font-size: 16px;
            min-height: 150px;
            resize: vertical;
            font-family: inherit;
        }
        .controls {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 10px;
            margin-bottom: 20px;
        }
        select {
            padding: 12px;
            border: 2px solid #e2e8f0;
            border-radius: 8px;
            font-size: 16px;
            background: white;
        }
        .button-group {
            display: flex;
            gap: 10px;
            margin-bottom: 20px;
        }
        .btn {
            flex: 1;
            padding: 15px;
            border: none;
            border-radius: 8px;
            font-size: 16px;
            font-weight: bold;
            cursor: pointer;
            transition: all 0.3s;
        }
        .btn.play {
            background: linear-gradient(135deg, #10b981 0%, #059669 100%);
            color: white;
        }
        .btn.play:hover {
            transform: scale(1.02);
            box-shadow: 0 5px 20px rgba(16, 185, 129, 0.4);
        }
        .btn.pause {
            background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
            color: white;
        }
        .btn.stop {
            background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
            color: white;
        }
        .btn:disabled {
            opacity: 0.5;
            cursor: not-allowed;
        }
        .status {
            text-align: center;
            padding: 15px;
            border-radius: 8px;
            margin-bottom: 20px;
            font-weight: 500;
            background: #f8fafc;
            border: 2px solid #e2e8f0;
            color: #64748b;
        }
        .error {
            background: #fee2e2;
            color: #991b1b;
            padding: 15px;
            border-radius: 8px;
            margin-top: 10px;
            border: 2px solid #ef4444;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>🔊 متن سے آواز</h1>
        
        <div class="status" id="status">تیار - متن درج کریں اور "پلے" پر کلک کریں</div>

        <div class="input-area">
            <textarea id="textInput" placeholder="یہاں اپنا متن لکھیں...">السلام علیکم! یہ ایک text-to-speech test ہے۔</textarea>
        </div>

        <div class="controls">
            <select id="voiceSelect">
                <option value="">Default Voice</option>
            </select>
            <select id="rateSelect">
                <option value="0.5">0.5x (بہت آہستہ)</option>
                <option value="0.75">0.75x (آہستہ)</option>
                <option value="1" selected>1x (عام)</option>
                <option value="1.25">1.25x (تیز)</option>
                <option value="1.5">1.5x (بہت تیز)</option>
            </select>
        </div>

        <div class="button-group">
            <button class="btn play" id="playBtn" onclick="speak()">▶️ پلے</button>
            <button class="btn pause" id="pauseBtn" onclick="pause()" disabled>⏸️ پاس</button>
            <button class="btn stop" id="stopBtn" onclick="stop()" disabled>⏹️ سٹاپ</button>
        </div>

        <div id="error" class="error" style="display: none;"></div>
    </div>

    <script>
        let synth = window.speechSynthesis;
        let utterance = null;
        let voices = [];

        // Load available voices
        function loadVoices() {
            voices = synth.getVoices();
            const voiceSelect = document.getElementById('voiceSelect');
            
            // Clear existing options
            voiceSelect.innerHTML = '<option value="">Default Voice</option>';
            
            // Filter Urdu/Arabic/Hindi voices
            const urduVoices = voices.filter(voice => 
                voice.lang.includes('ur') || 
                voice.lang.includes('ar') || 
                voice.lang.includes('hi') ||
                voice.lang.includes('en')
            );
            
            urduVoices.forEach((voice, index) => {
                const option = document.createElement('option');
                option.value = index;
                option.textContent = voice.name + ' (' + voice.lang + ')';
                voiceSelect.appendChild(option);
            });
        }

        // Load voices when available
        if (speechSynthesis.onvoiceschanged !== undefined) {
            speechSynthesis.onvoiceschanged = loadVoices;
        }
        loadVoices(); // For Chrome

        function speak() {
            const text = document.getElementById('textInput').value.trim();
            if (!text) {
                showError('براہ کرم متن درج کریں');
                return;
            }

            // Stop any ongoing speech
            synth.cancel();

            utterance = new SpeechSynthesisUtterance(text);
            
            // Set voice
            const voiceIndex = document.getElementById('voiceSelect').value;
            if (voiceIndex) {
                utterance.voice = voices[voiceIndex];
            }

            // Set rate
            utterance.rate = parseFloat(document.getElementById('rateSelect').value);

            // Set language (Urdu)
            utterance.lang = 'ur-PK';

            // Event handlers
            utterance.onstart = function() {
                document.getElementById('status').textContent = '🔊 آواز چل رہی ہے...';
                document.getElementById('status').style.background = '#d1fae5';
                document.getElementById('status').style.borderColor = '#10b981';
                document.getElementById('status').style.color = '#065f46';
                document.getElementById('playBtn').disabled = true;
                document.getElementById('pauseBtn').disabled = false;
                document.getElementById('stopBtn').disabled = false;
            };

            utterance.onend = function() {
                document.getElementById('status').textContent = '✅ آواز مکمل ہو گئی';
                document.getElementById('status').style.background = '#f8fafc';
                document.getElementById('status').style.borderColor = '#e2e8f0';
                document.getElementById('status').style.color = '#64748b';
                document.getElementById('playBtn').disabled = false;
                document.getElementById('pauseBtn').disabled = true;
                document.getElementById('stopBtn').disabled = true;
            };

            utterance.onerror = function(event) {
                showError('خرابی: ' + event.error);
                document.getElementById('playBtn').disabled = false;
                document.getElementById('pauseBtn').disabled = true;
                document.getElementById('stopBtn').disabled = true;
            };

            synth.speak(utterance);
        }

        function pause() {
            if (synth.speaking && !synth.paused) {
                synth.pause();
                document.getElementById('status').textContent = '⏸️ روکا گیا';
                document.getElementById('pauseBtn').textContent = '▶️ Resume';
            } else if (synth.paused) {
                synth.resume();
                document.getElementById('status').textContent = '🔊 آواز چل رہی ہے...';
                document.getElementById('pauseBtn').textContent = '⏸️ پاس';
            }
        }

        function stop() {
            synth.cancel();
            document.getElementById('status').textContent = '⏹️ روک دیا گیا';
            document.getElementById('status').style.background = '#f8fafc';
            document.getElementById('status').style.borderColor = '#e2e8f0';
            document.getElementById('status').style.color = '#64748b';
            document.getElementById('playBtn').disabled = false;
            document.getElementById('pauseBtn').disabled = true;
            document.getElementById('stopBtn').disabled = true;
            document.getElementById('pauseBtn').textContent = '⏸️ پاس';
        }

        function showError(message) {
            const errorDiv = document.getElementById('error');
            errorDiv.textContent = message;
            errorDiv.style.display = 'block';
            setTimeout(function() {
                errorDiv.style.display = 'none';
            }, 5000);
        }

        // Check browser support
        if (!('speechSynthesis' in window)) {
            document.getElementById('status').textContent = '❌ آپ کا براؤزر Text-to-Speech سپورٹ نہیں کرتا';
            document.getElementById('playBtn').disabled = true;
        }
    </script>
</body>
</html>

Advanced Features

✨ اضافی فیچرز:

  • Pitch control (آواز کی اونچائی)
  • Volume control (آواز کی بلندی)
  • SSML support (advanced formatting)
  • Queue management (multiple utterances)
  • Audio visualization

🎯 Use Cases:

  • Accessibility features
  • Language learning apps
  • News readers
  • Navigation systems
  • Educational content