استفاده از API Text-to-Speech با پایتون

۱. مرور کلی

۱۲۱۵f۳۸۹۰۸۰۸۲۳۵۶.png

API تبدیل متن به گفتار به توسعه‌دهندگان امکان می‌دهد گفتاری شبیه به گفتار انسان تولید کنند. این API متن را به فرمت‌های صوتی مانند WAV، MP3 یا Ogg Opus تبدیل می‌کند. همچنین از ورودی‌های زبان نشانه‌گذاری سنتز گفتار (SSML) برای تعیین مکث‌ها، اعداد، قالب‌بندی تاریخ و زمان و سایر دستورالعمل‌های تلفظ پشتیبانی می‌کند.

در این آموزش، شما بر روی استفاده از API تبدیل متن به گفتار با پایتون تمرکز خواهید کرد.

آنچه یاد خواهید گرفت

  • چگونه محیط خود را تنظیم کنید
  • نحوه لیست کردن زبان‌های پشتیبانی شده
  • نحوه فهرست کردن صداهای موجود
  • نحوه ترکیب صدا از متن

آنچه نیاز دارید

  • یک پروژه ابری گوگل
  • یک مرورگر، مانند کروم یا فایرفاکس
  • آشنایی با استفاده از پایتون

نظرسنجی

چگونه از این آموزش استفاده خواهید کرد؟

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

تجربه خود را با پایتون چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

تجربه خود را با خدمات ابری گوگل چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • نام پروژه، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. شما همیشه می‌توانید آن را به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چه باشد. در اکثر آزمایشگاه‌های کد، باید شناسه پروژه خود را (که معمولاً با عنوان PROJECT_ID شناخته می‌شود) ارجاع دهید. اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی می‌ماند.
  • برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد هزینه زیادی نخواهد داشت، اگر اصلاً هزینه‌ای داشته باشد. برای خاموش کردن منابع به منظور جلوگیری از پرداخت صورتحساب پس از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

اگرچه می‌توان گوگل کلود را از راه دور و از طریق لپ‌تاپ شما مدیریت کرد، اما در این آزمایشگاه کد از Cloud Shell ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 853e55310c205094.png .

3c1dabeca90e44e5.png

اگر این اولین باری است که Cloud Shell را اجرا می‌کنید، یک صفحه میانی برای توضیح آن به شما نمایش داده می‌شود. اگر با یک صفحه میانی مواجه شدید، روی ادامه کلیک کنید.

9c92662c6a846a5c.png

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

9f0e51b578fecce5.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده‌اید و پروژه روی شناسه پروژه شما تنظیم شده است.

  1. برای تأیید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:
gcloud auth list

خروجی دستور

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project

خروجی دستور

[core]
project = <PROJECT_ID>

اگر اینطور نیست، می‌توانید با این دستور آن را تنظیم کنید:

gcloud config set project <PROJECT_ID>

خروجی دستور

Updated property [core/project].

۳. تنظیمات محیطی

قبل از اینکه بتوانید از API تبدیل متن به گفتار استفاده کنید، دستور زیر را در Cloud Shell اجرا کنید تا API فعال شود:

gcloud services enable texttospeech.googleapis.com

شما باید چیزی شبیه به این را ببینید:

Operation "operations/..." finished successfully.

حالا می‌توانید از API تبدیل متن به گفتار استفاده کنید!

به دایرکتوری خانگی خود بروید:

cd ~

یک محیط مجازی پایتون برای جداسازی وابستگی‌ها ایجاد کنید:

virtualenv venv-texttospeech

فعال کردن محیط مجازی:

source venv-texttospeech/bin/activate

IPython و کتابخانه کلاینت Text-to-Speech API را نصب کنید:

pip install ipython google-cloud-texttospeech

شما باید چیزی شبیه به این را ببینید:

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

اکنون، شما آماده استفاده از کتابخانه کلاینت API تبدیل متن به گفتار هستید!

در مراحل بعدی، از یک مفسر تعاملی پایتون به نام IPython که در مرحله قبل نصب کرده‌اید، استفاده خواهید کرد. با اجرای ipython در Cloud Shell، یک جلسه را شروع کنید:

ipython

شما باید چیزی شبیه به این را ببینید:

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]:

شما آماده‌اید تا اولین درخواست خود را ارسال کنید و زبان‌های پشتیبانی‌شده را فهرست کنید...

۴. فهرست زبان‌های پشتیبانی‌شده

در این بخش، لیست تمام زبان‌های پشتیبانی‌شده را مشاهده خواهید کرد.

کد زیر را در جلسه IPython خود کپی کنید:

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

لحظه‌ای وقت بگذارید و کد را مطالعه کنید و ببینید که چگونه از متد کتابخانه کلاینت list_voices برای ساخت لیست زبان‌های پشتیبانی‌شده استفاده می‌کند.

تابع را فراخوانی کنید:

list_languages()

شما باید لیست زیر (یا لیست بزرگتری) را دریافت کنید:

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

