ssmd 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/SPECIFICATION.md +4 -6
- data/lib/ssmd/annotations.rb +1 -0
- data/lib/ssmd/annotations/prosody_annotation.rb +97 -0
- data/lib/ssmd/converter.rb +2 -1
- data/lib/ssmd/processors.rb +2 -1
- data/lib/ssmd/processors/annotation_processor.rb +7 -3
- data/lib/ssmd/processors/prosody_processor.rb +102 -0
- data/lib/ssmd/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1ffe3b65bc7397e1f4138e801428aa8c456c2ed
|
4
|
+
data.tar.gz: 9f8276cc70d5a50606d1a0f009a9c1f11819e739
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a68f17a706a90a8f534030c58ac41c00d12eb1bef1bc1eb7a057fb100b09e8d4a7dae9e3faa0ad4f5097951a5b6fb7d4212c36c96e1e1ae1af4eead95721f1bd
|
7
|
+
data.tar.gz: 9f0e8a1c837c1f2b0602bada363fb01061c24248e7b3faacb71d36c2ac43747aa0e97dd18686211faf7ce939bdcf062a0929f22d4d4017a894f1481ec0a0bad3
|
data/SPECIFICATION.md
CHANGED
@@ -183,7 +183,7 @@ Volume:
|
|
183
183
|
--extra soft--
|
184
184
|
-soft-
|
185
185
|
medium
|
186
|
-
+loud+
|
186
|
+
+loud+
|
187
187
|
++extra loud++
|
188
188
|
|
189
189
|
Rate:
|
@@ -202,7 +202,6 @@ medium
|
|
202
202
|
^high^
|
203
203
|
^^extra high^^
|
204
204
|
|
205
|
-
++>>^^extra loud, fast and high^^>>++ or
|
206
205
|
[extra loud, fast, and high](vrp: 555) or
|
207
206
|
[extra loud, fast, and high](v: 5, r: 5, p: 5)
|
208
207
|
```
|
@@ -215,7 +214,7 @@ Volume:
|
|
215
214
|
<prosody volume="x-soft">extra soft</prosody>
|
216
215
|
<prosody volume="soft">soft</prosody>
|
217
216
|
medium
|
218
|
-
<prosody volume="loud">loud</prosody>
|
217
|
+
<prosody volume="loud">loud</prosody>
|
219
218
|
<prosody volume="x-loud">extra loud</prosody>
|
220
219
|
|
221
220
|
Rate:
|
@@ -234,9 +233,8 @@ medium
|
|
234
233
|
<prosody pitch="high">high</prosody>
|
235
234
|
<prosody pitch="x-high">extra high</prosody>
|
236
235
|
|
237
|
-
<prosody volume="x-loud" rate="x-fast" pitch="x-high">extra loud, fast and high</prosody> or
|
238
|
-
<prosody volume="x-loud" rate="x-fast" pitch="x-high">extra loud, fast and high</prosody>
|
239
|
-
<prosody volume="x-loud" rate="x-fast" pitch="x-high">extra loud, fast and high</prosody>
|
236
|
+
<prosody volume="x-loud" rate="x-fast" pitch="x-high">extra loud, fast, and high</prosody> or
|
237
|
+
<prosody volume="x-loud" rate="x-fast" pitch="x-high">extra loud, fast, and high</prosody>
|
240
238
|
```
|
241
239
|
|
242
240
|
The shortcuts are listed first. While they can be combined, sometimes it's easier and shorter to just use
|
data/lib/ssmd/annotations.rb
CHANGED
@@ -0,0 +1,97 @@
|
|
1
|
+
require_relative 'annotation'
|
2
|
+
|
3
|
+
module SSMD::Annotations
|
4
|
+
class ProsodyAnnotation < Annotation
|
5
|
+
class << self
|
6
|
+
def regex
|
7
|
+
/(?:vrp: ?(\d{3}))|(?:([vrp]): ?(\d))/
|
8
|
+
end
|
9
|
+
|
10
|
+
def volumes
|
11
|
+
{
|
12
|
+
0 => "silent",
|
13
|
+
1 => "x-soft",
|
14
|
+
2 => "soft",
|
15
|
+
3 => "medium",
|
16
|
+
4 => "loud",
|
17
|
+
5 => "x-loud"
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def rates
|
22
|
+
{
|
23
|
+
1 => "x-slow",
|
24
|
+
2 => "slow",
|
25
|
+
3 => "medium",
|
26
|
+
4 => "fast",
|
27
|
+
5 => "x-fast"
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def pitches
|
32
|
+
{
|
33
|
+
1 => "x-low",
|
34
|
+
2 => "low",
|
35
|
+
3 => "medium",
|
36
|
+
4 => "high",
|
37
|
+
5 => "x-high"
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
attr_reader :volume, :rate, :pitch
|
43
|
+
|
44
|
+
def initialize(vrp, *tuples)
|
45
|
+
begin
|
46
|
+
if vrp && vrp.size == 3
|
47
|
+
set_vrp! vrp
|
48
|
+
elsif tuples.compact.size % 2 == 0
|
49
|
+
set_tuples! tuples.take(6)
|
50
|
+
else
|
51
|
+
# ignore invalid values
|
52
|
+
end
|
53
|
+
rescue ArgumentError
|
54
|
+
# ignore if there are invalid values
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def wrap(text)
|
59
|
+
attributes = [
|
60
|
+
("volume=\"#{volume}\"" if volume),
|
61
|
+
("rate=\"#{rate}\"" if rate),
|
62
|
+
("pitch=\"#{pitch}\"" if pitch)
|
63
|
+
]
|
64
|
+
|
65
|
+
"<prosody #{attributes.join(' ')}>#{text}</prosody>"
|
66
|
+
end
|
67
|
+
|
68
|
+
def combine(annotation)
|
69
|
+
@volume ||= annotation.volume
|
70
|
+
@rate ||= annotation.rate
|
71
|
+
@pitch ||= annotation.pitch
|
72
|
+
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def set_vrp!(vrp)
|
79
|
+
@volume = self.class.volumes.fetch Integer(vrp[0])
|
80
|
+
@rate = self.class.rates.fetch Integer(vrp[1])
|
81
|
+
@pitch = self.class.pitches.fetch Integer(vrp[2])
|
82
|
+
end
|
83
|
+
|
84
|
+
def set_tuples!(tuples)
|
85
|
+
tuples.each_slice(2).each do |key, value|
|
86
|
+
case key
|
87
|
+
when 'v'
|
88
|
+
@volume = self.class.volumes.fetch Integer(value)
|
89
|
+
when 'r'
|
90
|
+
@rate = self.class.rates.fetch Integer(value)
|
91
|
+
when 'p'
|
92
|
+
@pitch = self.class.pitches.fetch Integer(value)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/lib/ssmd/converter.rb
CHANGED
data/lib/ssmd/processors.rb
CHANGED
@@ -21,7 +21,7 @@ module SSMD::Processors
|
|
21
21
|
def self.annotations
|
22
22
|
a = SSMD::Annotations
|
23
23
|
|
24
|
-
[a::LanguageAnnotation, a::PhonemeAnnotation]
|
24
|
+
[a::LanguageAnnotation, a::PhonemeAnnotation, a::ProsodyAnnotation]
|
25
25
|
end
|
26
26
|
|
27
27
|
def ok?
|
@@ -39,7 +39,7 @@ module SSMD::Processors
|
|
39
39
|
annotation = find_annotation annotation_text
|
40
40
|
|
41
41
|
if annotation.nil?
|
42
|
-
|
42
|
+
warnings.push "Unknown annotation: #{text}"
|
43
43
|
end
|
44
44
|
|
45
45
|
[annotation].compact
|
@@ -72,7 +72,7 @@ module SSMD::Processors
|
|
72
72
|
\( # opening annotations
|
73
73
|
((?:
|
74
74
|
(?:
|
75
|
-
#{annotations_regex}
|
75
|
+
#{annotations_regex} # annotations
|
76
76
|
)(?:,\s?)?
|
77
77
|
)+)
|
78
78
|
\) # closing annotations
|
@@ -82,5 +82,9 @@ module SSMD::Processors
|
|
82
82
|
def annotations_regex
|
83
83
|
self.class.annotations.map(&:regex).join("|")
|
84
84
|
end
|
85
|
+
|
86
|
+
def warnings
|
87
|
+
@warnings ||= []
|
88
|
+
end
|
85
89
|
end
|
86
90
|
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require_relative 'processor'
|
2
|
+
|
3
|
+
module SSMD::Processors
|
4
|
+
class ProsodyProcessor < Processor
|
5
|
+
def result
|
6
|
+
with_volume || with_rate || with_pitch
|
7
|
+
end
|
8
|
+
|
9
|
+
def regex
|
10
|
+
Regex.prosody
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def with_volume
|
16
|
+
name, text = volume_keys.map { |k| [k, match[k]] }.find { |k, v| !v.nil? }
|
17
|
+
|
18
|
+
"<prosody volume=\"#{name}\">#{text}</prosody>" if name && text
|
19
|
+
end
|
20
|
+
|
21
|
+
def with_rate
|
22
|
+
name, text = rate_keys.map { |k| [k, match[k]] }.find { |k, v| !v.nil? }
|
23
|
+
|
24
|
+
"<prosody rate=\"#{name}\">#{text}</prosody>" if name && text
|
25
|
+
end
|
26
|
+
|
27
|
+
def with_pitch
|
28
|
+
name, text = pitch_keys.map { |k| [k, match[k]] }.find { |k, v| !v.nil? }
|
29
|
+
|
30
|
+
"<prosody pitch=\"#{name}\">#{text}</prosody>" if name && text
|
31
|
+
end
|
32
|
+
|
33
|
+
def volume_keys
|
34
|
+
['silent', 'x-soft', 'soft', 'loud', 'x-loud']
|
35
|
+
end
|
36
|
+
|
37
|
+
def rate_keys
|
38
|
+
['x-slow', 'slow', 'fast', 'x-fast']
|
39
|
+
end
|
40
|
+
|
41
|
+
def pitch_keys
|
42
|
+
['x-low', 'low', 'high', 'x-high']
|
43
|
+
end
|
44
|
+
|
45
|
+
module Regex
|
46
|
+
module_function
|
47
|
+
|
48
|
+
def prosody
|
49
|
+
%r{
|
50
|
+
(?:#{slow_rate}) |
|
51
|
+
(?:#{fast_rate}) |
|
52
|
+
(?:#{silent_volume}) |
|
53
|
+
(?:#{soft_volume}) |
|
54
|
+
(?:#{loud_volume}) |
|
55
|
+
(?:#{low_pitch}) |
|
56
|
+
(?:#{high_pitch})
|
57
|
+
}x
|
58
|
+
end
|
59
|
+
|
60
|
+
def silent_volume
|
61
|
+
/~#{content('silent')}~/
|
62
|
+
end
|
63
|
+
|
64
|
+
def soft_volume
|
65
|
+
/(?:#{ws_start}--#{content('x-soft')}--#{ws_end})|(?:#{ws_start}-#{content('soft')}-#{ws_end})/
|
66
|
+
end
|
67
|
+
|
68
|
+
def loud_volume
|
69
|
+
/(?:#{ws_start}\+\+#{content('x-loud')}\+\+#{ws_end})|(?:#{ws_start}\+#{content('loud')}\+#{ws_end})/
|
70
|
+
end
|
71
|
+
|
72
|
+
def slow_rate
|
73
|
+
/(?:#{ws_start}<<#{content('x-slow')}<<#{ws_end})|(?:#{ws_start}<#{content('slow')}<#{ws_end})/
|
74
|
+
end
|
75
|
+
|
76
|
+
def fast_rate
|
77
|
+
/(?:#{ws_start}>>#{content('x-fast')}>>#{ws_end})|(?:#{ws_start}>#{content('fast')}>#{ws_end})/
|
78
|
+
end
|
79
|
+
|
80
|
+
def low_pitch
|
81
|
+
/(?:#{ws_start}__#{content('x-low')}__#{ws_end})|(?:#{ws_start}_#{content('low')}_#{ws_end})/
|
82
|
+
end
|
83
|
+
|
84
|
+
def high_pitch
|
85
|
+
/(?:#{ws_start}\^\^#{content('x-high')}\^\^#{ws_end})|(?:#{ws_start}\^#{content('high')}\^#{ws_end})/
|
86
|
+
end
|
87
|
+
|
88
|
+
def content(name = nil)
|
89
|
+
id = name ? "?<#{name}>" : ""
|
90
|
+
/(#{id}(?:[^\s])|(?:[^\s].*[^\s]))/
|
91
|
+
end
|
92
|
+
|
93
|
+
def ws_start
|
94
|
+
/(?<=(\A)|(?:\s))/
|
95
|
+
end
|
96
|
+
|
97
|
+
def ws_end
|
98
|
+
/(?=(\Z)|(?:\s))/
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/lib/ssmd/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ssmd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Markus Kahl
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -109,6 +109,7 @@ files:
|
|
109
109
|
- lib/ssmd/annotations/annotation.rb
|
110
110
|
- lib/ssmd/annotations/language_annotation.rb
|
111
111
|
- lib/ssmd/annotations/phoneme_annotation.rb
|
112
|
+
- lib/ssmd/annotations/prosody_annotation.rb
|
112
113
|
- lib/ssmd/annotations/xsampa_to_ipa_table.txt
|
113
114
|
- lib/ssmd/converter.rb
|
114
115
|
- lib/ssmd/processors.rb
|
@@ -116,6 +117,7 @@ files:
|
|
116
117
|
- lib/ssmd/processors/emphasis_processor.rb
|
117
118
|
- lib/ssmd/processors/mark_processor.rb
|
118
119
|
- lib/ssmd/processors/processor.rb
|
120
|
+
- lib/ssmd/processors/prosody_processor.rb
|
119
121
|
- lib/ssmd/version.rb
|
120
122
|
- ssmd.gemspec
|
121
123
|
homepage: https://github.com/machisuji/ssmd
|