Как стать автором
Поиск
Написать публикацию
Обновить

Синтезируем русскую речь с помощью 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))


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

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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.