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

7.3 KiB

Teksto pavertimas garsu - Raspberry Pi

Šioje pamokos dalyje rašysite kodą, kuris pavers tekstą garsu, naudodamas kalbos paslaugą.

Teksto pavertimas garsu naudojant kalbos paslaugą

Tekstas gali būti siunčiamas į kalbos paslaugą per REST API, kad būtų gautas garsas kaip garso failas, kurį galima atkurti jūsų IoT įrenginyje. Prašant garso, reikia nurodyti balsą, nes garsas gali būti generuojamas naudojant įvairius balsus.

Kiekviena kalba palaiko įvairius balsus, ir galite atlikti REST užklausą kalbos paslaugai, kad gautumėte palaikomų balsų sąrašą kiekvienai kalbai.

Užduotis - pasirinkti balsą

  1. Atidarykite smart-timer projektą VS Code aplinkoje.

  2. Pridėkite šį kodą virš say funkcijos, kad gautumėte kalbos balsų sąrašą:

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

    Šis kodas apibrėžia funkciją, vadinamą get_voice, kuri naudoja kalbos paslaugą balsų sąrašui gauti. Tada ji suranda pirmą balsą, kuris atitinka naudojamą kalbą.

    Ši funkcija yra iškviečiama, kad būtų išsaugotas pirmasis balsas, o balso pavadinimas atspausdinamas konsolėje. Šį balsą galima nustatyti vieną kartą ir naudoti kiekvieną kartą, kai tekstas paverčiamas garsu.

    💁 Visą palaikomų balsų sąrašą galite rasti Microsoft Docs kalbų ir balsų palaikymo dokumentacijoje. Jei norite naudoti konkretų balsą, galite pašalinti šią funkciją ir tiesiogiai įrašyti balso pavadinimą iš šios dokumentacijos. Pavyzdžiui:

    voice = 'hi-IN-SwaraNeural'
    

Užduotis - paversti tekstą garsu

  1. Po šio kodo apibrėžkite konstantą, nurodančią garso formatą, kuris bus gautas iš kalbos paslaugų. Prašant garso, galite pasirinkti iš įvairių formatų.

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

    Naudojamas formatas priklauso nuo jūsų įrangos. Jei gaunate klaidą Invalid sample rate, pakeiskite šį formatą į kitą. Palaikomų formatų sąrašą galite rasti Text to speech REST API dokumentacijoje Microsoft Docs. Turėsite naudoti riff formato garsą, o galimi variantai yra riff-16khz-16bit-mono-pcm, riff-24khz-16bit-mono-pcm ir riff-48khz-16bit-mono-pcm.

  2. Po šio kodo apibrėžkite funkciją, vadinamą get_speech, kuri pavers tekstą garsu naudodama kalbos paslaugos REST API:

    def get_speech(text):
    
  3. get_speech funkcijoje apibrėžkite URL, kurį reikia iškviesti, ir antraštes, kurias reikia perduoti:

        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
        }
    

    Šiame kode antraštės nustatomos taip, kad būtų naudojamas sugeneruotas prieigos raktas, turinys nustatomas kaip SSML, o garso formatas - kaip reikalingas.

  4. Po šio kodo apibrėžkite SSML, kuris bus siunčiamas į REST API:

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

    Šis SSML nustato kalbą ir balsą, kuris bus naudojamas, taip pat tekstą, kurį reikia paversti.

  5. Galiausiai pridėkite kodą šioje funkcijoje, kad atliktumėte REST užklausą ir grąžintumėte dvejetainius garso duomenis:

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

Užduotis - atkurti garsą

  1. Po get_speech funkcijos apibrėžkite naują funkciją, kuri atkurs garsą, grąžintą REST API užklausos metu:

    def play_speech(speech):
    
  2. speech, perduotas šiai funkcijai, bus dvejetainiai garso duomenys, grąžinti iš REST API. Naudokite šį kodą, kad atidarytumėte juos kaip bangos failą ir perduotumėte PyAudio, kad garsas būtų atkurtas:

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

    Šis kodas naudoja PyAudio srautą, kaip ir garso įrašymui. Skirtumas tas, kad srautas nustatomas kaip išvesties srautas, o duomenys skaitomi iš garso duomenų ir perduodami į srautą.

    Vietoj to, kad srauto detalės, tokios kaip pavyzdžių dažnis, būtų užkoduotos, jos nuskaitomos iš garso duomenų.

  3. Pakeiskite say funkcijos turinį į šį:

    speech = get_speech(text)
    play_speech(speech)
    

    Šis kodas paverčia tekstą garsu kaip dvejetainius garso duomenis ir atkuria garsą.

  4. Paleiskite programą ir įsitikinkite, kad funkcijų programa taip pat veikia. Nustatykite kelis laikmačius, ir išgirsite balsu pranešimą, kad jūsų laikmatis buvo nustatytas, o vėliau kitą pranešimą, kai laikmatis baigsis.

    Jei gaunate klaidą Invalid sample rate, pakeiskite playback_format, kaip aprašyta aukščiau.

💁 Šį kodą galite rasti code-spoken-response/pi aplanke.

😀 Jūsų laikmačio programa buvo sėkminga!


Atsakomybės apribojimas:
Šis dokumentas buvo išverstas naudojant AI vertimo paslaugą Co-op Translator. Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius dėl šio vertimo naudojimo.