Python ile Text-to-Speech API kullanma

1. Genel Bakış

1215f38908082356.png

Text-to-Speech API, geliştiricilerin insan benzeri konuşma oluşturmasına olanak tanır. API, metinleri WAV, MP3 veya Ogg Opus gibi ses biçimlerine dönüştürür. Ayrıca duraklamaları, sayıları, tarih ve saat biçimlendirmesini ve diğer telaffuz talimatlarını belirtmek için Konuşma Sentezi Biçimlendirme Dili (SSML) girişlerini de destekler.

Bu eğiticide, Python ile Text-to-Speech API'yi kullanmaya odaklanacaksınız.

Neler öğreneceksiniz?

  • Ortamınızı ayarlama
  • Desteklenen diller nasıl listelenir?
  • Kullanılabilir sesler nasıl listelenir?
  • Metinden ses nasıl sentezlenir

Gerekenler

  • Bir Google Cloud projesi
  • Chrome veya Firefox gibi bir tarayıcı
  • Python kullanımı hakkında bilgi

Anket

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca okuma Okuyun ve alıştırmaları tamamlayın

Python deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

Google Cloud hizmetleriyle ilgili deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

2. Kurulum ve şartlar

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğinizi (genellikle PROJECT_ID olarak tanımlanır) belirtmeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmanın tekrarlanmasını önlemek amacıyla kaynakları kapatmak için oluşturduğunuz kaynakları silebilir veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir 853e55310c205094.png simgesini tıklayın.

3c1dabeca90e44e5.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

9f0e51b578fecce5.png

Gereken tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.

  1. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list

Komut çıkışı

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Ortam kurulumu

Text-to-Speech API'yi kullanmaya başlamadan önce API'yi etkinleştirmek için Cloud Shell'de aşağıdaki komutu çalıştırın:

gcloud services enable texttospeech.googleapis.com

Aşağıdakine benzer bir tablo görürsünüz:

Operation "operations/..." finished successfully.

Artık Text-to-Speech API'yi kullanabilirsiniz.

Ana dizininize gidin:

cd ~

Bağımlılıkları izole etmek için bir Python sanal ortamı oluşturun:

virtualenv venv-texttospeech

Sanal ortamı etkinleştirin:

source venv-texttospeech/bin/activate

IPython ve Text-to-Speech API istemci kitaplığını yükleyin:

pip install ipython google-cloud-texttospeech

Aşağıdakine benzer bir tablo görürsünüz:

...
Installing collected packages: ..., ipython, google-cloud-texttospeech
Successfully installed ... google-cloud-texttospeech-2.16.3 ...

Artık Text-to-Speech API istemci kitaplığını kullanmaya hazırsınız.

Sonraki adımlarda, önceki adımda yüklediğiniz IPython adlı etkileşimli bir Python yorumlayıcısını kullanacaksınız. Cloud Shell'de ipython çalıştırarak oturum başlatın:

ipython

Aşağıdakine benzer bir tablo görürsünüz:

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.18.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

İlk isteğinizi yapmaya ve desteklenen dilleri listelemeye hazırsınız.

4. Desteklenen dilleri listele:

Bu bölümde, desteklenen tüm dillerin listesini bulabilirsiniz.

Aşağıdaki kodu IPython oturumunuza kopyalayın:

from typing import Sequence

import google.cloud.texttospeech as tts


def unique_languages_from_voices(voices: Sequence[tts.Voice]):
    language_set = set()
    for voice in voices:
        for language_code in voice.language_codes:
            language_set.add(language_code)
    return language_set


def list_languages():
    client = tts.TextToSpeechClient()
    response = client.list_voices()
    languages = unique_languages_from_voices(response.voices)

    print(f" Languages: {len(languages)} ".center(60, "-"))
    for i, language in enumerate(sorted(languages)):
        print(f"{language:>10}", end="\n" if i % 5 == 4 else "")
        

Biraz zaman ayırarak kodu inceleyin ve desteklenen dillerin listesini oluşturmak için list_voices istemci kitaplığı yöntemini nasıl kullandığını öğrenin.

İşlevi çağırın:

list_languages()

Aşağıdaki gibi (veya daha geniş bir listeye) sahip olmanız gerekir:

