espeak-ruby 1.0.4 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8c33c7798b51552e36abbf539dfeaf35f5301514
4
- data.tar.gz: a07eaa1a0d4260c1068d9ea419e79f6288ab1c19
2
+ SHA256:
3
+ metadata.gz: 9d5971c82e6e1b6f3aee1178a9c92cea060a643daa57bc606b88498ce7f17e1e
4
+ data.tar.gz: f668512d5fdb406c28f326d8c0bcc6a22472baf80ca024aa4612bb666abdaa07
5
5
  SHA512:
6
- metadata.gz: 085cd3f429760d8a7e6d14a61ff829b35d359ec6947fc719abed96d148a52141257e9a0d31c594b58f58739d0a112e9e67b42e62ddfbe81c58c55bdcb3b77b8f
7
- data.tar.gz: 7ff610fb5401de34f86da41eca76fc528ca0ecbf252a4c2aa338c35187fe01da40e56f6681e96a796b24f5f07bd1dcd131e5e411c5aef62f84319bd71f4e1cac
6
+ metadata.gz: f644bde0b8ebe76d934c170eb9f8a2b4705935d24c09011978bbe9d7c0b5ec3eba85913169d2d0e72fb3bef8b747f4dc3a1f1822c865e4446165681f8d1d1e6e
7
+ data.tar.gz: c973d3d750fef73c8c62080d4b59eccbddfc4580378f81ae062f9b966b0bef810c32340f55049efffecf4bff65c36029fb1e8089b6f80ecff265072c432fc6c8
data/README.md CHANGED
@@ -1,11 +1,8 @@
1
- espeak-ruby
2
- ===========
1
+ # espeak-ruby
3
2
 
