You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/pa/6-consumer/lessons/3-spoken-feedback/pi-text-to-speech.md

13 KiB

ਟੈਕਸਟ ਤੋਂ ਬੋਲਣ - ਰਾਸਪਬੈਰੀ ਪਾਈ

ਇਸ ਪਾਠ ਦੇ ਇਸ ਹਿੱਸੇ ਵਿੱਚ, ਤੁਸੀਂ ਟੈਕਸਟ ਨੂੰ ਬੋਲਣ ਵਿੱਚ ਤਬਦੀਲ ਕਰਨ ਲਈ ਕੋਡ ਲਿਖੋਗੇ ਜੋ ਸਪੀਚ ਸਰਵਿਸ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ।

ਸਪੀਚ ਸਰਵਿਸ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਟੈਕਸਟ ਨੂੰ ਬੋਲਣ ਵਿੱਚ ਤਬਦੀਲ ਕਰੋ

ਟੈਕਸਟ ਨੂੰ REST API ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸਪੀਚ ਸਰਵਿਸ ਨੂੰ ਭੇਜਿਆ ਜਾ ਸਕਦਾ ਹੈ ਤਾਂ ਜੋ ਆਡੀਓ ਫਾਈਲ ਦੇ ਰੂਪ ਵਿੱਚ ਸਪੀਚ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾ ਸਕੇ, ਜਿਸਨੂੰ ਤੁਹਾਡੇ IoT ਡਿਵਾਈਸ 'ਤੇ ਚਲਾਇਆ ਜਾ ਸਕਦਾ ਹੈ। ਸਪੀਚ ਦੀ ਬੇਨਤੀ ਕਰਦੇ ਸਮੇਂ, ਤੁਹਾਨੂੰ ਵਰਤਣ ਲਈ ਆਵਾਜ਼ ਪ੍ਰਦਾਨ ਕਰਨੀ ਪਵੇਗੀ ਕਿਉਂਕਿ ਸਪੀਚ ਵੱਖ-ਵੱਖ ਆਵਾਜ਼ਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਤਿਆਰ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।

ਹਰ ਭਾਸ਼ਾ ਵੱਖ-ਵੱਖ ਆਵਾਜ਼ਾਂ ਦਾ ਸਮਰਥਨ ਕਰਦੀ ਹੈ, ਅਤੇ ਤੁਸੀਂ ਸਪੀਚ ਸਰਵਿਸ ਦੇ ਖਿਲਾਫ REST ਬੇਨਤੀ ਕਰਕੇ ਹਰ ਭਾਸ਼ਾ ਲਈ ਸਮਰਥਿਤ ਆਵਾਜ਼ਾਂ ਦੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ।

