Skip to content

Commit

Permalink
feat: new package marusia/ssml
Browse files Browse the repository at this point in the history
  • Loading branch information
SevereCloud committed Jun 1, 2021
1 parent 1aa6124 commit c8ccd8c
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 0 deletions.
55 changes: 55 additions & 0 deletions marusia/ssml/ssml.go
Original file line number Diff line number Diff line change
@@ -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(`<p>`).Say(s).Say(`</p>`)
}

// Sentence используется для выделения предложений. Предложение будет
// выделено интонационно, а в конце предложения будет пауза.
func (b *Builder) Sentence(s string) *Builder {
return b.Say(`<s>`).Say(s).Say(`</s>`)
}

// Break используется для вставки пауз между произносимым текстом.
func (b *Builder) Break(duration time.Duration) *Builder {
return b.Say(`<break time="`).Say(strconv.FormatInt(duration.Milliseconds(), 10)).Say(`ms"/>`)
}

// Speaker используется для вставки собственных аудиозаписей в текст.
func (b *Builder) Speaker(s string) *Builder {
return b.Say(`<speaker audio_vk_id="`).Say(s).Say(`"/>`)
}

// SpeakerFromLibrary используется для вставки звуков из библиотеки в текст.
func (b *Builder) SpeakerFromLibrary(s string) *Builder {
return b.Say(`<speaker audio="`).Say(s).Say(`"/>`)
}

// String возвращает SSML в виде строки.
func (b Builder) String() string {
return "<speak>" + b.buf.String() + "</speak>"
}
65 changes: 65 additions & 0 deletions marusia/ssml/ssml_test.go
Original file line number Diff line number Diff line change
@@ -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: <speak>Привет<break time="500ms"/>Я Маруся</speak>
}

func ExampleBuilder_Say() {
b := ssml.NewBuilder()
b.Say("Привет")

fmt.Print(b)
// Output: <speak>Привет</speak>
}

func ExampleBuilder_Paragraph() {
b := ssml.NewBuilder()
b.Paragraph("Привет")

fmt.Print(b)
// Output: <speak><p>Привет</p></speak>
}

func ExampleBuilder_Sentence() {
b := ssml.NewBuilder()
b.Sentence("Привет")

fmt.Print(b)
// Output: <speak><s>Привет</s></speak>
}

func ExampleBuilder_Break() {
b := ssml.NewBuilder()
b.Say("Привет").Break(500 * time.Millisecond).Say("Я Маруся")

fmt.Print(b)
// Output: <speak>Привет<break time="500ms"/>Я Маруся</speak>
}

func ExampleBuilder_Speaker() {
b := ssml.NewBuilder()
b.Say("Угадайте, чей это голос?").Speaker("-2000000002_123456789")

fmt.Print(b)
// Output: <speak>Угадайте, чей это голос?<speaker audio_vk_id="-2000000002_123456789"/></speak>
}

func ExampleBuilder_SpeakerFromLibrary() {
b := ssml.NewBuilder()
b.Say("Так мычит корова").SpeakerFromLibrary("marusia-sounds/animals-cow-1")

fmt.Print(b)
// Output: <speak>Так мычит корова<speaker audio="marusia-sounds/animals-cow-1"/></speak>
}

0 comments on commit c8ccd8c

Please sign in to comment.