go-скрипт, який робить аудіокнигу з текстового файлу, використовуючи один з кращих синтезаторів мовлення — Ivona від Amazon

Вказуємо в скрипті шлях на книги в txt — на виході отримуємо папку з озвучкою хорошим синтезом.

Люблю споживати контент вухами — в цей час можна займатися спортом або давати відпочинок очам. Я звик що будь-яка нормальна книжка має аудіо-версію, в гіршому випадку — любительську, однак це не завжди так. Сьогодні я кілька годин перебирав різні онлайн-сервіси і Android-програми для виступаючи російського тексту — з вподобаного тільки 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-UA"
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.: Першим ділом краще шукати вже озвучену людиною версію книги.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.