ਕੰਮ - ਇੱਕ ਆਵਾਜ਼ ਪ੍ਰਾਪਤ ਕਰੋ

  1. VS Code ਵਿੱਚ smart-timer ਪ੍ਰੋਜੈਕਟ ਖੋਲ੍ਹੋ।

  2. ਭਾਸ਼ਾ ਲਈ ਆਵਾਜ਼ਾਂ ਦੀ ਸੂਚੀ ਦੀ ਬੇਨਤੀ ਕਰਨ ਲਈ say ਫੰਕਸ਼ਨ ਦੇ ਉੱਪਰ ਹੇਠਾਂ ਦਿੱਤਾ ਕੋਡ ਸ਼ਾਮਲ ਕਰੋ:

    def get_voice():
        url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/voices/list'
    
        headers = {
            'Authorization': 'Bearer ' + get_access_token()
        }
    
        response = requests.get(url, headers=headers)
        voices_json = json.loads(response.text)
    
        first_voice = next(x for x in voices_json if x['Locale'].lower() == language.lower() and x['VoiceType'] == 'Neural')
        return first_voice['ShortName']
    
    voice = get_voice()
    print(f'Using voice {voice}')
    

    ਇਹ ਕੋਡ get_voice ਨਾਮਕ ਇੱਕ ਫੰਕਸ਼ਨ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦਾ ਹੈ ਜੋ ਸਪੀਚ ਸਰਵਿਸ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਆਵਾਜ਼ਾਂ ਦੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ। ਇਹ ਫਿਰ ਪਹਿਲੀ ਆਵਾਜ਼ ਨੂੰ ਲੱਭਦਾ ਹੈ ਜੋ ਵਰਤ ਰਹੀ ਭਾਸ਼ਾ ਨਾਲ ਮੇਲ ਖਾਂਦੀ ਹੈ।

    ਇਹ ਫੰਕਸ਼ਨ ਫਿਰ ਪਹਿਲੀ ਆਵਾਜ਼ ਨੂੰ ਸਟੋਰ ਕਰਨ ਲਈ ਕਾਲ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਅਤੇ ਆਵਾਜ਼ ਦਾ ਨਾਮ ਕੰਸੋਲ ਵਿੱਚ ਪ੍ਰਿੰਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਇਹ ਆਵਾਜ਼ ਇੱਕ ਵਾਰ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਅਤੇ ਟੈਕਸਟ ਨੂੰ ਸਪੀਚ ਵਿੱਚ ਤਬਦੀਲ ਕਰਨ ਲਈ ਹਰ ਕਾਲ ਲਈ ਇਸਦੀ ਵੈਲਿਊ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।

    💁 ਤੁਸੀਂ Microsoft Docs 'ਤੇ Language and voice support documentation ਤੋਂ ਸਮਰਥਿਤ ਆਵਾਜ਼ਾਂ ਦੀ ਪੂਰੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ। ਜੇ ਤੁਸੀਂ ਕਿਸੇ ਵਿਸ਼ੇਸ਼ ਆਵਾਜ਼ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਇਸ ਫੰਕਸ਼ਨ ਨੂੰ ਹਟਾ ਸਕਦੇ ਹੋ ਅਤੇ ਇਸ ਡੌਕੂਮੈਂਟੇਸ਼ਨ ਤੋਂ ਆਵਾਜ਼ ਦੇ ਨਾਮ ਨੂੰ ਹਾਰਡ ਕੋਡ ਕਰ ਸਕਦੇ ਹੋ। ਉਦਾਹਰਨ ਲਈ:

    voice = 'hi-IN-SwaraNeural'
    