4
- espeak-ruby is a small Ruby API for utilizing [espeak](http://espeak.sourceforge.net) and [lame](http://lame.sourceforge.net/) to create Text-To-Speech mp3 files. It can also just speak (without saving).
5
- See the [live demo](http://rors.org/demos/espeak-ruby).
3
+ espeak-ruby is a small Ruby API for utilizing [espeak](http://espeak.sourceforge.net) and [lame](http://lame.sourceforge.net/) to create Text-To-Speech mp3 files or just speak (without saving). See [live demo](https://espeak.rors.org/).
6
4
 
7
- Install
8
- -------
5
+ ## Install
9
6
 
10
7
  Add _espeak-ruby_ to Gemfile
11
8
 
@@ -13,43 +10,34 @@ Add _espeak-ruby_ to Gemfile
13
10
  gem "espeak-ruby", require: "espeak"
14
11
  ```
15
12
 
16
- Examples
17
- --------
18
-
19
- First you need to include ESpeak module to access espeak API
20
-
21
- ```ruby
22
- include ESpeak
23
- ```
24
-
25
- Then use it like this:
13
+ ## Examples
26
14
 
27
15
  ```ruby
28
16
  # Speaks "YO!"
29
- speech = Speech.new("YO!")
17
+ speech = ESpeak::Speech.new("YO!")
30
18
  speech.speak # invokes espeak
31
19
 
32
20
  # Creates hello-de.mp3 file
33
- speech = Speech.new("Hallo Welt", voice: "de")
21
+ speech = ESpeak::Speech.new("Hallo Welt", voice: "de")
34
22
  speech.save("hello-de.mp3") # invokes espeak + lame
35
23
 
36
24
  # Lists voices
37
- Voice.all.map { |v| v.language } # ["af", "bs", "ca", "cs", "cy", "da", "de", "el", "en", "en-sc", "en-uk", "en-uk-north", "en-uk-rp", "en-uk-wmids", "en-us", "en-wi", "eo", "es", "es-la", "fi", "fr", "fr-be", "grc", "hi", "hr", "hu", "hy", "hy", "id", "is", "it", "jbo", "ka", "kn", "ku", "la", "lv", "mk", "ml", "nci", "nl", "no", "pap", "pl", "pt", "pt-pt", "ro", "ru", "sk", "sq", "sr", "sv", "sw", "ta", "tr", "vi", "zh", "zh-yue"]
25
+ ESpeak::Voice.all.map { |v| v.language } # ["af", "bs", "ca", "cs", "cy", "da", "de", "el", "en", "en-sc", "en-uk", "en-uk-north", "en-uk-rp", "en-uk-wmids", "en-us", "en-wi", "eo", "es", "es-la", "fi", "fr", "fr-be", "grc", "hi", "hr", "hu", "hy", "hy", "id", "is", "it", "jbo", "ka", "kn", "ku", "la", "lv", "mk", "ml", "nci", "nl", "no", "pap", "pl", "pt", "pt-pt", "ro", "ru", "sk", "sq", "sr", "sv", "sw", "ta", "tr", "vi", "zh", "zh-yue"]
38
26
 
39
27
  # Find particular voice
40
- Voice.find_by_language('en') #<ESpeak::Voice:0x007fe1d3806be8 @language="en", @name="default", @gender="M", @file="default">
28
+ ESpeak::Voice.find_by_language('en') #<ESpeak::Voice:0x007fe1d3806be8 @language="en", @name="default", @gender="M", @file="default">
41
29
  ```
42
30
 
43
- Features
44
- --------
31
+ ## Features
45
32
 
46
33
  Currently only subset of espeak features is supported.
47
34
 
48
35
  ```ruby
49
- :voice => 'en' # use voice file of this name from espeak-data/voices
50
- :pitch => 50 # pitch adjustment, 0 to 99
51
- :speed => 170 # speed in words per minute, 80 to 370
52
- :capital => 170 # increase emphasis (pitch) of capitalized words, 1 to 40 (for natural sound, can go higher)
36
+ :voice => 'en' # use voice file of this name from espeak-data/voices
37
+ :pitch => 50 # pitch adjustment, 0 to 99
38
+ :speed => 170 # speed in words per minute, 80 to 370
39
+ :capital => 170 # increase emphasis (pitch) of capitalized words, 1 to 40 (for natural sound, can go higher)
40
+ :amplitude => 150 # amplitude (volume) adjustment, 0 to 200
53
41
  ```
54
42
 
55
43
  These are default values, and they can be easily overridden:
@@ -58,37 +46,16 @@ These are default values, and they can be easily overridden:
58
46
  Speech.new("Zdravo svete", voice: "sr", pitch: 90, speed: 200).speak
59
47
  ```
60
48
 
61
- Requirements
62
- ------------
63
-
64
- * <http://espeak.sourceforge.net>
65
- * <http://lame.sourceforge.net>
66
-
67
- Related
68
- -------
49
+ ## Installing dependencies
69
50
 
70
- * [espeak-http](http://github.com/dejan/espeak-http) - Micro web app for Text-To-Speech conversion via HTTP powered by Ruby, Sinatra, lame, espeak and espeak-ruby
51
+ ### OS X
71
52
 
72
- Licence
73
- -------
53
+ brew install espeak lame
74
54
 
75
- Copyright (c) 2008 Dejan Simic
55
+ ### Ubuntu
76
56
 
77
- Permission is hereby granted, free of charge, to any person obtaining
78
- a copy of this software and associated documentation files (the
79
- "Software"), to deal in the Software without restriction, including
80
- without limitation the rights to use, copy, modify, merge, publish,
81
- distribute, sublicense, and/or sell copies of the Software, and to
82
- permit persons to whom the Software is furnished to do so, subject to
83
- the following conditions:
57
+ apt-get install espeak lame
84
58
 
85
- The above copyright notice and this permission notice shall be
86
- included in all copies or substantial portions of the Software.
59
+ ## Licence
87
60
 
88
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
89
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
90
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
91
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
92
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
93
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
94
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
61
+ espeak-ruby is released under the [MIT License](/MIT-LICENSE).
data/Rakefile CHANGED
@@ -1,12 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rake/testtask'
4
+ require 'rubocop/rake_task'
2
5
 
3
6
  desc 'Default: run tests'
4
- task :default => :test
7
+ task default: :test
5
8
 
6
9
  desc 'Test espeak-ruby'
7
- Rake::TestTask.new(:test) do |t|
8
- t.libs << "test"
10
+ Rake::TestTask.new(test: :rubocop) do |t|
11
+ t.libs << 'test'
9
12
  t.pattern = 'test/**/*_test.rb'
10
13
  t.verbose = true
11
14
  end
12
15
 
16
+ RuboCop::RakeTask.new
data/lib/espeak/speech.rb CHANGED
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ESpeak
4
+ # Speech represents an Text-To-Speech audio that can be played or saved to file
2
5
  class Speech
3
6
  attr_reader :options, :text
4
7
 
@@ -9,9 +12,10 @@ module ESpeak
9
12
  # :speed - speed in words per minute, 80 to 370
10
13
  # :capital - increase emphasis of capitalized letters by raising pitch by this amount
11
14
  # no range given in man but good range is 10-40 to start
15
+ # :amplitude - amplitude adjustment, 0 to 200
12
16
  # :quiet - remove printing to stdout. Affects only lame (default false)
13
17
  #
14
- def initialize(text, options={})
18
+ def initialize(text, options = {})
15
19
  @text = text
16
20
  @options = options
17
21
  end
@@ -19,9 +23,7 @@ module ESpeak
19
23
  # Speaks text
20
24
  #
21
25
  def speak
22
- IO.popen(espeak_command(command_options), 'r') do |process|
23
- process.read
24
- end
26
+ IO.popen(espeak_command(command_options), 'r', &:read)
25
27
  end
26
28
 
27
29
  # Generates mp3 file as a result of
@@ -40,7 +42,7 @@ module ESpeak
40
42
  # Returns mp3 file bytes as a result of
41
43
  # Text-To-Speech conversion.
42
44
  #
43
- def bytes()
45
+ def bytes
44
46
  speech = bytes_wav
45
47
  res = IO.popen(std_lame_command(command_options), 'r+') do |process|
46
48
  process.write(speech)
@@ -53,16 +55,14 @@ module ESpeak
53
55
  # Returns wav file bytes as a result of
54
56
  # Text-To-Speech conversion.
55
57
  #
56
- def bytes_wav()
57
- IO.popen(espeak_command(command_options, "--stdout"), 'r') do |process|
58
- process.read
59
- end
58
+ def bytes_wav
59
+ IO.popen(espeak_command(command_options, '--stdout'), 'r', &:read)
60
60
  end
61
61
 
62
62
  private
63
63
 
64
64
  def command_options
65
- default_options.merge(symbolize_keys(options))
65
+ default_options.merge(options.transform_keys(&:to_sym))
66
66
  end
67
67
 
68
68
  # Although espeak itself has default options
@@ -70,30 +70,25 @@ module ESpeak
70
70
  # command (with simple hash.merge)
71
71
  #
72
72
  def default_options
73
- { :voice => 'en',
74
- :pitch => 50,
75
- :speed => 170,
76
- :capital => 1,
77
- :quiet => true }
73
+ { voice: 'en',
74
+ pitch: 50,
75
+ speed: 170,
76
+ capital: 1,
77
+ amplitude: 100,
78
+ quiet: true }
78
79
  end
79
80
 
80
- def espeak_command(options, flags="")
81
- ['espeak', "#{@text}", "#{flags}", "-v#{options[:voice]}", "-p#{options[:pitch]}", "-k#{options[:capital]}", "-s#{options[:speed]}"]
81
+ def espeak_command(options, flags = '')
82
+ ['espeak', @text.to_s, flags.to_s, "-v#{options[:voice]}", "-p#{options[:pitch]}", "-k#{options[:capital]}",
83
+ "-s#{options[:speed]}", "-a#{options[:amplitude]}"]
82
84
  end
83
85
 
84
86
  def std_lame_command(options)
85
- lame_command("-", options)
87
+ lame_command('-', options)
86
88
  end
87
89
 
88
90
  def lame_command(filename, options)
89
- ['lame', '-V2', '-', "#{filename}", "#{'--quiet' if options[:quiet] == true}"]
90
- end
91
-
92
- def symbolize_keys(hash)
93
- hash.inject({}) do |options, (key, value)|
94
- options[(key.to_sym rescue key) || key] = value
95
- options
96
- end
91
+ ['lame', '-V2', '-', filename.to_s, ('--quiet' if options[:quiet] == true).to_s]
97
92
  end
98
93
  end
99
94
  end
data/lib/espeak/voice.rb CHANGED
@@ -1,8 +1,10 @@
1
- require 'csv'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module ESpeak
4
+ # A voice that will be used for `Speech`
4
5
  class Voice
5
6
  attr_reader :language, :name, :gender, :file
7
+
6
8
  def initialize(attributes)
7
9
  @language = attributes[:language]
8
10
  @name = attributes[:name]
@@ -12,18 +14,18 @@ module ESpeak
12
14
 
13
15
  def self.all
14
16
  voices = []
15
- CSV.parse(espeak_voices, headers: :first_row, col_sep: ' ') do |row|
16
- voices << Voice.new(language: row[1], gender: row[2], name: row[3], file: row[4] )
17
+ result = IO.popen('espeak --voices', &:read)
18
+ result.each_line do |line|
19
+ next unless line.start_with?(' ') # header
20
+
21
+ row = line.split
22
+ voices << Voice.new(language: row[1], gender: row[2], name: row[3], file: row[4])
17
23
  end
18
- voices
24
+ voices.freeze
19
25
  end
20
26
 
21
27
  def self.find_by_language(lang)
22
28
  all.find { |v| v.language == lang.to_s }
23
29
  end
24
-
25
- def self.espeak_voices
26
- `espeak --voices`
27
- end
28
30
  end
29
31
  end
data/lib/espeak.rb CHANGED
@@ -1,4 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ESpeak
2
4
  autoload :Speech, 'espeak/speech'
3
5
  autoload :Voice, 'espeak/voice'
4
6
  end
7
+
8
+ ESpeak::Voice.all
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
  require 'fileutils'
3
5
 
@@ -5,11 +7,10 @@ class SpeechTest < Test::Unit::TestCase
5
7
  include ESpeak
6
8
 
7
9
  def test_save
8
- FileUtils.rm_rf("test/tmp")
9
- FileUtils.mkdir_p("test/tmp")
10
- assert Speech.new("Hello!").save('test/tmp/test.mp3')
11
- assert File.exist?("test/tmp/test.mp3"), "Mp3 file not generated"
12
- FileUtils.rm_rf("test/tmp")
10
+ FileUtils.rm_rf('test/tmp')
11
+ FileUtils.mkdir_p('test/tmp')
12
+ assert Speech.new('Hello!').save('test/tmp/test.mp3')
13
+ assert File.exist?('test/tmp/test.mp3'), 'Mp3 file not generated'
14
+ FileUtils.rm_rf('test/tmp')
13
15
  end
14
16
  end
15
-
@@ -1,17 +1,14 @@
1
- require "test_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
2
4
 
3
5
  class VoiceTest < Test::Unit::TestCase
4
6
  include ESpeak
5
7
 
6
- def setup
7
- voices_file = File.read("test/fixtures/voices.txt")
8
- Voice.expects(:espeak_voices).returns(voices_file)
9
- end
10
-
11
8
  def test_all
12
9
  all_voices = Voice.all
13
- assert all_voices.size > 0
14
- assert %w(M F).include?(all_voices.first.gender)
10
+ assert all_voices.size.positive?
11
+ assert %w[M F].include?(all_voices.first.gender)
15
12
  end
16
13
 
17
14
  def test_find_by_language
data/test/test_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubygems'
2
4
  require 'test/unit'
3
- require 'mocha/setup'
4
5
  require 'espeak'
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: espeak-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dejan Simic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-01 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2022-09-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 13.0.6
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 13.0.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.23'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.23'
41
+ - !ruby/object:Gem::Dependency
42
+ name: test-unit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.5'
13
55
  description: espeak-ruby is small Ruby API for utilizing ‘espeak’ and ‘lame’ to create
14
56
  Text-To-Speech mp3 files
15
57
  email: desimic@gmail.com
@@ -24,12 +66,12 @@ files:
24
66
  - lib/espeak/voice.rb
25
67
  - test/cases/speech_test.rb
26
68
  - test/cases/voice_test.rb
27
- - test/fixtures/voices.txt
28
69
  - test/test_helper.rb
29
70
  homepage: https://github.com/dejan/espeak-ruby
30
71
  licenses:
31
72
  - MIT
32
- metadata: {}
73
+ metadata:
74
+ rubygems_mfa_required: 'true'
33
75
  post_install_message:
34
76
  rdoc_options: []
35
77
  require_paths:
@@ -38,15 +80,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
38
80
  requirements:
39
81
  - - ">="
40
82
  - !ruby/object:Gem::Version
41
- version: '0'
83
+ version: 2.5.0
42
84
  required_rubygems_version: !ruby/object:Gem::Requirement
43
85
  requirements:
44
86
  - - ">="
45
87
  - !ruby/object:Gem::Version
46
88
  version: '0'
47
89
  requirements: []
48
- rubyforge_project:
49
- rubygems_version: 2.4.5
90
+ rubygems_version: 3.0.3.1
50
91
  signing_key:
51
92
  specification_version: 4
52
93
  summary: espeak-ruby is small Ruby API for utilizing ‘espeak’ and ‘lame’ to create
@@ -1,60 +0,0 @@
1
- Pty Language Age/Gender VoiceName File Other Langs
2
- 5 af M afrikaans af
3
- 5 bs M bosnian bs
4
- 5 ca M catalan ca
5
- 5 cs M czech cs
6
- 5 cy M welsh-test cy
7
- 5 da M danish da
8
- 5 de M german de
9
- 5 el M greek el
10
- 5 en M default default
11
- 5 en-sc M en-scottish en/en-sc (en 4)
12
- 2 en-uk M english en/en (en 2)
13
- 5 en-uk-north M lancashire en/en-n (en-uk 3)
14
- 5 en-uk-rp M english_rp en/en-rp (en-uk 4)
15
- 5 en-uk-wmids M english_wmids en/en-wm
16
- 2 en-us M english-us en/en-us (en-r 5)(en 3)
17
- 5 en-wi M en-westindies en/en-wi (en-uk 4)
18
- 5 eo M esperanto eo
19
- 5 es M spanish es
20
- 5 es-la M spanish-latin-american es-la (es-mx 6)
21
- 5 fi M finnish fi
22
- 5 fr M french fr
23
- 5 fr-be M french (Belgium) fr-be
24
- 5 grc M greek-ancient test/grc
25
- 5 hi M hindi-test hi
26
- 5 hr M croatian hr (hbs 5)
27
- 5 hu M hungarian hu
28
- 5 hy M armenian hy
29
- 5 hy M armenian-west hy-west
30
- 5 id M indonesian-test id
31
- 5 is M icelandic-test is
32
- 5 it M italian it
33
- 5 jbo lojban test/jbo
34
- 5 ka georgian-test ka
35
- 5 kn kannada kn
36
- 5 ku M kurdish ku
37
- 5 la M latin la
38
- 5 lv M latvian lv
39
- 5 mk M macedonian-test mk
40
- 5 ml M malayalam ml
41
- 5 nci M nahuatl - classical test/nci
42
- 5 nl M dutch-test nl
43
- 5 no M norwegian no (nb 5)
44
- 5 pap papiamento-test test/pap
45
- 5 pl M polish pl
46
- 5 pt M brazil pt (pt-br 5)
47
- 5 pt-pt M portugal pt-pt
48
- 5 ro M romanian ro
49
- 5 ru M russian_test ru
50
- 5 sk M slovak sk
51
- 5 sq M albanian sq
52
- 5 sr M serbian sr
53
- 5 sv M swedish sv
54
- 5 sw M swahihi-test sw
55
- 5 ta M tamil ta
56
- 5 tr M turkish tr
57
- 5 vi M vietnam vi
58
- 5 zh M Mandarin zh
59
- 5 zh-yue M cantonese zh-yue (yue 5)(zhy 5)
60
-