Не секрет, что у Google есть проекты в области синтеза и распознавания речи. С помощью одного из них, и простого скрипта на Python мы заставим компьютер притвориться девушкой с томным голосом и почитать нам стихи Пушкина.
Я часто использую grab для парсинга, а здесь возьму его в качестве удобной обертки для работы с запросом и ответом к сервису Google
В этой функции мы реализуем описанный выше план по использованию сервиса и записываем результат в файл.
Сервис не поддерживает длинный текст (по моим прикидкам, максимально допустимое значение в пределах 150-250 символов), поэтому необходимо будет склеить результирующий файл из нескольких мелких.
Этим займется следующая функция:
Применение очевидно: на вход передается список путей имен файлов, из которых будем собирать результирующий, и путь к результирующему файлу.
Тело скрипта:
Определяем пути к нашим файлам (путь для временных mp3 с кусочками итогового текста в синтезированном виде, путь к исходному тексту, путь к результирующему файлу).
Пропускаем каждую строку исходного текста (у меня там отрывок из стихотворения Пушкина) через синтез. Строки должны быть не длиннее ~150-200 символов.
Объединяем все это в один файл, и подчищаем за собой временные части.
Результат можно скачать здесь (именно скачать, через встроенный на Я.Диске проигрыватель не воспроизводится). Несмотря на то, что в получившейся речи нередко встречаются неправильные ударения, в целом все звучит очень разборчиво и достойно, а иногда даже попадает в интонацию стиха (пусть это и всего лишь совпадения).
Непосредственно для синтеза речи понадобится:
- Представиться браузером Chrome
- Отправить GET запрос вида translate.google.com/translate_tts?tl=ru&q=текст
- Принять и сохранить ответ в 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))
Результат можно скачать здесь (именно скачать, через встроенный на Я.Диске проигрыватель не воспроизводится). Несмотря на то, что в получившейся речи нередко встречаются неправильные ударения, в целом все звучит очень разборчиво и достойно, а иногда даже попадает в интонацию стиха (пусть это и всего лишь совпадения).
Перспективы у подобных технологий достаточно большие, несколько ссылок на тему:
- Статья на Хабре, из которой была взята идея с синтезом речи — «Умный дом» собственными руками
- Статья в Википедии по данной тематике