7.2 KiB
Teksti puheeksi - Raspberry Pi
Tässä osassa oppituntia kirjoitat koodia, joka muuntaa tekstin puheeksi käyttämällä puhepalvelua.
Muunna teksti puheeksi puhepalvelun avulla
Teksti voidaan lähettää puhepalveluun REST API:n kautta, jolloin saadaan puhetta äänitiedostona, joka voidaan toistaa IoT-laitteellasi. Kun pyydät puhetta, sinun täytyy määrittää käytettävä ääni, sillä puhetta voidaan tuottaa monilla eri äänillä.
Jokainen kieli tukee useita eri ääniä, ja voit tehdä REST-pyynnön puhepalveluun saadaksesi listan tuetuista äänistä kullekin kielelle.
Tehtävä - valitse ääni
-
Avaa
smart-timer
-projekti VS Codessa. -
Lisää seuraava koodi
say
-funktion yläpuolelle pyytääksesi listan äänistä tietylle kielelle: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}')
Tämä koodi määrittää funktion nimeltä
get_voice
, joka käyttää puhepalvelua saadakseen listan äänistä. Se etsii ensimmäisen äänen, joka vastaa käytettävää kieltä.Tämä funktio kutsutaan tallentamaan ensimmäinen ääni, ja äänen nimi tulostetaan konsoliin. Tämä ääni voidaan pyytää kerran, ja arvoa voidaan käyttää jokaisessa tekstin muuntamisessa puheeksi.
💁 Voit saada täydellisen listan tuetuista äänistä Microsoft Docsin kieli- ja äänitukidokumentaatiosta. Jos haluat käyttää tiettyä ääntä, voit poistaa tämän funktion ja kovakoodata äänen nimen tästä dokumentaatiosta. Esimerkiksi:
voice = 'hi-IN-SwaraNeural'
Tehtävä - muunna teksti puheeksi
-
Määritä tämän alle vakio ääniformaatille, joka haetaan puhepalvelusta. Kun pyydät ääntä, voit tehdä sen useissa eri formaateissa.
playback_format = 'riff-48khz-16bit-mono-pcm'
Käytettävä formaatti riippuu laitteistostasi. Jos saat virheitä kuten
Invalid sample rate
ääntä toistaessasi, vaihda tämä toiseen arvoon. Löydät tuettujen arvojen listan Text to speech REST API -dokumentaatiosta Microsoft Docsissa. Sinun täytyy käyttääriff
-formaattia, ja kokeiltavat arvot ovatriff-16khz-16bit-mono-pcm
,riff-24khz-16bit-mono-pcm
jariff-48khz-16bit-mono-pcm
. -
Määritä tämän alle funktio nimeltä
get_speech
, joka muuntaa tekstin puheeksi käyttämällä puhepalvelun REST API:ta:def get_speech(text):
-
get_speech
-funktiossa määritä URL, jota kutsutaan, ja otsikot, jotka lähetetään: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 }
Tämä asettaa otsikot käyttämään luotua käyttöoikeustunnusta, määrittää sisällön SSML-muotoon ja määrittää tarvittavan ääniformaatin.
-
Määritä tämän alle SSML, joka lähetetään REST API:lle:
ssml = f'<speak version=\'1.0\' xml:lang=\'{language}\'>' ssml += f'<voice xml:lang=\'{language}\' name=\'{voice}\'>' ssml += text ssml += '</voice>' ssml += '</speak>'
Tämä SSML määrittää käytettävän kielen ja äänen sekä tekstin, joka muunnetaan.
-
Lopuksi lisää koodi tähän funktioon tekemään REST-pyyntö ja palauttamaan binaarinen äänidata:
response = requests.post(url, headers=headers, data=ssml.encode('utf-8')) return io.BytesIO(response.content)
Tehtävä - toista ääni
-
Määritä
get_speech
-funktion alle uusi funktio, joka toistaa REST API -kutsun palauttaman äänen:def play_speech(speech):
-
speech
, joka välitetään tähän funktioon, on binaarinen äänidata, jonka REST API palauttaa. Käytä seuraavaa koodia avataksesi tämän wave-tiedostona ja välittääksesi sen PyAudiolle äänen toistamiseksi: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()
Tämä koodi käyttää PyAudio-streamia, samalla tavalla kuin äänen tallentamisessa. Erona tässä on, että stream määritetään ulostulostreamiksi, ja data luetaan äänidatasta ja välitetään streamiin.
Sen sijaan, että streamin yksityiskohdat kuten näytteenottotaajuus kovakoodattaisiin, ne luetaan äänidatasta.
-
Korvaa
say
-funktion sisältö seuraavalla:speech = get_speech(text) play_speech(speech)
Tämä koodi muuntaa tekstin puheeksi binaarisena äänidatana ja toistaa äänen.
-
Suorita sovellus ja varmista, että funktiosovellus on myös käynnissä. Aseta joitakin ajastimia, ja kuulet puhutun vastauksen, joka kertoo, että ajastimesi on asetettu, ja toisen puhutun vastauksen, kun ajastin on valmis.
Jos saat virheitä kuten
Invalid sample rate
, muutaplayback_format
yllä kuvatulla tavalla.
💁 Löydät tämän koodin code-spoken-response/pi -kansiosta.
😀 Ajastinohjelmasi oli menestys!
Vastuuvapauslauseke:
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua Co-op Translator. Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.