-
Notifications
You must be signed in to change notification settings - Fork 2
/
meta.go
66 lines (58 loc) · 1.43 KB
/
meta.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package nanoda
import "sort"
// スタイルのID
type StyleId uint32
// 話者のID
type SpeakerId string
// スタイル情報
type Style struct {
Name string `json:"name"`
Id StyleId `json:"id"`
}
// 内部用のメタ情報
type meta struct {
Name string `json:"name"`
Styles []Style `json:"styles"`
Version string `json:"version"`
SpeakerUuid SpeakerId `json:"speaker_uuid"`
}
// キャラクター単位のメタ情報
type Meta struct {
Name string
Styles []Style
SpeakerId SpeakerId
}
func (v *Voicevox) getMetas() (m []meta) {
for _, vvm := range v.vvms {
m = append(m, vvm.metas...)
}
return
}
// VVMごとのメタ情報をキャラクター単位にマージする
func (v *Voicevox) sortMetas(ms []meta) []Meta {
m := map[SpeakerId][]meta{}
for _, meta := range ms {
m[meta.SpeakerUuid] = append(m[meta.SpeakerUuid], meta)
}
metas := []Meta{}
for _, v := range m {
styles := []Style{}
for _, meta := range v {
styles = append(styles, meta.Styles...)
}
// スタイル情報をID順にソートする
sort.Slice(styles, func(i, j int) bool {
return styles[i].Id < styles[j].Id
})
metas = append(metas, Meta{
Name: v[0].Name,
Styles: styles,
SpeakerId: v[0].SpeakerUuid,
})
}
// メタ情報をスタイルのID順にソートする
sort.Slice(metas, func(i, j int) bool {
return metas[i].Styles[0].Id < metas[j].Styles[0].Id
})
return metas
}