62 lines
1.4 KiB
Ruby
62 lines
1.4 KiB
Ruby
require 'google/cloud/translate'
|
|
require 'pry-byebug'
|
|
class Speech
|
|
def initialize(params = {})
|
|
@speech = Google::Cloud::Speech.new
|
|
@credentials = params[:creds]
|
|
keyfile = ENV["TRANSLATION_CREDENTIALS"]
|
|
creds = Google::Cloud::Translate::Credentials.new(keyfile)
|
|
|
|
|
|
@translate = Google::Cloud::Translate.new(
|
|
project_id: ENV["PROJECT_ID"],
|
|
credentials: creds
|
|
)
|
|
|
|
@streaming_config =
|
|
{ config:
|
|
{
|
|
encoding: :LINEAR16,
|
|
sample_rate_hertz: 16000,
|
|
language_code: params[:language]
|
|
},
|
|
interim_results: true
|
|
}
|
|
|
|
@host_lang = params[:host_lang] || "en"
|
|
@recieve_lang = params[:recieve_lang] || "en"
|
|
|
|
@stream = @speech.streaming_recognize(@streaming_config)
|
|
@audio = ""
|
|
end
|
|
|
|
|
|
def write_to_stream(audio)
|
|
@stream.send(audio.split(",").map { |str| str.to_i }.pack("s<*"))
|
|
end
|
|
|
|
def stream
|
|
while true
|
|
break if @stream.stopped?
|
|
results = @stream.results
|
|
|
|
unless results.first.nil?
|
|
alt = results.first.alternatives
|
|
alt.each do |result|
|
|
puts "Original: #{result.transcript}"
|
|
puts "Translated: #{translate(result.transcript)}"
|
|
end
|
|
break
|
|
end
|
|
end
|
|
|
|
@stream.stop
|
|
@stream.wait_until_complete!
|
|
end
|
|
|
|
def translate(text)
|
|
trans = @translate.translate(text, from: @host_lang, to: @recieve_lang)
|
|
translation.text.gsub("'", "'")
|
|
end
|
|
end
|