ਕੰਮ - ਟੈਕਸਟ ਨੂੰ ਸਪੀਚ ਵਿੱਚ ਤਬਦੀਲ ਕਰੋ

  1. ਇਸ ਤੋਂ ਹੇਠਾਂ, ਸਪੀਚ ਸਰਵਿਸ ਤੋਂ ਪ੍ਰਾਪਤ ਕੀਤੇ ਜਾਣ ਵਾਲੇ ਆਡੀਓ ਫਾਰਮੈਟ ਲਈ ਇੱਕ ਕਾਂਸਟੈਂਟ ਪਰਿਭਾਸ਼ਿਤ ਕਰੋ। ਜਦੋਂ ਤੁਸੀਂ ਆਡੀਓ ਦੀ ਬੇਨਤੀ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਇਸਨੂੰ ਵੱਖ-ਵੱਖ ਫਾਰਮੈਟਾਂ ਵਿੱਚ ਕਰ ਸਕਦੇ ਹੋ।

    playback_format = 'riff-48khz-16bit-mono-pcm'
    

    ਤੁਹਾਡੇ ਹਾਰਡਵੇਅਰ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਕਿਹੜਾ ਫਾਰਮੈਟ ਵਰਤ ਸਕਦੇ ਹੋ। ਜੇ ਤੁਹਾਨੂੰ ਆਡੀਓ ਚਲਾਉਣ ਸਮੇਂ Invalid sample rate ਐਰਰ ਮਿਲਦੇ ਹਨ, ਤਾਂ ਇਸਨੂੰ ਕਿਸੇ ਹੋਰ ਵੈਲਿਊ ਵਿੱਚ ਬਦਲੋ। ਤੁਸੀਂ Microsoft Docs 'ਤੇ Text to speech REST API documentation ਵਿੱਚ ਸਮਰਥਿਤ ਵੈਲਿਊਜ਼ ਦੀ ਸੂਚੀ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ। ਤੁਹਾਨੂੰ riff ਫਾਰਮੈਟ ਆਡੀਓ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਲੋੜ ਹੋਵੇਗੀ, ਅਤੇ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਲਈ ਵੈਲਿਊਜ਼ ਹਨ riff-16khz-16bit-mono-pcm, riff-24khz-16bit-mono-pcm ਅਤੇ riff-48khz-16bit-mono-pcm

  2. ਇਸ ਤੋਂ ਹੇਠਾਂ, get_speech ਨਾਮਕ ਇੱਕ ਫੰਕਸ਼ਨ ਘੋਸ਼ਿਤ ਕਰੋ ਜੋ ਸਪੀਚ ਸਰਵਿਸ REST API ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਟੈਕਸਟ ਨੂੰ ਸਪੀਚ ਵਿੱਚ ਤਬਦੀਲ ਕਰੇਗਾ:

    def get_speech(text):
    
  3. get_speech ਫੰਕਸ਼ਨ ਵਿੱਚ, ਕਾਲ ਕਰਨ ਲਈ URL ਅਤੇ ਪਾਸ ਕਰਨ ਲਈ ਹੈਡਰ ਪਰਿਭਾਸ਼ਿਤ ਕਰੋ:

        url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/v1'
    
        headers = {
            'Authorization': 'Bearer ' + get_access_token(),
            'Content-Type': 'application/ssml+xml',
            'X-Microsoft-OutputFormat': playback_format
        }
    

    ਇਹ ਹੈਡਰ ਨੂੰ ਇੱਕ ਜਨਰੇਟ ਕੀਤੇ ਐਕਸੈਸ ਟੋਕਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਸੈਟ ਕਰਦਾ ਹੈ, ਸਮੱਗਰੀ ਨੂੰ SSML ਵਿੱਚ ਸੈਟ ਕਰਦਾ ਹੈ ਅਤੇ ਲੋੜੀਂਦੇ ਆਡੀਓ ਫਾਰਮੈਟ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦਾ ਹੈ।

  4. ਇਸ ਤੋਂ ਹੇਠਾਂ, REST API ਨੂੰ ਭੇਜਣ ਲਈ SSML ਪਰਿਭਾਸ਼ਿਤ ਕਰੋ:

    ssml =  f'<speak version=\'1.0\' xml:lang=\'{language}\'>'
    ssml += f'<voice xml:lang=\'{language}\' name=\'{voice}\'>'
    ssml += text
    ssml += '</voice>'
    ssml += '</speak>'
    

    ਇਹ SSML ਭਾਸ਼ਾ ਅਤੇ ਵਰਤਣ ਲਈ ਆਵਾਜ਼ ਨੂੰ ਸੈਟ ਕਰਦਾ ਹੈ, ਨਾਲ ਹੀ ਤਬਦੀਲ ਕਰਨ ਲਈ ਟੈਕਸਟ।

  5. ਆਖਿਰ ਵਿੱਚ, ਇਸ ਫੰਕਸ਼ਨ ਵਿੱਚ REST ਬੇਨਤੀ ਕਰਨ ਅਤੇ ਬਾਈਨਰੀ ਆਡੀਓ ਡੇਟਾ ਵਾਪਸ ਕਰਨ ਲਈ ਕੋਡ ਸ਼ਾਮਲ ਕਰੋ:

    response = requests.post(url, headers=headers, data=ssml.encode('utf-8'))
    return io.BytesIO(response.content)
    

