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

7.6 KiB

Tekst naar spraak - Raspberry Pi

In dit deel van de les schrijf je code om tekst om te zetten naar spraak met behulp van de spraakservice.

Tekst omzetten naar spraak met behulp van de spraakservice

De tekst kan naar de spraakservice worden gestuurd via de REST API om spraak te verkrijgen als een audiobestand dat kan worden afgespeeld op je IoT-apparaat. Bij het aanvragen van spraak moet je de stem opgeven die gebruikt moet worden, aangezien spraak kan worden gegenereerd met verschillende stemmen.

Elke taal ondersteunt een reeks verschillende stemmen, en je kunt een REST-verzoek sturen naar de spraakservice om de lijst met ondersteunde stemmen voor elke taal op te halen.

Taak - een stem ophalen

  1. Open het smart-timer-project in VS Code.

  2. Voeg de volgende code toe boven de say-functie om de lijst met stemmen voor een taal op te vragen:

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

    Deze code definieert een functie genaamd get_voice die de spraakservice gebruikt om een lijst met stemmen op te halen. Vervolgens wordt de eerste stem gevonden die overeenkomt met de gebruikte taal.

    Deze functie wordt vervolgens aangeroepen om de eerste stem op te slaan, en de naam van de stem wordt afgedrukt in de console. Deze stem kan één keer worden opgevraagd en de waarde kan worden gebruikt voor elke oproep om tekst om te zetten naar spraak.

    💁 Je kunt de volledige lijst met ondersteunde stemmen vinden in de documentatie over taal- en stemondersteuning op Microsoft Docs. Als je een specifieke stem wilt gebruiken, kun je deze functie verwijderen en de stemnaam hard coderen op basis van de documentatie. Bijvoorbeeld:

    voice = 'hi-IN-SwaraNeural'
    

Taak - tekst omzetten naar spraak

  1. Definieer hieronder een constante voor het audioformaat dat moet worden opgehaald van de spraakservice. Wanneer je audio aanvraagt, kun je dit doen in verschillende formaten.

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

    Het formaat dat je kunt gebruiken, hangt af van je hardware. Als je fouten krijgt zoals Invalid sample rate bij het afspelen van de audio, wijzig dit dan naar een andere waarde. Je kunt de lijst met ondersteunde waarden vinden in de REST API-documentatie voor tekst naar spraak op Microsoft Docs. Je moet gebruik maken van audio in het riff-formaat, en de waarden die je kunt proberen zijn riff-16khz-16bit-mono-pcm, riff-24khz-16bit-mono-pcm en riff-48khz-16bit-mono-pcm.

  2. Declareer hieronder een functie genaamd get_speech die tekst omzet naar spraak met behulp van de REST API van de spraakservice:

    def get_speech(text):
    
  3. Definieer in de get_speech-functie de URL die moet worden aangeroepen en de headers die moeten worden meegegeven:

        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
        }
    

    Hiermee worden de headers ingesteld om een gegenereerde toegangstoken te gebruiken, de inhoud in SSML te zetten en het benodigde audioformaat te definiëren.

  4. Definieer hieronder de SSML die naar de REST API moet worden gestuurd:

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

    Deze SSML stelt de taal en de stem in die moet worden gebruikt, samen met de tekst die moet worden omgezet.

  5. Voeg tot slot code toe in deze functie om het REST-verzoek uit te voeren en de binaire audiodata terug te geven:

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

Taak - de audio afspelen

  1. Definieer onder de get_speech-functie een nieuwe functie om de audio af te spelen die is geretourneerd door de REST API-aanroep:

    def play_speech(speech):
    
  2. De speech die aan deze functie wordt doorgegeven, is de binaire audiodata die is geretourneerd door de REST API. Gebruik de volgende code om dit te openen als een wave-bestand en door te geven aan PyAudio om de audio af te spelen:

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

    Deze code gebruikt een PyAudio-stream, net zoals bij het opnemen van audio. Het verschil hier is dat de stream is ingesteld als een uitvoerstream, en data wordt gelezen uit de audiodata en naar de stream gestuurd.

    In plaats van de streamdetails zoals de samplefrequentie hard te coderen, worden deze gelezen uit de audiodata.

  3. Vervang de inhoud van de say-functie door het volgende:

    speech = get_speech(text)
    play_speech(speech)
    

    Deze code zet de tekst om naar spraak als binaire audiodata en speelt de audio af.

  4. Voer de app uit en zorg ervoor dat de functie-app ook draait. Stel enkele timers in, en je hoort een gesproken reactie die zegt dat je timer is ingesteld, gevolgd door een andere gesproken reactie wanneer de timer voltooid is.

    Als je fouten krijgt zoals Invalid sample rate, wijzig dan de playback_format zoals hierboven beschreven.

💁 Je kunt deze code vinden in de map code-spoken-response/pi.

😀 Je timerprogramma is een succes!


Disclaimer:
Dit document is vertaald met behulp van de AI-vertalingsservice Co-op Translator. Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.