Search
Write a publication
Pull to refresh

Синтезируем русскую речь с помощью Python и сервиса Google

Не секрет, что у Google есть проекты в области синтеза и распознавания речи. С помощью одного из них, и простого скрипта на Python мы заставим компьютер притвориться девушкой с томным голосом и почитать нам стихи Пушкина.

Непосредственно для синтеза речи понадобится:

  1. Представиться браузером Chrome
  2. Отправить GET запрос вида translate.google.com/translate_tts?tl=ru&q=текст
  3. Принять и сохранить ответ в mp3

Я часто использую grab для парсинга, а здесь возьму его в качестве удобной обертки для работы с запросом и ответом к сервису Google

 def sintez(word,filepath):
    sintez_word = urllib.quote(word)
    g = Grab()
    g.setup(user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/12.04 Chromium/18.0.1025.151 Chrome/18.0.1025.151 Safari/535.19")
    g.go('http://translate.google.com/translate_tts?tl=ru&q='+sintez_word)
    f = open(filepath,'wb')
    f.write(g.response.body)
    f.close()
    return True


В этой функции мы реализуем описанный выше план по использованию сервиса и записываем результат в файл.
Сервис не поддерживает длинный текст (по моим прикидкам, максимально допустимое значение в пределах 150-250 символов), поэтому необходимо будет склеить результирующий файл из нескольких мелких.
Этим займется следующая функция:

def join_file(filenames,result_filepath):
    output = open(result_filepath,'wb')
    for filename in filenames:
        fileobj = open(filename,'rb')
        filebytes = fileobj.read()
        output.write(filebytes)
        fileobj.close()
    output.close()


Применение очевидно: на вход передается список путей имен файлов, из которых будем собирать результирующий, и путь к результирующему файлу.
Тело скрипта:


#coding: utf-8
from grab import Grab
import urllib
import os

tmp_filepath = 'tmp.mp3'
text_filepath = "text.txt"
result_filepath = 'result.mp3'
text = open(text_filepath)
number_of_file=0
namelist = []

for line in text.readlines():
    current_string = line.strip()
    number_of_file += 1
    current_filepath = str(number_of_file)+tmp_filepath
    namelist.append(current_filepath)
    sintez(current_string,current_filepath)

join_file(namelist,result_filepath)
current_dir = os.path.abspath(os.curdir)
delete_files(namelist,current_dir)


Определяем пути к нашим файлам (путь для временных mp3 с кусочками итогового текста в синтезированном виде, путь к исходному тексту, путь к результирующему файлу).

Пропускаем каждую строку исходного текста (у меня там отрывок из стихотворения Пушкина) через синтез. Строки должны быть не длиннее ~150-200 символов.

Объединяем все это в один файл, и подчищаем за собой временные части.


def delete_files(filenames,directory):
    for filename in filenames:
        os.remove(os.path.join(directory,filename))


Результат можно скачать здесь (именно скачать, через встроенный на Я.Диске проигрыватель не воспроизводится). Несмотря на то, что в получившейся речи нередко встречаются неправильные ударения, в целом все звучит очень разборчиво и достойно, а иногда даже попадает в интонацию стиха (пусть это и всего лишь совпадения).

Перспективы у подобных технологий достаточно большие, несколько ссылок на тему:

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.