class Txt2Speech::Speech

Constants

GOOGLE_TRANSLATE_URL

Attributes

lang[RW]
text[RW]

Public Class Methods

load(file_path, lang = 'en') click to toggle source
# File lib/txt2speech/speech.rb, line 14
def self.load(file_path, lang = 'en')
  f = File.open(file_path)
  new f.read.encode('UTF-16be', invalid: :replace, replace: '?').encode('UTF-8'), lang
end
new(text, lang = 'en') click to toggle source
# File lib/txt2speech/speech.rb, line 9
def initialize(text, lang = 'en')
  @text = text
  @lang = lang
end

Public Instance Methods

save(file_path) click to toggle source
# File lib/txt2speech/speech.rb, line 19
def save(file_path)
  uri = URI(GOOGLE_TRANSLATE_URL)

  response = []

  sentences = text.split(/[,.\r\n]/i)
  sentences.reject!(&:empty?)
  sentences.map! { |t| divide(t.strip) }.flatten!

  sentences.each_with_index do |q, _idx|
    uri.query = URI.encode_www_form(
      ie: 'UTF-8',
      q: q,
      tl: lang,
      total: sentences.length,
      idx: 0,
      textlen: q.length,
      client: 'tw-ob',
      prev: 'input'
    )

    res = Net::HTTP.get_response(uri)

    next unless res.is_a?(Net::HTTPSuccess)

    response << res.body.force_encoding(Encoding::UTF_8)
  end

  File.open(file_path, 'wb') do |f|
    f.write response.join
    return f.path
  end
end

Private Instance Methods

divide(text) click to toggle source
# File lib/txt2speech/speech.rb, line 55
def divide(text)
  return text if text.length < 150

  attempts = text.length / 150.0
  starts = 0
  arr = []

  attempts.ceil.times do
    ends = starts + 150
    arr << text[starts...ends]
    starts = ends
  end

  arr
end