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/hu/6-consumer/lessons/3-spoken-feedback/pi-text-to-speech.md

7.8 KiB

Szöveg beszéddé alakítása - Raspberry Pi

Ebben a leckében kódot fogsz írni, amely a szöveget beszéddé alakítja a beszédszolgáltatás segítségével.

Szöveg beszéddé alakítása a beszédszolgáltatás használatával

A szöveget a REST API segítségével lehet elküldeni a beszédszolgáltatásnak, hogy hangfájlként visszakapjuk, amelyet lejátszhatunk az IoT eszközünkön. A beszéd kéréséhez meg kell adni a hangot, amelyet használni szeretnénk, mivel a beszéd különböző hangokkal generálható.

Minden nyelvhez különböző hangok állnak rendelkezésre, és REST kérést küldhetünk a beszédszolgáltatásnak, hogy megkapjuk az adott nyelvhez támogatott hangok listáját.

Feladat - hang kiválasztása

  1. Nyisd meg a smart-timer projektet a VS Code-ban.

  2. Add hozzá az alábbi kódot a say függvény fölé, hogy lekérd egy nyelv hangjainak listáját:

    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}')
    

    Ez a kód egy get_voice nevű függvényt definiál, amely a beszédszolgáltatást használja a hangok listájának lekérésére. Ezután megkeresi az első hangot, amely megfelel az aktuálisan használt nyelvnek.

    Ez a függvény meghívásra kerül, hogy elmentse az első hangot, és a hang neve kiírásra kerül a konzolra. Ezt a hangot egyszer kérhetjük le, és az értéket minden szöveg beszéddé alakítási hívásnál használhatjuk.

    💁 A támogatott hangok teljes listáját megtalálhatod a Microsoft Docs nyelv- és hangtámogatási dokumentációjában. Ha egy konkrét hangot szeretnél használni, akkor eltávolíthatod ezt a függvényt, és a dokumentációból származó hangnevet hard code-olhatod. Például:

    voice = 'hi-IN-SwaraNeural'
    

Feladat - szöveg beszéddé alakítása

  1. Ezután definiálj egy konstansot az audio formátumhoz, amelyet a beszédszolgáltatástól szeretnél lekérni. Az audio különböző formátumokban kérhető.

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

    Az alkalmazható formátum a hardveredtől függ. Ha Invalid sample rate hibát kapsz az audio lejátszásakor, akkor változtasd meg ezt egy másik értékre. A támogatott értékek listáját megtalálhatod a Text to speech REST API dokumentációjában a Microsoft Docs-on. riff formátumú audio-t kell használnod, és az értékek, amelyeket kipróbálhatsz: riff-16khz-16bit-mono-pcm, riff-24khz-16bit-mono-pcm és riff-48khz-16bit-mono-pcm.

  2. Ezután deklarálj egy get_speech nevű függvényt, amely a szöveget beszéddé alakítja a beszédszolgáltatás REST API-jának használatával:

    def get_speech(text):
    
  3. A get_speech függvényben definiáld az URL-t, amelyet hívni kell, és a fejléceket, amelyeket át kell adni:

        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
        }
    

    Ez beállítja a fejléceket egy generált hozzáférési token használatára, meghatározza az SSML tartalmat, és definiálja a szükséges audio formátumot.

  4. Ezután definiáld az SSML-t, amelyet a REST API-nak küldesz:

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

    Ez az SSML beállítja a nyelvet és a hangot, amelyet használni szeretnél, valamint a szöveget, amelyet át kell alakítani.

  5. Végül adj hozzá kódot ebben a függvényben, hogy végrehajtsa a REST kérést, és visszaadja a bináris audio adatokat:

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

Feladat - az audio lejátszása

  1. A get_speech függvény alatt definiálj egy új függvényt az audio lejátszására, amelyet a REST API hívás visszaadott:

    def play_speech(speech):
    
  2. A speech, amelyet ennek a függvénynek átadsz, a REST API által visszaadott bináris audio adat lesz. Használd az alábbi kódot, hogy megnyisd ezt hullámfájlként, és átadd PyAudio-nak az audio lejátszásához:

    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()
    

    Ez a kód PyAudio stream-et használ, ugyanúgy, mint az audio rögzítésnél. A különbség itt az, hogy a stream kimeneti stream-ként van beállítva, és az audio adatból olvasott adatokat továbbítja a stream-nek.

    Ahelyett, hogy a stream részleteit, például a mintavételi frekvenciát hard code-olnánk, az audio adatból olvassuk ki.

  3. Cseréld ki a say függvény tartalmát az alábbiakra:

    speech = get_speech(text)
    play_speech(speech)
    

    Ez a kód a szöveget bináris audio adatként alakítja át, és lejátsza az audio-t.

  4. Futtasd az alkalmazást, és győződj meg róla, hogy a funkcióalkalmazás is fut. Állíts be néhány időzítőt, és hallani fogsz egy beszédes választ, amely közli, hogy az időzítőd beállításra került, majd egy másik beszédes választ, amikor az időzítő lejár.

    Ha Invalid sample rate hibát kapsz, változtasd meg a playback_format-ot a fent leírtak szerint.

💁 Ezt a kódot megtalálhatod a code-spoken-response/pi mappában.

😀 Az időzítő programod sikeres volt!


Felelősség kizárása:
Ez a dokumentum az AI fordítási szolgáltatás, a Co-op Translator segítségével lett lefordítva. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.