Class: AozoraPolly::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/aozora_polly/builder.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeBuilder

Returns a new instance of Builder.



9
10
11
# File 'lib/aozora_polly/builder.rb', line 9

def initialize
  @mp3_builder = Ssml2mp3::Builder.new
end

Instance Attribute Details

#mp3_builderObject (readonly)

Returns the value of attribute mp3_builder.



7
8
9
# File 'lib/aozora_polly/builder.rb', line 7

def mp3_builder
  @mp3_builder
end

Instance Method Details

#create_ssml(doc, ssml_body) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
# File 'lib/aozora_polly/builder.rb', line 48

def create_ssml(doc, ssml_body)
  <<-XML
<?xml version="1.0"?>
<speak version="1.1" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="ja">
<p>#{doc.title}</p>
<p>#{doc.author}</p>

#{ssml_body}
</speak>
  XML
end

#html2ssml(html) ⇒ Object



28
29
30
31
32
33
34
# File 'lib/aozora_polly/builder.rb', line 28

def html2ssml(html)
  doc = ::AozoraPolly::Document.parse(html.encode("utf-8"))

  main_ssml = html2ssml_fragment(doc.main_text)
  bib_ssml = html2ssml_fragment(doc.bibliography)
  create_ssml(doc, main_ssml + bib_ssml)
end

#html2ssml_fragment(fragment) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/aozora_polly/builder.rb', line 36

def html2ssml_fragment(fragment)
  Sanitize.
    fragment(fragment, elements: %w(br ruby rb rp rt div h1 h2 h3 h4 h5)).
    gsub(%r(<br\s*/?>), '<break />').
    gsub(%r(<(?:h\d|div)[^>]*>), '<p>').
    gsub(%r(</(?:h\d|div)>), '</p>').
    gsub(%r(</?ruby>), '').
    gsub(%r(<rb>[^<]*</rb>), '').
    gsub(%r(<rp>[^<]*</rp>), '').
    gsub(%r(</?rt>), '')
end

#url2mp3(aozora_url, mp3_path) ⇒ Object



13
14
15
16
17
18
19
20
# File 'lib/aozora_polly/builder.rb', line 13

def url2mp3(aozora_url, mp3_path)
  ssml = url2ssml(aozora_url)

  basename = File.basename(mp3_path, ".mp3")
  File.open(mp3_path, "wb") do |output|
    mp3_builder.synthesize(ssml, basename, output)
  end
end

#url2ssml(aozora_url) ⇒ Object



22
23
24
25
26
# File 'lib/aozora_polly/builder.rb', line 22

def url2ssml(aozora_url)
  uri = URI.parse(aozora_url)
  html = Net::HTTP.get(uri).force_encoding("cp932")
  html2ssml(html)
end