Sử dụng API Chuyển văn bản sang lời nói bằng Python

1. Tổng quan

1215f38908082356.png

API Chuyển văn bản sang lời nói cho phép nhà phát triển tạo lời nói giống như của con người. API này chuyển đổi văn bản thành các định dạng âm thanh như WAV, MP3 hoặc Ogg Opus. Công cụ này cũng hỗ trợ dữ liệu đầu vào Ngôn ngữ đánh dấu tổng hợp lời nói (SSML) để chỉ định khoảng dừng, số, định dạng ngày và giờ cũng như các hướng dẫn khác về cách phát âm.

Trong hướng dẫn này, bạn sẽ tập trung vào việc sử dụng Text-to-Speech API với Python.

Kiến thức bạn sẽ học được

  • Cách thiết lập môi trường
  • Cách liệt kê các ngôn ngữ được hỗ trợ
  • Cách liệt kê các giọng nói có sẵn
  • Cách tổng hợp âm thanh từ văn bản

Bạn cần có

  • Một dự án trên Google Cloud
  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
  • Làm quen với cách sử dụng Python

Bản khảo sát

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm của mình với Python?

Người mới bắt đầu Trung cấp Thành thạo

Bạn đánh giá thế nào về trải nghiệm của mình khi sử dụng các dịch vụ của Google Cloud?

Người mới bắt đầu Trung cấp Thành thạo

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án.
  • Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên đám mây. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.

Khởi động Cloud Shell

Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Cloud Shell, một môi trường dòng lệnh chạy trên đám mây.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png

Nếu đây là lần đầu tiên bạn khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

9c92662c6a846a5c.png

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

9f0e51b578fecce5.png

Máy ảo này được trang bị tất cả các công cụ phát triển cần thiết. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc của mình trong lớp học lập trình này bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án được đặt thành mã dự án của bạn.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Đầu ra của lệnh

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt nó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra của lệnh

Updated property [core/project].

3. Thiết lập môi trường

Trước khi có thể bắt đầu sử dụng Text-to-Speech API, hãy chạy lệnh sau trong Cloud Shell để bật API này:

gcloud services enable texttospeech.googleapis.com

Bạn sẽ thấy như sau:

Operation "operations/..." finished successfully.

Giờ đây, bạn có thể sử dụng Text-to-Speech API!

Chuyển đến thư mục chính:

cd ~

Tạo một môi trường ảo Python để tách biệt các phần phụ thuộc:

virtualenv venv-texttospeech

Kích hoạt môi trường ảo:

source venv-texttospeech/bin/activate

Cài đặt IPython và thư viện ứng dụng Text-to-Speech API:

pip install ipython google-cloud-texttospeech

Bạn sẽ thấy như sau:

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

Giờ đây, bạn đã sẵn sàng sử dụng thư viện ứng dụng Text-to-Speech API!

Trong các bước tiếp theo, bạn sẽ sử dụng một trình thông dịch Python tương tác có tên là IPython mà bạn đã cài đặt ở bước trước. Bắt đầu một phiên bằng cách chạy ipython trong Cloud Shell:

ipython

Bạn sẽ thấy như sau:

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

Bạn đã sẵn sàng đưa ra yêu cầu đầu tiên và liệt kê các ngôn ngữ được hỗ trợ...

4. Liệt kê các ngôn ngữ được hỗ trợ

Trong phần này, bạn sẽ nhận được danh sách tất cả các ngôn ngữ được hỗ trợ.

Sao chép mã sau vào phiên 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 "")
        

Dành chút thời gian nghiên cứu mã này và xem cách mã này sử dụng phương thức thư viện ứng dụng list_voices để tạo danh sách các ngôn ngữ được hỗ trợ.

Gọi hàm:

list_languages()

Bạn sẽ nhận được danh sách sau (hoặc danh sách lớn hơn):

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

Danh sách này có 58 ngôn ngữ và biến thể, chẳng hạn như:

  • Tiếng Trung và tiếng Quan Thoại Đài Loan,
  • Tiếng Anh Úc, Anh, Ấn Độ và Mỹ,
  • Tiếng Pháp ở Canada và Pháp,
  • Tiếng Bồ Đào Nha tại Brazil và Bồ Đào Nha.

Danh sách này không cố định và sẽ mở rộng khi có thêm giọng nói mới.

Tóm tắt

Bước này cho phép bạn liệt kê các ngôn ngữ được hỗ trợ.

