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

7.4 KiB

Konwersja tekstu na mowę - Raspberry Pi

W tej części lekcji napiszesz kod, który przekształci tekst na mowę za pomocą usługi mowy.

Konwersja tekstu na mowę za pomocą usługi mowy

Tekst można przesłać do usługi mowy za pomocą REST API, aby uzyskać mowę w formie pliku audio, który można odtworzyć na urządzeniu IoT. Podczas żądania mowy należy określić głos, który ma być użyty, ponieważ mowę można generować za pomocą różnych głosów.

Każdy język obsługuje różne głosy, a za pomocą żądania REST do usługi mowy można uzyskać listę obsługiwanych głosów dla każdego języka.

Zadanie - uzyskaj głos

  1. Otwórz projekt smart-timer w VS Code.

  2. Dodaj poniższy kod powyżej funkcji say, aby zażądać listy głosów dla danego języka:

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

    Ten kod definiuje funkcję o nazwie get_voice, która korzysta z usługi mowy, aby uzyskać listę głosów. Następnie znajduje pierwszy głos, który pasuje do używanego języka.

    Funkcja ta jest następnie wywoływana, aby zapisać pierwszy głos, a nazwa głosu jest drukowana w konsoli. Ten głos można zażądać raz, a wartość używać przy każdym wywołaniu konwersji tekstu na mowę.

    💁 Pełną listę obsługiwanych głosów można znaleźć w dokumentacji obsługi języków i głosów na Microsoft Docs. Jeśli chcesz użyć konkretnego głosu, możesz usunąć tę funkcję i na stałe wpisać nazwę głosu z tej dokumentacji. Na przykład:

    voice = 'hi-IN-SwaraNeural'
    

Zadanie - konwersja tekstu na mowę

  1. Poniżej tego, zdefiniuj stałą dla formatu audio, który ma być pobrany z usług mowy. Podczas żądania audio można to zrobić w różnych formatach.

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

    Format, którego możesz użyć, zależy od Twojego sprzętu. Jeśli pojawią się błędy Invalid sample rate podczas odtwarzania audio, zmień to na inną wartość. Listę obsługiwanych wartości znajdziesz w dokumentacji REST API tekstu na mowę na Microsoft Docs. Musisz użyć audio w formacie riff, a wartości do wypróbowania to riff-16khz-16bit-mono-pcm, riff-24khz-16bit-mono-pcm i riff-48khz-16bit-mono-pcm.

  2. Poniżej tego, zadeklaruj funkcję o nazwie get_speech, która przekształci tekst na mowę za pomocą REST API usługi mowy:

    def get_speech(text):
    
  3. W funkcji get_speech zdefiniuj URL do wywołania oraz nagłówki do przekazania:

        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
        }
    

    To ustawia nagłówki, aby użyć wygenerowanego tokenu dostępu, ustawia zawartość na SSML i definiuje potrzebny format audio.

  4. Poniżej tego, zdefiniuj SSML do wysłania do 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>'
    

    Ten SSML ustawia język i głos do użycia, wraz z tekstem do konwersji.

  5. Na koniec dodaj kod w tej funkcji, aby wykonać żądanie REST i zwrócić binarne dane audio:

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

Zadanie - odtwórz audio

  1. Poniżej funkcji get_speech, zdefiniuj nową funkcję do odtwarzania audio zwróconego przez wywołanie REST API:

    def play_speech(speech):
    
  2. speech przekazane do tej funkcji będzie binarnymi danymi audio zwróconymi przez REST API. Użyj poniższego kodu, aby otworzyć to jako plik wave i przekazać do PyAudio w celu odtworzenia audio:

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

    Ten kod używa strumienia PyAudio, podobnie jak przy przechwytywaniu audio. Różnica polega na tym, że strumień jest ustawiony jako strumień wyjściowy, a dane są odczytywane z danych audio i przesyłane do strumienia.

    Zamiast na stałe ustawiać szczegóły strumienia, takie jak częstotliwość próbkowania, są one odczytywane z danych audio.

  3. Zastąp zawartość funkcji say następującym kodem:

    speech = get_speech(text)
    play_speech(speech)
    

    Ten kod przekształca tekst na mowę jako binarne dane audio i odtwarza audio.

  4. Uruchom aplikację i upewnij się, że aplikacja funkcji również działa. Ustaw kilka timerów, a usłyszysz odpowiedź głosową informującą, że Twój timer został ustawiony, a następnie kolejną odpowiedź głosową, gdy timer się zakończy.

    Jeśli pojawią się błędy Invalid sample rate, zmień playback_format, jak opisano powyżej.

💁 Ten kod znajdziesz w folderze code-spoken-response/pi.

😀 Twój program timerów zakończył się sukcesem!

Zastrzeżenie:
Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI Co-op Translator. Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.