این فهرست ۵۸ زبان و گونه از آن‌ها را نشان می‌دهد، مانند:

  • ماندارین چینی و تایوانی،
  • انگلیسی استرالیایی، بریتانیایی، هندی و آمریکایی،
  • فرانسوی از کانادا و فرانسه،
  • پرتغالی‌هایی از برزیل و پرتغال.

این فهرست ثابت نیست و با ورود صداهای جدید، گسترش می‌یابد.

خلاصه

این مرحله به شما امکان می‌دهد زبان‌های پشتیبانی‌شده را فهرست کنید.

۵. فهرست کردن صداهای موجود

در این بخش، فهرست صداهای موجود به زبان‌های مختلف را دریافت خواهید کرد.

کد زیر را در جلسه IPython خود کپی کنید:

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

لحظه‌ای وقت بگذارید و کد را مطالعه کنید و ببینید که چگونه از متد list_voices(language_code) در کتابخانه‌ی کلاینت برای فهرست کردن صداهای موجود برای یک زبان مشخص استفاده می‌کند.

حالا، لیست صداهای آلمانی موجود را دریافت کنید:

list_voices("de")

شما باید چیزی شبیه به این را ببینید:

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

چندین صدای زن و مرد، و همچنین صداهای استاندارد، WaveNet، Neural2 و Studio در دسترس هستند:

  • صداهای استاندارد توسط الگوریتم‌های پردازش سیگنال تولید می‌شوند.
  • صداهای WaveNet، Neural2 و Studio صداهای با کیفیت بالاتری هستند که توسط مدل‌های یادگیری ماشینی سنتز شده و طبیعی‌تر به نظر می‌رسند.

حالا، لیست صداهای انگلیسی موجود را دریافت کنید:

list_voices("en")

شما باید چیزی شبیه به این دریافت کنید:

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

علاوه بر انتخاب صداهای متعدد با جنسیت‌ها و کیفیت‌های مختلف، لهجه‌های متعددی نیز در دسترس است: انگلیسی استرالیایی، بریتانیایی، هندی و آمریکایی.

لحظه‌ای وقت بگذارید و صداهای موجود برای زبان‌ها و گونه‌های مورد نظر خود (یا حتی همه آنها) را فهرست کنید:

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

خلاصه

این مرحله به شما امکان داد تا صداهای موجود را فهرست کنید. می‌توانید درباره صداها و زبان‌های پشتیبانی‌شده بیشتر بخوانید.

۶. ترکیب صدا از متن

شما می‌توانید از API تبدیل متن به گفتار برای تبدیل یک رشته به داده‌های صوتی استفاده کنید. می‌توانید خروجی سنتز گفتار را به روش‌های مختلفی پیکربندی کنید، از جمله انتخاب یک صدای منحصر به فرد یا تنظیم خروجی در زیر و بمی، بلندی صدا، سرعت صحبت کردن و سرعت نمونه‌برداری .

کد زیر را در جلسه IPython خود کپی کنید:

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

کمی وقت بگذارید و کد را مطالعه کنید و ببینید که چگونه از متد کتابخانه کلاینت synthesize_speech برای تولید داده‌های صوتی و ذخیره آن به عنوان یک فایل wav استفاده می‌کند.

حالا، جملاتی با چند لهجه‌ی مختلف بسازید:

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 ?")

شما باید چیزی شبیه به این را ببینید:

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"

برای دانلود همه فایل‌های تولید شده به طور همزمان، می‌توانید از این دستور Cloud Shell در محیط پایتون خود استفاده کنید:

!cloudshell download *.wav

اعتبارسنجی کنید و مرورگر شما فایل‌ها را دانلود خواهد کرد:

44382e3b7a3314b0.png4dbccf007cd73b91.png

هر فایل را باز کنید و نتیجه را بشنوید.

خلاصه

در این مرحله، شما توانستید از API تبدیل متن به گفتار برای تبدیل جملات به فایل‌های صوتی wav استفاده کنید. درباره ایجاد فایل‌های صوتی صوتی بیشتر بخوانید.

۷. تبریک می‌گویم!

۱۲۱۵f۳۸۹۰۸۰۸۲۳۵۶.png

شما یاد گرفتید که چگونه از API تبدیل متن به گفتار با استفاده از پایتون برای تولید گفتار شبیه به انسان استفاده کنید!

تمیز کردن

برای پاکسازی محیط توسعه خود، از Cloud Shell:

  • اگر هنوز در جلسه IPython خود هستید، به پوسته برگردید: exit
  • استفاده از محیط مجازی پایتون را متوقف کنید: deactivate
  • پوشه محیط مجازی خود را حذف کنید: cd ~ ; rm -rf ./venv-texttospeech

برای حذف پروژه Google Cloud خود، از Cloud Shell:

  • شناسه پروژه فعلی خود را بازیابی کنید: PROJECT_ID=$(gcloud config get-value core/project)
  • مطمئن شوید که این پروژه‌ای است که می‌خواهید حذف کنید: echo $PROJECT_ID
  • حذف پروژه: gcloud projects delete $PROJECT_ID

بیشتر بدانید

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.