5. Liệt kê các giọng nói có sẵn

Trong phần này, bạn sẽ thấy danh sách các giọng nói có sẵn bằng nhiều ngôn ngữ.

Sao chép mã sau vào phiên 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")
        

Hãy dành chút thời gian để nghiên cứu mã và xem cách mã này sử dụng phương thức list_voices(language_code) của thư viện ứng dụng để liệt kê các giọng nói có sẵn cho một ngôn ngữ nhất định.

Bây giờ, hãy lấy danh sách các giọng nói tiếng Đức có sẵn:

list_voices("de")

Bạn sẽ thấy như sau:

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

Có nhiều giọng nữ và giọng nam, cũng như giọng nói tiêu chuẩn, WaveNet, Neural2 và Studio:

  • Giọng nói chuẩn được tạo bằng các thuật toán xử lý tín hiệu.
  • WaveNet, Neural2 và Studio voices là những giọng nói chất lượng cao hơn được tổng hợp bằng các mô hình học máy và nghe tự nhiên hơn.

Bây giờ, hãy lấy danh sách các giọng nói tiếng Anh có sẵn:

list_voices("en")

Bạn sẽ thấy nội dung tương tự như sau:

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

Ngoài nhiều giọng nói với các giới tính và chất lượng khác nhau, còn có nhiều giọng điệu: tiếng Anh Úc, tiếng Anh Anh, tiếng Anh Ấn Độ và tiếng Anh Mỹ.

Dành chút thời gian để liệt kê những giọng nói có sẵn cho ngôn ngữ và biến thể ngôn ngữ mà bạn ưu tiên (hoặc thậm chí là tất cả):

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

Tóm tắt

Bước này cho phép bạn liệt kê các giọng nói có sẵn. Bạn có thể đọc thêm về các giọng nói và ngôn ngữ được hỗ trợ.

6. Tổng hợp âm thanh từ văn bản

Bạn có thể sử dụng Text-to-Speech API để chuyển đổi một chuỗi thành dữ liệu âm thanh. Bạn có thể định cấu hình đầu ra của tính năng tổng hợp lời nói theo nhiều cách, bao gồm cả việc chọn một giọng nói riêng hoặc điều chỉnh đầu ra về cao độ, âm lượng, tốc độ nói và tốc độ lấy mẫu.

Sao chép mã sau vào phiên 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}"')
        

Dành chút thời gian để nghiên cứu mã và xem cách mã này sử dụng phương thức thư viện ứng dụng synthesize_speech để tạo dữ liệu âm thanh và lưu dữ liệu đó dưới dạng tệp wav.

Bây giờ, hãy tạo câu bằng một số giọng điệu khác nhau:

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

Bạn sẽ thấy như sau:

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"

Để tải tất cả các tệp đã tạo xuống cùng một lúc, bạn có thể sử dụng lệnh Cloud Shell sau đây trong môi trường Python:

!cloudshell download *.wav

Xác thực và trình duyệt của bạn sẽ tải các tệp xuống:

44382e3b7a3314b0.png 4dbccf007cd73b91.png

Mở từng tệp và nghe kết quả.

Tóm tắt

Trong bước này, bạn có thể sử dụng Text-to-Speech API để chuyển đổi các câu thành tệp âm thanh wav. Đọc thêm về cách tạo tệp âm thanh giọng nói.

7. Xin chúc mừng!

1215f38908082356.png

Bạn đã tìm hiểu cách sử dụng Text-to-Speech API bằng Python để tạo lời nói giống như của con người!

Dọn dẹp

Để dọn dẹp môi trường phát triển, hãy làm như sau trong Cloud Shell:

  • Nếu bạn vẫn đang trong phiên IPython, hãy quay lại shell: exit
  • Ngừng sử dụng môi trường ảo Python: deactivate
  • Xoá thư mục môi trường ảo: cd ~ ; rm -rf ./venv-texttospeech

Để xoá dự án trên đám mây của bạn, hãy làm như sau trong Cloud Shell:

  • Lấy mã dự án hiện tại: PROJECT_ID=$(gcloud config get-value core/project)
  • Hãy đảm bảo rằng đây là dự án bạn muốn xoá: echo $PROJECT_ID
  • Xoá dự án: gcloud projects delete $PROJECT_ID

Tìm hiểu thêm

Giấy phép

Tác phẩm này được cấp phép theo giấy phép Ghi công theo Creative Commons 2.0 Chung.