7.2 KiB
Metinden Konuşmaya - Raspberry Pi
Bu dersin bu bölümünde, konuşma hizmetini kullanarak metni konuşmaya dönüştüren bir kod yazacaksınız.
Konuşma Hizmetini Kullanarak Metni Konuşmaya Dönüştürme
Metin, IoT cihazınızda çalınabilecek bir ses dosyası olarak konuşma hizmetine REST API kullanılarak gönderilebilir. Konuşma talep ederken, kullanılacak sesi belirtmeniz gerekir çünkü konuşma, farklı sesler kullanılarak oluşturulabilir.
Her dil, çeşitli sesleri destekler ve her dil için desteklenen seslerin listesini almak için konuşma hizmetine bir REST isteği gönderebilirsiniz.
Görev - Bir Ses Alın
-
VS Code'da
smart-timer
projesini açın. -
Bir dil için ses listesini talep etmek üzere
say
fonksiyonunun üstüne aşağıdaki kodu ekleyin: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}')
Bu kod, konuşma hizmetini kullanarak bir ses listesi alan
get_voice
adlı bir fonksiyon tanımlar. Daha sonra kullanılan dile uyan ilk sesi bulur.Bu fonksiyon, ilk sesi saklamak ve ses adını konsola yazdırmak için çağrılır. Bu ses bir kez talep edilebilir ve metni konuşmaya dönüştürmek için yapılan her çağrıda kullanılabilir.
💁 Desteklenen seslerin tam listesini Microsoft Docs'taki Dil ve Ses Desteği dokümanından alabilirsiniz. Belirli bir sesi kullanmak istiyorsanız, bu fonksiyonu kaldırabilir ve bu dokümandan ses adını sabit kodlayabilirsiniz. Örneğin:
voice = 'hi-IN-SwaraNeural'
Görev - Metni Konuşmaya Dönüştürme
-
Bunun altına, konuşma hizmetlerinden alınacak ses formatı için bir sabit tanımlayın. Ses talep ettiğinizde, bunu farklı formatlarda yapabilirsiniz.
playback_format = 'riff-48khz-16bit-mono-pcm'
Kullanabileceğiniz format, donanımınıza bağlıdır. Eğer sesi çalarken
Invalid sample rate
(Geçersiz örnekleme oranı) hataları alırsanız, bunu başka bir değere değiştirin. Desteklenen değerlerin listesini Microsoft Docs'taki Metinden Konuşmaya REST API dokümanında bulabilirsiniz.riff
formatında ses kullanmanız gerekecek ve denemeniz gereken değerlerriff-16khz-16bit-mono-pcm
,riff-24khz-16bit-mono-pcm
veriff-48khz-16bit-mono-pcm
olacaktır. -
Bunun altına, konuşma hizmeti REST API'sini kullanarak metni konuşmaya dönüştürecek
get_speech
adlı bir fonksiyon tanımlayın:def get_speech(text):
-
get_speech
fonksiyonunda, çağrılacak URL'yi ve gönderilecek başlıkları tanımlayı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 }
Bu, bir erişim jetonu oluşturmak, içeriği SSML olarak ayarlamak ve gerekli ses formatını tanımlamak için başlıkları ayarlar.
-
Bunun altına, REST API'ye gönderilecek SSML'yi tanımlayın:
ssml = f'<speak version=\'1.0\' xml:lang=\'{language}\'>' ssml += f'<voice xml:lang=\'{language}\' name=\'{voice}\'>' ssml += text ssml += '</voice>' ssml += '</speak>'
Bu SSML, kullanılacak dili ve sesi, ayrıca dönüştürülecek metni ayarlar.
-
Son olarak, bu fonksiyona REST isteği yapacak ve ikili ses verilerini döndürecek kodu ekleyin:
response = requests.post(url, headers=headers, data=ssml.encode('utf-8')) return io.BytesIO(response.content)
Görev - Sesi Çalma
-
get_speech
fonksiyonunun altına, REST API çağrısından dönen sesi çalmak için yeni bir fonksiyon tanımlayın:def play_speech(speech):
-
Bu fonksiyona geçirilen
speech
, REST API'den dönen ikili ses verisi olacaktır. Bu veriyi bir dalga dosyası olarak açmak ve PyAudio kullanarak çalmak için aşağıdaki kodu kullanın: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()
Bu kod, bir PyAudio akışı kullanır; ses kaydetme işlemine benzer. Buradaki fark, akışın bir çıkış akışı olarak ayarlanması ve ses verilerinden okunan verilerin akışa aktarılmasıdır.
Akış detaylarını sabit kodlamak yerine, bunlar ses verilerinden okunur.
-
say
fonksiyonunun içeriğini aşağıdakiyle değiştirin:speech = get_speech(text) play_speech(speech)
Bu kod, metni ikili ses verisi olarak konuşmaya dönüştürür ve sesi çalar.
-
Uygulamayı çalıştırın ve işlev uygulamasının da çalıştığından emin olun. Bazı zamanlayıcılar ayarlayın; zamanlayıcınızın ayarlandığını söyleyen bir sesli yanıt ve zamanlayıcı tamamlandığında başka bir sesli yanıt duyacaksınız.
Eğer
Invalid sample rate
hataları alırsanız, yukarıda açıklandığı gibiplayback_format
değerini değiştirin.
💁 Bu kodu code-spoken-response/pi klasöründe bulabilirsiniz.
😀 Zamanlayıcı programınız başarılı oldu!
Feragatname:
Bu belge, AI çeviri hizmeti Co-op Translator kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalardan sorumlu değiliz.