go-скрипт который делает аудиокнигу из текстового файла используя один из лучших синтезаторов речи — Ivona от Amazon

от автора

Указываем в скрипте путь на книгу в txt — на выходе получаем папку с озвучкой хорошим синтезом.

Люблю потреблять контент ушами — в это время можно заниматься спортом или давать отдых глазам. Я привык что любая нормальная книга имеет аудио-версию, в худшем случае — любительскую, однако это не всегда так. Сегодня я несколько часов перебирал разные онлайн-сервисы и Андроид-программы для проговаривания русского текста — из приглянувшегося только Pocket который использует Google TTS и Google Books с тем же движком но отчего то другим качеством голоса. Также интересен SpeechKit от Яндекс. Но вроде лучший синтез у Ivona — эту компанию в 2013 году купил Амазон. Гитхаб нашел с десяток скриптов для дергания готового звука, но полностью готового решения для озвучки целой книги не оказалось. Используя неофициальную Go-библиотеку для IVONA Speech Cloud API за несколько часов написал скрипт — впервые использую Go, удобно что все зависимости в одном файле, даже библиотеку с Гитхаба подтягивает автоматически.

Скрипт создает один ogg-файл на абзац — у меня была книга в plaintext, конечно логичнее было бы разбивать по главам, а целиком книгу скормить не получилось — есть лимит на входное количество символов, около десяти минут озвучки на нормальной скорости. Выходной формат можно поменять на mp3. Имена файлов нормально отсортированы по порядку. При работе скрипта в консоли показывается текущий абзац отправленный на озвучку.

Для работы скрипта нужны access key и secret key — я оставил тут свои, но если перестанет работать — вы можете бесплатно получить новые ключи тут.

package main import ( 	"log" 	"fmt" 	"io/ioutil" 	"strings" 	ivona "github.com/jpadilla/ivona-go" ) func main() { 	client := ivona.New("GDNAICTDMLSLU5426OAA", "2qUFTF8ZF9wqy7xoGBY+YXLEu+M2Qqalf/pSrd9m") 	text, err := ioutil.ReadFile("/home/vitaly/Desktop/test.txt") 	if err != nil { 		log.Fatal(err) 	}  	arrayOfParagraphs := strings.Split(string(text), "\n") 	i := 0 	for _,paragraph := range arrayOfParagraphs { 		if (len(paragraph) < 4) { // against empty lines 			continue 		} 		log.Printf("%v\n", paragraph) 		options := ivona.NewSpeechOptions(paragraph) 		options.Voice.Language = "ru-RU" 		options.Voice.Name = "Maxim" 		options.Voice.Gender = "Male" 		options.OutputFormat.Codec = "OGG" 		r, err := client.CreateSpeech(options) 		if err != nil { 			log.Fatal(err) 		}  		i++ 		file := fmt.Sprintf("/home/vitaly/Desktop/ivona/tts%04d.ogg", i) // files like 0001.ogg 		ioutil.WriteFile(file, r.Audio, 0644) 	} }  

После замены пути к книге и пути к выходной папке (а возможно и заменив символ по которому делается сплит файла а также указав английский вместо русского) запускаем скрипт — минут за десять получаем около сотни страниц готового tts:

go run ivona-tts.go 

Это мой первый go код, приветствую вашу критику.

P.S.: Первым делом лучше искать уже озвученную человеком версию книги.

ссылка на оригинал статьи https://habrahabr.ru/post/275587/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *