1# frozen_string_literal: true
2
3require "em-http"
4require "em_promise"
5require "json"
6
7class RevAi
8 def initialize(token: CONFIG[:rev_ai_token])
9 @token = token
10 end
11
12 def stt(language, media_url, callback_url, **kwargs)
13 req(
14 :post,
15 "https://api.rev.ai/speechtotext/v1/jobs",
16 metadata: { media_url: media_url }.merge(kwargs).to_json,
17 source_config: { url: media_url },
18 notification_config: { url: callback_url },
19 remove_disfluencies: language == "en",
20 skip_diarization: true,
21 language: language
22 )
23 end
24
25 def stt_result(job)
26 job = job["job"]
27 req(
28 :get,
29 "https://api.rev.ai/speechtotext/v1/jobs/#{job['id']}/transcript",
30 accept: "text/plain"
31 ).then do |res|
32 text = res.response.split(" ", 3)[2].strip
33 job.merge("text" => text, "metadata" => JSON.parse(job["metadata"]))
34 end
35 end
36
37 def language_id(media_url, callback_url, **kwargs)
38 req(
39 :post,
40 "https://api.rev.ai/languageid/v1/jobs",
41 metadata: { media_url: media_url }.merge(kwargs).to_json,
42 source_config: { url: media_url },
43 notification_config: { url: callback_url }
44 )
45 end
46
47 def language_id_result(job)
48 job = job["job"]
49 req(
50 :get,
51 "https://api.rev.ai/languageid/v1/jobs/#{job['id']}/result"
52 ).then do |res|
53 json = JSON.parse(res.response)
54 job.merge(json).merge("metadata" => JSON.parse(job["metadata"]))
55 end
56 end
57
58 def req(m, url, accept: nil, **kwargs)
59 EM::HttpRequest.new(
60 url, tls: { verify_peer: true }
61 ).public_send(
62 "a#{m}",
63 head: {
64 "Authorization" => "Bearer #{@token}",
65 "Content-Type" => "application/json",
66 "Accept" => accept
67 }, body: kwargs.to_json
68 )
69 end
70end