---------------------- Languages: 58 -----------------------
     af-ZA     am-ET     ar-XA     bg-BG     bn-IN
     ca-ES    cmn-CN    cmn-TW     cs-CZ     da-DK
     de-DE     el-GR     en-AU     en-GB     en-IN
     en-US     es-ES     es-US     eu-ES     fi-FI
    fil-PH     fr-CA     fr-FR     gl-ES     gu-IN
     he-IL     hi-IN     hu-HU     id-ID     is-IS
     it-IT     ja-JP     kn-IN     ko-KR     lt-LT
     lv-LV     ml-IN     mr-IN     ms-MY     nb-NO
     nl-BE     nl-NL     pa-IN     pl-PL     pt-BR
     pt-PT     ro-RO     ru-RU     sk-SK     sr-RS
     sv-SE     ta-IN     te-IN     th-TH     tr-TR
     uk-UA     vi-VN    yue-HK

Listede 58 dil ve lehçe yer alır. Örneğin:

  • Çince ve Tayvan Mandarin'i,
  • Avustralya, İngiliz, Hint ve Amerikan İngilizcesi,
  • Kanada ve Fransa'dan Fransızca,
  • Brezilya ve Portekiz'den Portekizce.

Bu liste sabit değildir ve yeni sesler eklendikçe büyür.

Özet

Bu adım, desteklenen dilleri listelemenize olanak tanıdı.

5. Kullanılabilir sesleri listeleme

Bu bölümde, farklı dillerde kullanılabilen seslerin listesini görürsünüz.

Aşağıdaki kodu IPython oturumunuza kopyalayın:

import google.cloud.texttospeech as tts


def list_voices(language_code=None):
    client = tts.TextToSpeechClient()
    response = client.list_voices(language_code=language_code)
    voices = sorted(response.voices, key=lambda voice: voice.name)

    print(f" Voices: {len(voices)} ".center(60, "-"))
    for voice in voices:
        languages = ", ".join(voice.language_codes)
        name = voice.name
        gender = tts.SsmlVoiceGender(voice.ssml_gender).name
        rate = voice.natural_sample_rate_hertz
        print(f"{languages:<8} | {name:<24} | {gender:<8} | {rate:,} Hz")
        

Biraz zaman ayırarak kodu inceleyin ve kodun, belirli bir dilde kullanılabilen sesleri listelemek için list_voices(language_code) istemci kitaplığı yöntemini nasıl kullandığını öğrenin.

Şimdi mevcut Alman seslerinin listesine göz atın:

list_voices("de")

Aşağıdakine benzer bir tablo görürsünüz:

------------------------ Voices: 20 ------------------------
de-DE    | de-DE-Neural2-A          | FEMALE   | 24,000 Hz
de-DE    | de-DE-Neural2-B          | MALE     | 24,000 Hz
...
de-DE    | de-DE-Standard-A         | FEMALE   | 24,000 Hz
de-DE    | de-DE-Standard-B         | MALE     | 24,000 Hz
...
de-DE    | de-DE-Studio-B           | MALE     | 24,000 Hz
de-DE    | de-DE-Studio-C           | FEMALE   | 24,000 Hz
de-DE    | de-DE-Wavenet-A          | FEMALE   | 24,000 Hz
de-DE    | de-DE-Wavenet-B          | MALE     | 24,000 Hz
...

Birden fazla kadın ve erkek sesinin yanı sıra standart, WaveNet, Neural2 ve Studio sesleri kullanılabilir:

  • Standart sesler, sinyal işleme algoritmaları tarafından oluşturulur.
  • WaveNet, Neural2 ve Studio sesleri, makine öğrenimi modelleri tarafından sentezlenen ve kulağa daha doğal gelen yüksek kaliteli seslerdir.

Şimdi, mevcut İngilizce seslerin listesine bakın:

list_voices("en")

Aşağıdaki gibi bir sonuç görürsünüz:

------------------------ Voices: 90 ------------------------
en-AU    | en-AU-Neural2-A          | FEMALE   | 24,000 Hz
...
en-AU    | en-AU-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-GB    | en-GB-Neural2-A          | FEMALE   | 24,000 Hz
...
en-GB    | en-GB-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-IN    | en-IN-Standard-A         | FEMALE   | 24,000 Hz
...
en-IN    | en-IN-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-US    | en-US-Neural2-A          | MALE     | 24,000 Hz
...
en-US    | en-US-News-K             | FEMALE   | 24,000 Hz
...
en-US    | en-US-Standard-A         | MALE     | 24,000 Hz
...
en-US    | en-US-Studio-M           | MALE     | 24,000 Hz
...
en-US    | en-US-Wavenet-A          | MALE     | 24,000 Hz
...

