google_tts2 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +68 -0
- data/Guardfile +33 -0
- data/LICENSE +24 -0
- data/README.md +28 -0
- data/Rakefile +3 -0
- data/lib/google_tts.rb +39 -0
- data/lib/google_tts/connector.rb +35 -0
- data/lib/google_tts/mp3writer.rb +23 -0
- data/lib/google_tts/parser.rb +69 -0
- data/lib/google_tts/query_builder.rb +18 -0
- data/spec/fixtures/big_text.txt +1 -0
- data/spec/lib/google_tts/connector_spec.rb +51 -0
- data/spec/lib/google_tts/mp3writer_spec.rb +31 -0
- data/spec/lib/google_tts/parser_spec.rb +60 -0
- data/spec/lib/google_tts/query_builder_spec.rb +19 -0
- data/spec/lib/google_tts_spec.rb +33 -0
- data/spec/spec_helper.rb +23 -0
- metadata +88 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
childprocess (0.3.9)
|
5
|
+
ffi (~> 1.0, >= 1.0.11)
|
6
|
+
coderay (1.0.9)
|
7
|
+
diff-lcs (1.2.4)
|
8
|
+
ffi (1.9.0)
|
9
|
+
formatador (0.2.4)
|
10
|
+
fuubar (1.2.1)
|
11
|
+
rspec (~> 2.0)
|
12
|
+
rspec-instafail (~> 0.2.0)
|
13
|
+
ruby-progressbar (~> 1.0)
|
14
|
+
guard (1.8.2)
|
15
|
+
formatador (>= 0.2.4)
|
16
|
+
listen (>= 1.0.0)
|
17
|
+
lumberjack (>= 1.0.2)
|
18
|
+
pry (>= 0.9.10)
|
19
|
+
thor (>= 0.14.6)
|
20
|
+
guard-rspec (3.0.3)
|
21
|
+
guard (>= 1.8)
|
22
|
+
rspec (~> 2.13)
|
23
|
+
guard-spork (1.5.1)
|
24
|
+
childprocess (>= 0.2.3)
|
25
|
+
guard (>= 1.1)
|
26
|
+
spork (>= 0.8.4)
|
27
|
+
listen (1.3.1)
|
28
|
+
rb-fsevent (>= 0.9.3)
|
29
|
+
rb-inotify (>= 0.9)
|
30
|
+
rb-kqueue (>= 0.2)
|
31
|
+
lumberjack (1.0.4)
|
32
|
+
method_source (0.8.2)
|
33
|
+
pry (0.9.12.2)
|
34
|
+
coderay (~> 1.0.5)
|
35
|
+
method_source (~> 0.8)
|
36
|
+
slop (~> 3.4)
|
37
|
+
rake (10.1.0)
|
38
|
+
rb-fsevent (0.9.3)
|
39
|
+
rb-inotify (0.9.2)
|
40
|
+
ffi (>= 0.5.0)
|
41
|
+
rb-kqueue (0.2.0)
|
42
|
+
ffi (>= 0.5.0)
|
43
|
+
rspec (2.14.1)
|
44
|
+
rspec-core (~> 2.14.0)
|
45
|
+
rspec-expectations (~> 2.14.0)
|
46
|
+
rspec-mocks (~> 2.14.0)
|
47
|
+
rspec-core (2.14.5)
|
48
|
+
rspec-expectations (2.14.2)
|
49
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
50
|
+
rspec-instafail (0.2.4)
|
51
|
+
rspec-mocks (2.14.3)
|
52
|
+
ruby-progressbar (1.2.0)
|
53
|
+
slop (3.4.6)
|
54
|
+
spork (0.9.2)
|
55
|
+
terminal-notifier-guard (1.5.3)
|
56
|
+
thor (0.18.1)
|
57
|
+
|
58
|
+
PLATFORMS
|
59
|
+
ruby
|
60
|
+
|
61
|
+
DEPENDENCIES
|
62
|
+
fuubar
|
63
|
+
guard-rspec
|
64
|
+
guard-spork (~> 1.4)
|
65
|
+
rake
|
66
|
+
rspec
|
67
|
+
spork (~> 0.9)
|
68
|
+
terminal-notifier-guard
|
data/Guardfile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' } do
|
3
|
+
# Should be re-enabled when Rails is present
|
4
|
+
# watch('config/application.rb')
|
5
|
+
# watch('config/environment.rb')
|
6
|
+
# watch('config/environments/test.rb')
|
7
|
+
# watch(%r{^config/initializers/.+\.rb$})
|
8
|
+
watch('Gemfile.lock')
|
9
|
+
watch('spec/spec_helper.rb') { :rspec }
|
10
|
+
watch('test/test_helper.rb') { :test_unit }
|
11
|
+
watch(%r{features/support/}) { :cucumber }
|
12
|
+
end
|
13
|
+
|
14
|
+
guard 'rspec', :all_on_start => true, :all_after_pass => false do
|
15
|
+
watch(%r{^spec/.+_spec\.rb$})
|
16
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
17
|
+
watch('spec/spec_helper.rb') { "spec" }
|
18
|
+
|
19
|
+
# # Rails example
|
20
|
+
# watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
21
|
+
# watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
22
|
+
# watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
23
|
+
# watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
24
|
+
# watch('config/routes.rb') { "spec/routing" }
|
25
|
+
# watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
26
|
+
#
|
27
|
+
# # Capybara features specs
|
28
|
+
# watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
|
29
|
+
#
|
30
|
+
# # Turnip features and steps
|
31
|
+
# watch(%r{^spec/acceptance/(.+)\.feature$})
|
32
|
+
# watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
33
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
This is free and unencumbered software released into the public domain.
|
2
|
+
|
3
|
+
Anyone is free to copy, modify, publish, use, compile, sell, or
|
4
|
+
distribute this software, either in source code form or as a compiled
|
5
|
+
binary, for any purpose, commercial or non-commercial, and by any
|
6
|
+
means.
|
7
|
+
|
8
|
+
In jurisdictions that recognize copyright laws, the author or authors
|
9
|
+
of this software dedicate any and all copyright interest in the
|
10
|
+
software to the public domain. We make this dedication for the benefit
|
11
|
+
of the public at large and to the detriment of our heirs and
|
12
|
+
successors. We intend this dedication to be an overt act of
|
13
|
+
relinquishment in perpetuity of all present and future rights to this
|
14
|
+
software under copyright law.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
20
|
+
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
21
|
+
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
For more information, please refer to <http://unlicense.org/>
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
Inspired on another gem - https://github.com/bloomrain/google_tts - this library is a
|
2
|
+
complete refactoring to support large texts.
|
3
|
+
|
4
|
+
#Install on Gemfile
|
5
|
+
gem 'google_tts2', '0.0.2', :git => "https://github.com/filipesperandio/google_tts2.git"
|
6
|
+
#Usage
|
7
|
+
require 'google_tts'
|
8
|
+
google_tts = GoogleTts.instantiate({:lang => :pt, :output => "out", :proxy => {:port => 8080, :host => 'localhost' }})
|
9
|
+
google_tts.save "FileName" "Texto em Portugês"
|
10
|
+
|
11
|
+
|
12
|
+
#TODO
|
13
|
+
* gemspec
|
14
|
+
|
15
|
+
#Development
|
16
|
+
|
17
|
+
Just install the bundles:
|
18
|
+
|
19
|
+
bundle install
|
20
|
+
|
21
|
+
To run the tests
|
22
|
+
|
23
|
+
bundle exec guard
|
24
|
+
|
25
|
+
or
|
26
|
+
|
27
|
+
bundle exec rspec spec
|
28
|
+
|
data/Rakefile
ADDED
data/lib/google_tts.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'google_tts/connector'
|
2
|
+
require 'google_tts/query_builder'
|
3
|
+
require 'google_tts/parser'
|
4
|
+
require 'google_tts/mp3writer'
|
5
|
+
|
6
|
+
module GoogleTts
|
7
|
+
VERSION = "0.0.2"
|
8
|
+
|
9
|
+
class Client
|
10
|
+
include GoogleTts
|
11
|
+
|
12
|
+
def initialize(connector = Connector.new,
|
13
|
+
query_builder = QueryBuilder.new,
|
14
|
+
mp3writer = Mp3Writer.new,
|
15
|
+
parser = Parser.new)
|
16
|
+
@connector = connector
|
17
|
+
@parser = parser
|
18
|
+
@query_builder = query_builder
|
19
|
+
@mp3writer = mp3writer
|
20
|
+
end
|
21
|
+
|
22
|
+
def save(name, text)
|
23
|
+
sentences = @parser.sentences text
|
24
|
+
queries = @query_builder.generate_from *sentences
|
25
|
+
contents = @connector.get_contents *queries
|
26
|
+
@mp3writer.save name, *contents
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.instantiate(params = {})
|
32
|
+
proxy = params[:proxy]
|
33
|
+
connection = proxy ? Net::HTTP::Proxy(proxy[:host], proxy[:port]) : Net::HTTP
|
34
|
+
lang = params[:lang] || :en
|
35
|
+
output = params[:output] || "out"
|
36
|
+
Client.new(Connector.new(connection), QueryBuilder.new(lang), Mp3Writer.new(output))
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
module GoogleTts
|
4
|
+
|
5
|
+
class Connector
|
6
|
+
|
7
|
+
def initialize(http_connection = Net::HTTP)
|
8
|
+
@connection = http_connection
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_contents(*paths)
|
12
|
+
begin
|
13
|
+
http = @connection.start('translate.google.com')
|
14
|
+
|
15
|
+
result = paths.map do |path|
|
16
|
+
response = http.get path
|
17
|
+
raise_error(response) if response.code != "200"
|
18
|
+
response.body
|
19
|
+
end
|
20
|
+
|
21
|
+
result
|
22
|
+
|
23
|
+
ensure
|
24
|
+
http.finish
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def raise_error(response)
|
30
|
+
raise "Error: response code #{response.code}"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module GoogleTts
|
2
|
+
|
3
|
+
class Mp3Writer
|
4
|
+
|
5
|
+
def initialize(dir = "tmp/mp3")
|
6
|
+
FileUtils.mkdir_p dir
|
7
|
+
@dir = dir
|
8
|
+
end
|
9
|
+
|
10
|
+
def save(file_name, *contents)
|
11
|
+
file_path = "#{@dir}/#{file_name}.mp3"
|
12
|
+
File.open(file_path, "wb") do |f|
|
13
|
+
contents.each do |content|
|
14
|
+
f.write content
|
15
|
+
end
|
16
|
+
end
|
17
|
+
file_path
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require "uri"
|
2
|
+
|
3
|
+
module GoogleTts
|
4
|
+
|
5
|
+
class Parser
|
6
|
+
MAX_LENGTH = 100
|
7
|
+
SPACE = URI.escape(" ")
|
8
|
+
|
9
|
+
def paragraphs(text = "")
|
10
|
+
paragraphs = text.split(/(?<=[\.\?\!])/)
|
11
|
+
paragraphs.map do |p|
|
12
|
+
p.strip
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def sentences(text = "")
|
17
|
+
text = URI.escape(text)
|
18
|
+
return [text] if text.length < MAX_LENGTH
|
19
|
+
|
20
|
+
tokens = paragraphs(remove_extra_spaces(text))
|
21
|
+
tokens.flat_map do |token|
|
22
|
+
next_partial(token) {
|
23
|
+
comma_setences = token.split(',').flat_map do |subtoken|
|
24
|
+
subtoken = remove_extra_spaces("#{subtoken},")
|
25
|
+
next_partial(subtoken) {
|
26
|
+
accumulate(subtoken, SPACE)
|
27
|
+
}
|
28
|
+
end
|
29
|
+
comma_setences[-1] = custom_strip(comma_setences.last, ',')
|
30
|
+
comma_setences
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def bad_size?(text)
|
38
|
+
text.length >= MAX_LENGTH
|
39
|
+
end
|
40
|
+
|
41
|
+
def next_partial(txt, &partials)
|
42
|
+
bad_size?(txt) ? partials.call : txt
|
43
|
+
end
|
44
|
+
|
45
|
+
def accumulate(sentence, separator, &next_step)
|
46
|
+
partial = []
|
47
|
+
tmp = ''
|
48
|
+
sentence.split(separator).each do |a|
|
49
|
+
if bad_size? "#{tmp}#{a}"
|
50
|
+
partial << custom_strip(tmp)
|
51
|
+
tmp = ''
|
52
|
+
end
|
53
|
+
tmp += "#{a}#{separator}"
|
54
|
+
end
|
55
|
+
partial << custom_strip(tmp)
|
56
|
+
partial
|
57
|
+
end
|
58
|
+
|
59
|
+
def custom_strip(txt, strip_out = SPACE)
|
60
|
+
txt.gsub(/^*#{strip_out}$/, '').strip
|
61
|
+
end
|
62
|
+
|
63
|
+
def remove_extra_spaces(txt)
|
64
|
+
txt.gsub(/[ ]+/, " ")
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module GoogleTts
|
2
|
+
|
3
|
+
class QueryBuilder
|
4
|
+
|
5
|
+
def initialize(lang = :pt)
|
6
|
+
@lang = lang
|
7
|
+
end
|
8
|
+
|
9
|
+
def generate_from(*sentences)
|
10
|
+
sentences.each_with_index.map do |sentence, index|
|
11
|
+
"/translate_tts?ie=UTF-8&tl=#{@lang.to_s}&q=#{sentence}&textlen=#{sentence.length}&idx=#{index}&total=#{sentences.length}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
O projeto é de autoria do arquiteto João Batista Giovenale, então professor da Academia de Belas Artes - São Lucas - de Roma, e membro da Comissão de Arte Sacra da Basílica de São Pedro. O arquiteto era notável por trabalhos executados em Roma, tais como a cripta da Igreja de Santa Cecília e o novo Museu Petriano, destinado a conservar as antiguidades e objetos de arte da antiga basílica Constantiniana, além de outras obras de restauração de templos romanos. A história da fundação da Paróquia Nossa Senhora Madre de Deus está intimamente relacionada com a origem da cidade de Porto Alegre. No tempo em que a futura cidade era apenas o porto de Viamão, naquela época a capital, com a chegada dos colonos açorianos e com a presença alguns soldados paulistas à espera de seguir caminho para as Missões, entendeu-se necessário prover para eles serviços religiosos, sendo designado o padre carmelita Frei Faustino de Santo Antônio de Santo Alberto e Silva, conforme reza a Provisão de 25 de março de 1753. Ergueu-se então uma modesta capela sob a invocação de São Francisco das Chagas, dando-se o nome de São Francisco do Porto dos Casais à povoação que começava a se formar. Esta primitiva capela foi construída junto à Rua da Praia, não passando de um rancho de pau-a-pique. Em 1755 Frei Faustino foi transferido para Triunfo, deixando o povo novamente dependente do vigário da paróquia de Nossa Senhora da Conceição de Viamão que, devido à grande extensão, não conseguia dar cuidado às gentes fixadas no Porto dos Casais. Assim, Dom Antônio do Desterro, bispo do Rio de Janeiro (cuja diocese se estendia até as terras gaúchas), a pedido do Governador da Capitania Marcelino de Figueiredo, criou a 26 de março de 1772 a Freguesia de São Francisco do Porto dos Casais, separando-a de Viamão e designando como vigário o padre José Gomes de Faria. Na mesma provisão também solicitava que se erguesse uma nova igreja que pudesse servir de matriz, pois ali não se achava ainda igreja que pudesse servir como tal. Em 18 de janeiro de 1773, o bispo do Rio de Janeiro mudou o orago da recente freguesia de São Francisco para Nossa Senhora Madre de Deus. Todo o território de Porto Alegre pertenceu à paróquia Madre de Deus até 1832, quando foram criadas as paróquias de Nossa Senhora das Dores e Nossa Senhora do Rosário. Com a transferência da capital do estado de Viamão para o Porto dos Casais, patenteou-se a necessidade de se construir uma nova igreja, com dimensões correspondentes ao novo status da cidade. Em 12 de julho de 1772, o vice-rei mandou que se demarcasse um terreno para a construção. O projeto, em estilo barroco, com um corpo de três aberturas ladeado de dois campanários, veio pronto do Rio de Janeiro em 1774. Em junho deste ano as primeiras providências para a construção foram tomadas pela Confraria do Santíssimo Sacramento e pela Irmandade de Nossa Senhora da Madre de Deus, ambas dirigidas pelo padre Faria e pelo governador Marcelino de Figueiredo. As obras só iniciaram efetivamente em fins de 1779. O corpo da igreja estava concluído em 1794, mas em 1820, como relatou Saint-Hilaire, as torres ainda estavam inacabadas. Tal estado de incompletude perdurou até a administração do Conde de Caxias, que mandou em 1846 terminar a torre esquerda, rebocar o externo e consertar o telhado que já se estava arruinando. Desde 1841, a Irmandade do Santíssimo Sacramento, mesmo com o templo inacabado, já se queixava de suas dimensões acanhadas e condições degradadas, desejando erguer outra igreja maior. A 7 de maio de 1848, o Papa Pio IX, pela bula Ad Oves Dominicas Rite Pascendas, criou a diocese de São Pedro do Rio Grande do Sul, designando na mesma Bula como catedral provisória a igreja Matriz de Nossa Senhora Madre de Deus. A idéia de uma nova construção foi acalentada pelos bispos da época, mas somente com Dom João Becker iniciou-se o estudo para a substituição da velha Matriz. A partir de 1915 foi lançado um concurso para escolha da nova planta, onde foram premiados os desenhos de Theo Wiedersphan e Johan Ole Baade, e tendo como vencedor o do arquiteto Jesús Maria Corona, que elaborou um projeto para uma vasta catedral neogótica com cinco naves e torres de 72 m de altura, com uma cripta em estilo manuelino. O projeto encontrou críticas de todos os lados, especialmente da Escola de Engenharia, o que levou ao seu abandono. O fato de seu autor ter fama de anarquista também não ajudou. Os outros dois premiados, Wiederspahn e Baade, eram ambos protestantes, o que pode ter gerado resistências dentro da Igreja Católica. Assim, nenhum era aproveitável, e o Arcebispo remeteu os projetos para Roma e solicitou ao arquiteto da Cúria Romana, Giovanni Battista Giovenale, que procedesse a uma revisão. Giovenalle era um respeitado arquiteto, então professor da Academia de Belas Artes São Lucas de Roma, além de membro da Comissão de Arte Sacra da Basílica de São Pedro. Apesar de o crédito pela obra ter ficado com Giovenalle, Günter Weimer afirma que sua revisão foi sumária, usando largamente o projeto apresentado por Wiederspahn, e entregando a maior parte do trabalho técnico para o tcheco Josef Hruby. Em 3 de maio de 1920 foram iniciadas as obras de terraplanagem e demolição da Matriz, e a pedra fundamental do novo templo foi lançada a 7 de agosto de 1921, sendo a cripta inaugurada em 20 de março de 1929, para onde foram transferidos os serviços religiosos, possibilitando a demolição final da velha construção e a continuidade das novas obras. Somente cerca de vinte anos depois é que as celebrações puderam deixar a cripta e serem realizadas na nave da catedral, já sob administração de Dom Vicente Scherer. A completude das torres levou outros vinte anos, inauguradas em 1971, sendo que a cúpula foi terminada no ano seguinte. Foi apenas em 1986, já no arcebispado de Dom Cláudio Colling, que a catedral pôde ser consagrada e dada como concluída, embora recentemente a cúpula tenha sido reformada, recebendo uma cobertura de bronze. Conservando no desenho geral da fachada a simplicidade e firmeza das linhas que caracterizam a arte da primeira Renascença, foi criado um movimento mais dinâmico pelo contraste dos três corpos salientes (frontispício e torres) com intervalos na altura dos terraços sobre as naves laterais, e dando-lhe também profundidade e claro-escuro, graças aos grandes vãos do pórtico. A cúpula possui 65 metros de altura do nível da praça, com um diâmetro interno de quase 18 metros. Na fachada se destacam os mosaicos do frontispício, executados pela Academia de Mosaicos do Vaticano, representando a história da Igreja no estado. Mostram a Padroeira Maria, a Mãe de Deus, ao centro, ladeada por São Francisco de Assis, o antigo orago, e os mártires jesuítas Roque Gonzales de Santa Cruz, Afonso Rodrigues e Juan del Castillo. Do outro lado estão São Pedro, Padroeiro do Rio Grande do Sul, o Papa Pio IX, criador da diocese, e Santa Teresa de Ávila, protetora da fortaleza que existia no extremo sul do estado. Painéis laterais representam as cenas da Anunciação e da Crucificação, tendo o Pantocrator acima, no tímpano. O interior possui uma notável majestade e elegância de proporções, e sua arquitetura forma atraentes padrões geométricos, intensificados pelos efeitos de iluminação interna. O altar-mor possui uma bela estátua barroca da Virgem com o Menino Jesus aos braços, entronizada contra uma pintura mural de Aldo Locatelli. Nos braços do cruzeiro foram instalados dois enormes vitrais, um representando São Miguel, e outro Santa Teresa. A diferença de nível entre a Praça Marechal Deodoro e o pátio superior do antigo seminário, que fica atrás, sendo cerca de oito metros, permitiu a construção de uma grande cripta. Idealizando sua parte externa, Giovenale utilizou elementos decorativos arcaicos, semelhantes a alguns empregados nas antigas edificações dos incas do Peru, revestindo as paredes com enormes pedras de granito rústico e coroando o conjunto com oito gigantescas carrancas de índios. Atualmente está sendo desenvolvido o projeto da construção de um novo Presbitério em estilo Moderno que infelizmente irá desfigurar o projeto original da Catedral que é uma das mais bem preservadas do País. Além de contrastante com a arquitetura original, o novo presbitério acabará com a harmonia arquitetônica do templo devido ao contraste entre os estilos moderno e neoclássico. Está em processo um abaixo-assinado em nome da comunidade católica porto-alegrense a ser encaminhado a Cúria Metropolitana visando impedir que o clero danifique este grande e belo patrimônio histórico que pertence ao povo gaúcho.
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe GoogleTts::Connector do
|
5
|
+
let(:connection) { double(Net::HTTP) }
|
6
|
+
let(:http) { double(Net::HTTP) }
|
7
|
+
let(:response) { double(Net::HTTPResponse) }
|
8
|
+
|
9
|
+
subject do
|
10
|
+
GoogleTts::Connector.new connection
|
11
|
+
end
|
12
|
+
|
13
|
+
before do
|
14
|
+
connection.should_receive(:start).with("translate.google.com").and_return(http)
|
15
|
+
http.should_receive(:finish)
|
16
|
+
allow(response).to receive(:body).and_return(Object.new)
|
17
|
+
allow(response).to receive(:code).and_return("200")
|
18
|
+
end
|
19
|
+
|
20
|
+
context '#get' do
|
21
|
+
|
22
|
+
it 'should connect to google translate' do
|
23
|
+
http.should_receive(:get).exactly(2).times.and_return(response)
|
24
|
+
subject.get_contents '/123', '/abc'
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should return an array of response bodies' do
|
28
|
+
http.should_receive(:get).exactly(3).times.and_return(response)
|
29
|
+
result = subject.get_contents '/123', '/abc', '/xyz'
|
30
|
+
expect(result).to eq([ response.body, response.body, response.body ])
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'fails on a bad response' do
|
34
|
+
response.should_receive(:code).and_return("400")
|
35
|
+
http.should_receive(:get).and_return(response)
|
36
|
+
expect {
|
37
|
+
subject.get_contents '/123'
|
38
|
+
}.to raise_error
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'fails on a bad connection' do
|
42
|
+
http.should_receive(:get).and_raise("exception")
|
43
|
+
expect {
|
44
|
+
subject.get_contents '/123'
|
45
|
+
}.to raise_error
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe GoogleTts::Mp3Writer do
|
5
|
+
MP3_DIR = "tmp/mp3"
|
6
|
+
|
7
|
+
subject do
|
8
|
+
GoogleTts::Mp3Writer.new MP3_DIR
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
FileUtils.rm_r MP3_DIR
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should create dir and save' do
|
16
|
+
subject.save 'name','content'
|
17
|
+
expect(File.exists?("#{MP3_DIR}/name.mp3")).to be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should return file path' do
|
21
|
+
file_path = subject.save 'name2', 'content'
|
22
|
+
expect(file_path).to eq("#{MP3_DIR}/name2.mp3")
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'create file with the matching returned file path' do
|
26
|
+
path = subject.save 'name','content'
|
27
|
+
expect(File.exists?(path)).to be_true
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
describe GoogleTts::Parser do
|
6
|
+
before(:all) do
|
7
|
+
txt = File.open("spec/fixtures/big_text.txt").read
|
8
|
+
@txt = txt.gsub(/[ ]+/, " ")
|
9
|
+
end
|
10
|
+
|
11
|
+
it "respsect this interface" do
|
12
|
+
expect(subject).to respond_to(:sentences)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should split sentences by dots' do
|
16
|
+
result = subject.paragraphs "Ola! Tudo bem? - Tudo bem."
|
17
|
+
expect(result.size).to eq(3)
|
18
|
+
expect(result[0]).to include('!')
|
19
|
+
expect(result[1]).to include('?')
|
20
|
+
expect(result[2]).to include('.')
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should split a big sentence' do
|
24
|
+
chop_size_by_tokenizer = subject.paragraphs(@txt).size
|
25
|
+
result = subject.sentences @txt
|
26
|
+
expect(result.size).to be > chop_size_by_tokenizer
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should split sentences no bigger than 100 chars each' do
|
30
|
+
result = subject.sentences @txt
|
31
|
+
result.each do |r|
|
32
|
+
expect(r.length ).to be <= 100
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should split sentences and keep all the content' do
|
37
|
+
result = subject.sentences @txt
|
38
|
+
original_escaped = readable(URI.escape(@txt))
|
39
|
+
result_escaped = readable(result.join(" "))
|
40
|
+
|
41
|
+
expect(result_escaped).to eq(original_escaped)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should split big sentence in commas or minor pieces' do
|
45
|
+
text = "O projeto é de autoria do arquiteto João Batista Giovenale, então professor da Academia de Belas Artes - São Lucas - de Roma, e membro da Comissão de Arte Sacra da Basílica de São Pedro."
|
46
|
+
result = subject.sentences text
|
47
|
+
expect(result.length).to be > (text.count(',') + 1)
|
48
|
+
expect(result.length).to be < 10
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should keep whole paragraph is less then 100 chars' do
|
52
|
+
result = subject.sentences 'Ola. tudo bem?'
|
53
|
+
expect(result.length).to eq(1)
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def readable(t)
|
59
|
+
t.gsub("%20"," ").gsub(/[ ]+/, " ").gsub("%0A", "").strip
|
60
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
describe GoogleTts::QueryBuilder do
|
6
|
+
|
7
|
+
subject do
|
8
|
+
GoogleTts::QueryBuilder.new :pt
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'builds a query o sentence' do
|
12
|
+
sentence = URI.escape "uma pequena frase"
|
13
|
+
query = subject.generate_from sentence
|
14
|
+
|
15
|
+
expect(query).to include("/translate_tts?ie=UTF-8&tl=#{:pt.to_s}&q=#{sentence}&textlen=#{sentence.length}&idx=0&total=1")
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe GoogleTts do
|
5
|
+
|
6
|
+
context GoogleTts::Client do
|
7
|
+
DIR = "out"
|
8
|
+
|
9
|
+
subject do
|
10
|
+
GoogleTts.instantiate({ :output => DIR, :lang => :pt })
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'save a mp3' do
|
14
|
+
subject.save "file1", "Olá, tudo bem com você?"
|
15
|
+
expect(File.exists?("out/file1.mp3")).to be_true
|
16
|
+
end
|
17
|
+
|
18
|
+
after do
|
19
|
+
FileUtils.rm_r "out"
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
context '#instantiate' do
|
26
|
+
|
27
|
+
it 'should fall back to defaults' do
|
28
|
+
expect(GoogleTts.instantiate).to_not be_nil
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spork'
|
3
|
+
#uncomment the following line to use spork with the debugger
|
4
|
+
#require 'spork/ext/ruby-debug'
|
5
|
+
|
6
|
+
Spork.prefork do
|
7
|
+
require 'rspec'
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
11
|
+
config.run_all_when_everything_filtered = true
|
12
|
+
config.filter_run :focus
|
13
|
+
config.order = 'random'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Spork.each_run do
|
18
|
+
# automatically include all the /lib files
|
19
|
+
lib_folder = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
20
|
+
Dir["#{lib_folder}/**/*.rb"].each do |file|
|
21
|
+
require file
|
22
|
+
end
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: google_tts2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Filipe Esperandio
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-11-30 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: Google TTS client which accepts large text input, parses and split into
|
31
|
+
multiple requests. Saves a single mp3 matching the input text.
|
32
|
+
email:
|
33
|
+
- filipesperandio@gmail.com
|
34
|
+
executables: []
|
35
|
+
extensions: []
|
36
|
+
extra_rdoc_files: []
|
37
|
+
files:
|
38
|
+
- .gitignore
|
39
|
+
- Gemfile
|
40
|
+
- Gemfile.lock
|
41
|
+
- Guardfile
|
42
|
+
- LICENSE
|
43
|
+
- README.md
|
44
|
+
- Rakefile
|
45
|
+
- lib/google_tts.rb
|
46
|
+
- lib/google_tts/connector.rb
|
47
|
+
- lib/google_tts/mp3writer.rb
|
48
|
+
- lib/google_tts/parser.rb
|
49
|
+
- lib/google_tts/query_builder.rb
|
50
|
+
- spec/fixtures/big_text.txt
|
51
|
+
- spec/lib/google_tts/connector_spec.rb
|
52
|
+
- spec/lib/google_tts/mp3writer_spec.rb
|
53
|
+
- spec/lib/google_tts/parser_spec.rb
|
54
|
+
- spec/lib/google_tts/query_builder_spec.rb
|
55
|
+
- spec/lib/google_tts_spec.rb
|
56
|
+
- spec/spec_helper.rb
|
57
|
+
homepage: http://github.com/filipesperandio/google_tts2
|
58
|
+
licenses: []
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
requirements: []
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 1.8.23
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: Google TTS client
|
81
|
+
test_files:
|
82
|
+
- spec/fixtures/big_text.txt
|
83
|
+
- spec/lib/google_tts/connector_spec.rb
|
84
|
+
- spec/lib/google_tts/mp3writer_spec.rb
|
85
|
+
- spec/lib/google_tts/parser_spec.rb
|
86
|
+
- spec/lib/google_tts/query_builder_spec.rb
|
87
|
+
- spec/lib/google_tts_spec.rb
|
88
|
+
- spec/spec_helper.rb
|