-
Notifications
You must be signed in to change notification settings - Fork 0
/
cerevoice.rb
70 lines (59 loc) · 2.02 KB
/
cerevoice.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# TODO: gem-ify this separately
require 'net/http'
require 'xmlsimple'
require 'digest'
class CereVoice
REST_API_URL = "https://cerevoice.com/rest/rest_1_1.php"
def initialize(userid, password, cache_dir)
@userid = userid
@password = password
@cache_dir = cache_dir
end
def render_speech(text, voice = "Hannah")
text.strip!
text_hash = Digest::MD5.hexdigest text.downcase
cache_file = "#{@cache_dir}/#{text_hash}.mp3"
# if the file is already cached, return that rather than re-rendering
if File.exist?(cache_file) then
puts "Using cached speech for #{text}"
return cache_file
end
# ask cerevoice to render speech and get a URL for it
cv_url = get_cv_speech(text, voice)
# get the file into the cache
uri = URI.parse(cv_url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
File.open(cache_file, 'w') do |f|
http.get(uri.path) do |str|
f.write str
end
end
cache_file
end
# use CereVoice Cloud to render text into speech and return a URL to the sound file
def get_cv_speech(text, voice)
puts "Rendering '#{text}' in voice #{voice}"
# build the XML REST request
request = {
"accountID" => [@userid],
"password" => [@password],
"audioFormat" => ["mp3"],
"voice" => [voice],
"text" => [text]
}
request_xml = XmlSimple.xml_out(request, {"rootName" => "speakExtended"})
# send the request as a POST to CereVoice
uri = URI(REST_API_URL)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http_response = http.post(uri.path, request_xml, {"Content-type" => "text/xml"})
# parse out the resulting URL and return it
response = XmlSimple.xml_in(http_response.body)
if(response["resultCode"][0].to_i != 1) then
puts "Failed to generate speech, error code was #{response["resultCode"][0]} (#{response["resultDescription"][0]})"
return nil
end
response["fileUrl"][0]
end
end