rev_ai.rb

 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.to_s
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