Недавно потребовалось сделать "перевод" нескольких десятков небольших текстовых файлов в звук. Точней в mp3. Как оказалось, задача совсем не сложная. Привожу текст программы на GO 1.9, которая делает пакетное преобразование текста в звук. Примечание: в настройках нужно указать папку где находятся файлы с текстом (не более 1500 знаков) папку куда будем складывать результат (mp3) голос диктора (для русского текста Maxim или Tatyana) - этим вы переключаете язык и самое главное - access key и secret key. Это ключи для доступа к Amazon API. Без них ничего работать не будет. Получить их можно после регистрации на Amazon. package main
Группа для программистов ( programming )
:Дмитрий Гусельников
Amazon Polly - text to speech
У всем известного Amazon, существует любопытный сервис Polly https://aws.amazon.com/ru/polly/
Примечание:
в настройках нужно указать папку где находятся файлы с текстом (не более 1500 знаков)
папку куда будем складывать результат (mp3)
голос диктора (для русского текста Maxim или Tatyana) - этим вы переключаете язык
и самое главное - access key и secret key. Это ключи для доступа к Amazon API. Без них ничего работать не будет. Получить их можно после регистрации на Amazon.
package main
import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"strings"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/polly"
)
type Config struct {
AccessKey string `json:"access_key"`
SecretKey string `json:"secret_key"`
Voice string `json: voice`
InPath string `json:"in_path"`
OutPath string `json:"out_path"`
}
func LoadConfig(file string) (Config, error) {
var cfg Config
configFile, err := os.Open(file)
if err != nil {
return cfg, err
}
jsonParser := json.NewDecoder(configFile)
jsonParser.Decode(&cfg)
return cfg, nil
}
func Exists(path string) error {
if _, err := os.Stat(path); err != nil && os.IsNotExist(err) {
return err
}
return nil
}
func LoadFile(filename string) (string, error) {
file, err := os.Open(filename)
if err != nil {
return "", err
}
defer file.Close()
stat, err := file.Stat()
if err != nil {
return "", err
}
bs := make([]byte, stat.Size())
_, err = file.Read(bs)
if err != nil {
return "", err
}
return string(bs), nil
}
func TextToMp3(c Config, text string, filename string) error {
awsConf := &aws.Config{
Region: aws.String("eu-west-1"),
//Region: aws.String("us-west-2"),
Credentials: credentials.NewStaticCredentials(c.AccessKey, c.SecretKey, ""),
}
p := polly.New(session.Must(session.NewSession(awsConf)))
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
speech, err := p.SynthesizeSpeech(&polly.SynthesizeSpeechInput{
Text: aws.String(text),
VoiceId: aws.String(c.Voice),
OutputFormat: aws.String("mp3"),
})
if err != nil {
return err
}
_, err = io.Copy(f, speech.AudioStream)
if err != nil {
return err
}
speech.AudioStream.Close()
return nil
}
func main() {
fmt.Print("Загрузка конфигурации: ")
conf, err := LoadConfig("./config.json")
if err != nil {
panic(err)
}
fmt.Println(conf)
// input folder not found
if err := Exists(conf.InPath); err != nil {
panic(err)
}
// output folder
if err := Exists(conf.OutPath); err != nil {
if err := os.Mkdir(conf.OutPath, 0711); err != nil {
panic(err)
}
}
files, err := ioutil.ReadDir(conf.InPath)
if err != nil {
panic(err)
}
for _, file := range files {
fmt.Printf("Обработка файла: \"%s\" ", file.Name())
if text, err := LoadFile(filepath.Join(conf.InPath, file.Name())); err == nil {
outfile := filepath.Join(conf.OutPath, file.Name())
err := TextToMp3(conf, text, strings.Replace(outfile, filepath.Ext(outfile), ".mp3", -1))
if err != nil {
fmt.Println(err)
} else {
fmt.Println("OK.")
}
} else {
fmt.Println(err)
}
}
}
Конфигурация (config.json)
{
"access_key":"ВАШ_КЛЮЧ_ДОСТУПА",
"secret_key":"ВАШ_СЕКРЕТНЫЙ_КЛЮЧ",
"voice":"Maxim",
"in_path":"./in",
"out_path":"./out"
}