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

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

  1. VS Code'da smart-timer projesini açın.

  2. 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

  1. 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ğerler riff-16khz-16bit-mono-pcm, riff-24khz-16bit-mono-pcm ve riff-48khz-16bit-mono-pcm olacaktır.

  2. 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):
    
  3. 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.

  4. 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.

  5. 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

  1. 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):
    
  2. 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.

  3. 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.

  4. 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ığı gibi playback_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.