Text to speech. Українська мова


03.12.2024

Перетворення тексту у звук (TTS - «Text To Speech») - далі у статті буду називати синтезом мови. В Інтернеті можна знайти онлайн ресурси, які дозволяють перетворювати великі тексти у звукові файли. У більшості випадків вони спеціалізовані для "озвучки". Але в цій статті піде мова про автономний, (або умовно автономний), синтез мови. Тобто, коли Вашому пристрою треба щось сказати українською, при чому не заздалегідь заготовлену фразу, а саме згенерований текст. Якщо Вам треба "проговорювати" лише заздалегідь заготовлені фрази, то це не про це. Тут піде мова саме про те як синтезувати будь-яку фразу. Уміючи генерувати будь-які фрази, Ваш робот (або програма) зможе підтримати бесіду на будь-яку тему, а не повторювати "завчені фрази" ;)

Я наведу декілька прикладів як це можна зробити.

pyttsx3

pyttsx3 - це найпростіший варіант синтезу мови. Результат роботи схожий на звук з бляшанки.

Швидкий, але якість погана, підтримку українську не знайшов. Підключення до мережі не потрібно.

Детально про pyttsx3: https://pypi.org/project/pyttsx3/

text_to_speech_pyttsx3.py:


import pyttsx3
engine = pyttsx3.init()

voices = engine.getProperty('voices')
for voice in voices:
    print("Voice:")
    print(" - ID: %s" % voice.id)
    print(" - Name: %s" % voice.name)
    print(" - Languages: %s" % voice.languages)
    print(" - Gender: %s" % voice.gender)
    print(" - Age: %s" % voice.age)

engine.setProperty('voice', 'Russian')

""" RATE"""
rate = engine.getProperty('rate')   # getting details of current speaking rate
print (rate)                        #printing current voice rate
engine.setProperty('rate', 150)     # setting up new voice rate

"""VOICE"""
voices = engine.getProperty('voices')       #getting details of current voice
#engine.setProperty('voice', voices[0].id)  #changing index, changes voices. o for male
#engine.setProperty('voice', voices[1].id)   #changing index, changes voices. 1 for female

engine.say("Привет! Как дела?")
engine.runAndWait()

gTTS

gTTS - використовує сторонній сервіс Google Translate, для чого потребує підключення до мережі Інтернет. Дозволяє дуже швидко працювати з будь-якою мовою. Українську підтримує. На жаль, не має можливості обрати голос.

Найбільш швидкий, гнучкий і універсальний метод. Підтримує Українську. Не працює без доступу до мережі Інтернет.

Детально про gTTS: https://pypi.org/project/gTTS/

text_to_speech_gtts.py:


import gtts
from playsound import playsound

tts = gtts.gTTS("Доброго вечора, ми з України.", lang="uk", tld='co.uk')

tts.save('gtts.mp3')
playsound('gtts.mp3')

PyTorch

PyTorch - відкрита бібліотека машинного навчання. Завдяки їй та готових моделей можна реалізувати цілком автономну систему. Яка після завантаження вказаної моделі з Інтернету зможе працювати цілком на Вашому пристрої вже без доступу до мережі.

Швидкість роботи не велика. Підтримує Українську. Працює без доступу до мережі Інтернет.

Цей скрипт працює як консольна програма. У параметрах командного рядка треба вказати текстовий файл, який буде прочитано та ім'я wav-файлу, який буде створено. Після створення wav-файлу, програма програє його.

Детально про PyTorch: https://pytorch.org/

Моделі TTS: https://models.silero.ai/models/tts/

text_to_wav.py:


import os
import sys
import torch
from playsound import playsound

if len(sys.argv) != 3:
    print ("Syntax: python3 text_to_wav.py text.txt voice.wav")
    exit()

input_file_name = sys.argv[1]
output_file_name = sys.argv[2]

print ("Input file:", input_file_name)
print ("Output file:", output_file_name)

with open(input_file_name, 'r') as file:
    example_text = file.read().rstrip()

print("Text:")
print(example_text)

print("\r\nPocessing...")

device = torch.device('cpu')
torch.set_num_threads(4)

local_file = 'v3_ua.pt'
remote_file = 'https://models.silero.ai/models/tts/ua/' + local_file
sample_rate = 48000
speaker='mykyta'

if not os.path.isfile(local_file):
    torch.hub.download_url_to_file(remote_file, local_file)

model = torch.package.PackageImporter(local_file).load_pickle("tts_models", "model")
model.to(device)

audio_paths = model.save_wav(text=example_text, speaker=speaker, sample_rate=sample_rate, audio_path = output_file_name)

print("Playing...")

playsound(output_file_name)

print("Done.")

Завантажити архів з прикладами

Web-dev склерозник
Коментарі:
Додати коментар
Code
* - обов'язкові поля

Архіви