google_tts2 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+ /db/*.sqlite3
15
+ .yardoc
16
+ _yardoc
17
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rake'
4
+
5
+ group :development do
6
+ gem 'rspec'
7
+ gem 'fuubar' # rspec style
8
+
9
+ gem 'guard-rspec'
10
+ gem 'spork', '~> 0.9'
11
+ gem 'guard-spork', '~> 1.4'
12
+ gem 'terminal-notifier-guard'
13
+ end
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
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env rake
2
+
3
+
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
@@ -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