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
-
Nyisd meg a
smart-timer
projektet a VS Code-ban. -
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
-
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
ésriff-48khz-16bit-mono-pcm
. -
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):
-
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.
-
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.
-
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
-
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):
-
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.
-
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.
-
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 aplayback_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.