Farklı cinsiyet ve niteliklere sahip birçok sesin yanı sıra Avustralya, İngiliz, Hint ve Amerikan İngilizcesi gibi farklı aksanlar da mevcuttur.

Tercih ettiğiniz diller ve varyantlar (veya hepsi) için kullanılabilen sesleri listelemek için biraz zaman ayırın:

list_voices("fr")
list_voices("pt")
list_voices()

Özet

Bu adım, mevcut sesleri listelemenize olanak tanıdı. Desteklenen sesler ve diller hakkında daha fazla bilgi edinebilirsiniz.

6. Metinden ses sentezle

Bir dizeyi ses verilerine dönüştürmek için Text-to-Speech API'yi kullanabilirsiniz. Konuşma sentezinin çıkışını benzersiz bir ses seçme veya çıktı perde, ses düzeyi, konuşma hızı ve örnek hızına göre değiştirme gibi çeşitli şekillerde yapılandırabilirsiniz.

Aşağıdaki kodu IPython oturumunuza kopyalayın:

import google.cloud.texttospeech as tts


def text_to_wav(voice_name: str, text: str):
    language_code = "-".join(voice_name.split("-")[:2])
    text_input = tts.SynthesisInput(text=text)
    voice_params = tts.VoiceSelectionParams(
        language_code=language_code, name=voice_name
    )
    audio_config = tts.AudioConfig(audio_encoding=tts.AudioEncoding.LINEAR16)

    client = tts.TextToSpeechClient()
    response = client.synthesize_speech(
        input=text_input,
        voice=voice_params,
        audio_config=audio_config,
    )

    filename = f"{voice_name}.wav"
    with open(filename, "wb") as out:
        out.write(response.audio_content)
        print(f'Generated speech saved to "{filename}"')
        

Biraz zaman ayırarak kodu inceleyin, ses verilerini oluşturmak ve bunu wav dosyası olarak kaydetmek için synthesize_speech istemci kitaplığı yöntemini nasıl kullandığını öğrenin.

Şimdi birkaç farklı aksanla cümle oluşturun:

text_to_wav("en-AU-Neural2-A", "What is the temperature in Sydney?")
text_to_wav("en-GB-Neural2-B", "What is the temperature in London?")
text_to_wav("en-IN-Wavenet-C", "What is the temperature in Delhi?")
text_to_wav("en-US-Studio-O", "What is the temperature in New York?")
text_to_wav("fr-FR-Neural2-A", "Quelle est la température à Paris ?")
text_to_wav("fr-CA-Neural2-B", "Quelle est la température à Montréal ?")

Aşağıdakine benzer bir tablo görürsünüz:

Generated speech saved to "en-AU-Neural2-A.wav"
Generated speech saved to "en-GB-Neural2-B.wav"
Generated speech saved to "en-IN-Wavenet-C.wav"
Generated speech saved to "en-US-Studio-O.wav"
Generated speech saved to "fr-FR-Neural2-A.wav"
Generated speech saved to "fr-CA-Neural2-B.wav"

Oluşturulan tüm dosyaları tek seferde indirmek için Python ortamınızda bu Cloud Shell komutunu kullanabilirsiniz:

!cloudshell download *.wav

Doğruladığınızda tarayıcınız dosyaları indirir:

44382e3b7a3314b0.png 4dbccf007cd73b91.png

Her dosyayı açın ve sonucu dinleyin.

Özet

Bu adımda, cümleleri ses wav dosyalarına dönüştürmek için Text-to-Speech API'yi kullandınız. Konuşma ses dosyaları oluşturma hakkında daha fazla bilgi edinin.

7. Tebrikler!

1215f38908082356.png

İnsan benzeri konuşma üretmek için Python'dan Text-to-Speech API'yi nasıl kullanacağınızı öğrendiniz.

Temizleme

Geliştirme ortamınızı temizlemek için Cloud Shell'den:

  • Hâlâ IPython oturumunuzdaysanız kabuğa geri dönün: exit
  • Python sanal ortamını kullanmayı bırakın: deactivate
  • Sanal ortam klasörünüzü silin: cd ~ ; rm -rf ./venv-texttospeech

Google Cloud projenizi Cloud Shell'den silmek için:

  • Geçerli proje kimliğinizi alın: PROJECT_ID=$(gcloud config get-value core/project)
  • Silmek istediğiniz projenin bu proje olduğundan emin olun: echo $PROJECT_ID
  • Projeyi silin: gcloud projects delete $PROJECT_ID

Daha fazla bilgi

Lisans

Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.