ਕੰਮ - ਆਡੀਓ ਚਲਾਓ

  1. get_speech ਫੰਕਸ਼ਨ ਦੇ ਹੇਠਾਂ, REST API ਕਾਲ ਦੁਆਰਾ ਵਾਪਸ ਕੀਤੇ ਆਡੀਓ ਨੂੰ ਚਲਾਉਣ ਲਈ ਇੱਕ ਨਵਾਂ ਫੰਕਸ਼ਨ ਪਰਿਭਾਸ਼ਿਤ ਕਰੋ:

    def play_speech(speech):
    
  2. ਇਸ ਫੰਕਸ਼ਨ ਨੂੰ ਦਿੱਤਾ speech REST API ਤੋਂ ਵਾਪਸ ਕੀਤੇ ਬਾਈਨਰੀ ਆਡੀਓ ਡੇਟਾ ਹੋਵੇਗਾ। ਇਸਨੂੰ ਇੱਕ ਵੇਵ ਫਾਈਲ ਵਜੋਂ ਖੋਲ੍ਹਣ ਅਤੇ PyAudio ਨੂੰ ਆਡੀਓ ਚਲਾਉਣ ਲਈ ਹੇਠਾਂ ਦਿੱਤੇ ਕੋਡ ਦੀ ਵਰਤੋਂ ਕਰੋ:

    def play_speech(speech):
        with wave.open(speech, 'rb') as wave_file:
            stream = audio.open(format=audio.get_format_from_width(wave_file.getsampwidth()),
                                channels=wave_file.getnchannels(),
                                rate=wave_file.getframerate(),
                                output_device_index=speaker_card_number,
                                output=True)
    
            data = wave_file.readframes(4096)
    
            while len(data) > 0:
                stream.write(data)
                data = wave_file.readframes(4096)
    
            stream.stop_stream()
            stream.close()
    

    ਇਹ ਕੋਡ PyAudio ਸਟ੍ਰੀਮ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ, ਜਿਵੇਂ ਆਡੀਓ ਕੈਪਚਰ ਕਰਦੇ ਸਮੇਂ। ਫਰਕ ਇਹ ਹੈ ਕਿ ਸਟ੍ਰੀਮ ਨੂੰ ਆਉਟਪੁੱਟ ਸਟ੍ਰੀਮ ਵਜੋਂ ਸੈਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਅਤੇ ਆਡੀਓ ਡੇਟਾ ਤੋਂ ਡੇਟਾ ਪੜ੍ਹਿਆ ਜਾਂਦਾ ਹੈ ਅਤੇ ਸਟ੍ਰੀਮ ਵਿੱਚ ਧੱਕਿਆ ਜਾਂਦਾ ਹੈ।

    ਸਟ੍ਰੀਮ ਵੇਰਵੇ ਜਿਵੇਂ ਸੈਂਪਲ ਰੇਟ ਨੂੰ ਹਾਰਡ ਕੋਡ ਕਰਨ ਦੀ ਬਜਾਏ, ਇਹ ਆਡੀਓ ਡੇਟਾ ਤੋਂ ਪੜ੍ਹਿਆ ਜਾਂਦਾ ਹੈ।

  3. say ਫੰਕਸ਼ਨ ਦੀ ਸਮੱਗਰੀ ਨੂੰ ਹੇਠਾਂ ਦਿੱਤੇ ਨਾਲ ਬਦਲੋ:

    speech = get_speech(text)
    play_speech(speech)
    

    ਇਹ ਕੋਡ ਟੈਕਸਟ ਨੂੰ ਸਪੀਚ ਵਜੋਂ ਬਾਈਨਰੀ ਆਡੀਓ ਡੇਟਾ ਵਿੱਚ ਤਬਦੀਲ ਕਰਦਾ ਹੈ, ਅਤੇ ਆਡੀਓ ਚਲਾਉਂਦਾ ਹੈ।

  4. ਐਪ ਚਲਾਓ, ਅਤੇ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਫੰਕਸ਼ਨ ਐਪ ਵੀ ਚਲ ਰਹੀ ਹੈ। ਕੁਝ ਟਾਈਮਰ ਸੈਟ ਕਰੋ, ਅਤੇ ਤੁਸੀਂ ਇੱਕ ਬੋਲੀ ਗਈ ਪ੍ਰਤੀਕ੍ਰਿਆ ਸੁਣੋਗੇ ਜੋ ਕਹੇਗੀ ਕਿ ਤੁਹਾਡਾ ਟਾਈਮਰ ਸੈਟ ਕੀਤਾ ਗਿਆ ਹੈ, ਫਿਰ ਟਾਈਮਰ ਪੂਰਾ ਹੋਣ 'ਤੇ ਇੱਕ ਹੋਰ ਬੋਲੀ ਗਈ ਪ੍ਰਤੀਕ੍ਰਿਆ।

    ਜੇ ਤੁਹਾਨੂੰ Invalid sample rate ਐਰਰ ਮਿਲਦੇ ਹਨ, ਤਾਂ playback_format ਨੂੰ ਉਪਰੋਕਤ ਵਰਣਨ ਅਨੁਸਾਰ ਬਦਲੋ।

💁 ਤੁਸੀਂ ਇਹ ਕੋਡ code-spoken-response/pi ਫੋਲਡਰ ਵਿੱਚ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ।

😀 ਤੁਹਾਡਾ ਟਾਈਮਰ ਪ੍ਰੋਗਰਾਮ ਸਫਲ ਰਿਹਾ!


ਅਸਵੀਕਰਤੀ:
ਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ Co-op Translator ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀਤਾ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁਚਨਾਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਇਸਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ।