diff --git a/marusia/ssml/ssml.go b/marusia/ssml/ssml.go new file mode 100644 index 00000000..0cb5f48a --- /dev/null +++ b/marusia/ssml/ssml.go @@ -0,0 +1,55 @@ +// Package ssml implements Speech Synthesis Markup Language. +package ssml // import "github.com/SevereCloud/vksdk/v2/marusia/ssml" + +import ( + "bytes" + "strconv" + "time" +) + +// Builder SSML. +type Builder struct { + buf bytes.Buffer +} + +// NewBuilder возвращает *Builder. +func NewBuilder() *Builder { + return &Builder{} +} + +// Say используется для произношения слов. Пропускает теги внутрь. +func (b *Builder) Say(s string) *Builder { + _, _ = b.buf.WriteString(s) + return b +} + +// Paragraph используется для выделения абзацев. После абзаца ставится длинная интонационная пауза. +func (b *Builder) Paragraph(s string) *Builder { + return b.Say(`

`).Say(s).Say(`

`) +} + +// Sentence используется для выделения предложений. Предложение будет +// выделено интонационно, а в конце предложения будет пауза. +func (b *Builder) Sentence(s string) *Builder { + return b.Say(``).Say(s).Say(``) +} + +// Break используется для вставки пауз между произносимым текстом. +func (b *Builder) Break(duration time.Duration) *Builder { + return b.Say(``) +} + +// Speaker используется для вставки собственных аудиозаписей в текст. +func (b *Builder) Speaker(s string) *Builder { + return b.Say(``) +} + +// SpeakerFromLibrary используется для вставки звуков из библиотеки в текст. +func (b *Builder) SpeakerFromLibrary(s string) *Builder { + return b.Say(``) +} + +// String возвращает SSML в виде строки. +func (b Builder) String() string { + return "" + b.buf.String() + "" +} diff --git a/marusia/ssml/ssml_test.go b/marusia/ssml/ssml_test.go new file mode 100644 index 00000000..23d2cc60 --- /dev/null +++ b/marusia/ssml/ssml_test.go @@ -0,0 +1,65 @@ +package ssml_test + +import ( + "fmt" + "time" + + "github.com/SevereCloud/vksdk/v2/marusia/ssml" +) + +func ExampleNewBuilder() { + b := ssml.NewBuilder() + b.Say("Привет") + b.Break(500 * time.Millisecond).Say("Я Маруся") + + fmt.Print(b) + // Output: ПриветЯ Маруся +} + +func ExampleBuilder_Say() { + b := ssml.NewBuilder() + b.Say("Привет") + + fmt.Print(b) + // Output: Привет +} + +func ExampleBuilder_Paragraph() { + b := ssml.NewBuilder() + b.Paragraph("Привет") + + fmt.Print(b) + // Output:

Привет

+} + +func ExampleBuilder_Sentence() { + b := ssml.NewBuilder() + b.Sentence("Привет") + + fmt.Print(b) + // Output: Привет +} + +func ExampleBuilder_Break() { + b := ssml.NewBuilder() + b.Say("Привет").Break(500 * time.Millisecond).Say("Я Маруся") + + fmt.Print(b) + // Output: ПриветЯ Маруся +} + +func ExampleBuilder_Speaker() { + b := ssml.NewBuilder() + b.Say("Угадайте, чей это голос?").Speaker("-2000000002_123456789") + + fmt.Print(b) + // Output: Угадайте, чей это голос? +} + +func ExampleBuilder_SpeakerFromLibrary() { + b := ssml.NewBuilder() + b.Say("Так мычит корова").SpeakerFromLibrary("marusia-sounds/animals-cow-1") + + fmt.Print(b) + // Output: Так мычит корова +}