- NEU: Voice-To-Text! "Übersetzt" Sprachnachrichten in Text (wit.ai Server API-Key muss eingetragen werden!)

- POST-Requests mit Dateien sind nun möglich
This commit is contained in:
Andreas Bielawski 2016-08-27 23:31:53 +02:00
parent 472eaa30ea
commit 4014ec0550
2 changed files with 81 additions and 2 deletions

View File

@ -0,0 +1,61 @@
local vtt = {}
vtt.triggers = {
'/nil'
}
local apikey = cred_data.witai_apikey
function vtt:pre_process(msg, config)
if not msg.voice then return msg end -- Ignore
local mime_type = msg.voice.mime_type
if mime_type ~= 'audio/ogg' then return msg end -- We only want to transcript voice messages
local file_id = msg.voice.file_id
local file_size = msg.voice.file_size
if file_size > 19922944 then
print('File is over 20 MB - can\'t download :(')
return msg
end
utilities.send_typing(msg.chat.id, 'typing')
-- Saving file to the Telegram Cloud
local request = bindings.request('getFile', {
file_id = file_id
} )
local download_url = 'https://api.telegram.org/file/bot'..config.bot_api_key..'/'..request.result.file_path
local ogg_file_name = file_id..'.oga'
local ogg_file = download_to_file(download_url, ogg_file_name)
-- Convert to MP3
run_command('ffmpeg -loglevel panic -i /tmp/'..ogg_file_name..' -ac 1 -y /tmp/'..file_id..'.mp3')
os.remove('/tmp/'..ogg_file_name)
local mp3_file = '/tmp/'..file_id..'.mp3'
-- Voice-To-Text via wit.ai
local headers = {
["Content-Type"] = "audio/mpeg3",
Authorization = "Bearer "..apikey
}
local data = post_petition('https://api.wit.ai/speech?v=20160526', io.open(mp3_file, 'r'), headers)
os.remove(mp3_file)
if not data then
return msg
end
if not data._text then
utilities.send_reply(msg, 'Keine Stimme zu hören!')
return
end
utilities.send_reply(msg, data._text)
return msg
end
function vtt:action(msg)
end
return vtt

View File

@ -450,6 +450,15 @@ function utilities.save_data(filename, data)
f:close() f:close()
end end
-- Returns file size as Integer
-- See: https://www.lua.org/pil/21.3.html
function get_file_size(file)
local current = file:seek() -- get current position
local size = file:seek("end") -- get file size
file:seek("set", current) -- restore position
return tonumber(size)
end
-- Gets coordinates for a location. Used by gMaps.lua, time.lua, weather.lua. -- Gets coordinates for a location. Used by gMaps.lua, time.lua, weather.lua.
function utilities.get_coords(input, config) function utilities.get_coords(input, config)
local url = 'https://maps.googleapis.com/maps/api/geocode/json?address='..URL.escape(input)..'&language=de' local url = 'https://maps.googleapis.com/maps/api/geocode/json?address='..URL.escape(input)..'&language=de'
@ -723,6 +732,10 @@ function is_service_msg(msg)
return var return var
end end
-- Make a POST request
-- URL = obvious
-- Arguments = Things, that go into the body. If sending a file, use 'io.open('path/to/file', "r")'
-- Headers = Header table. If not set, we will set a few!
function post_petition(url, arguments, headers) function post_petition(url, arguments, headers)
local url, h = string.gsub(url, "http://", "") local url, h = string.gsub(url, "http://", "")
local url, hs = string.gsub(url, "https://", "") local url, hs = string.gsub(url, "https://", "")
@ -749,8 +762,13 @@ function post_petition(url, arguments, headers)
request_constructor.headers["X-Accept"] = "application/json" request_constructor.headers["X-Accept"] = "application/json"
request_constructor.headers["Accept"] = "application/json" request_constructor.headers["Accept"] = "application/json"
end end
request_constructor.headers["Content-Length"] = tostring(#source) if type(arguments) == 'userdata' then
request_constructor.source = ltn12.source.string(source) request_constructor.headers["Content-Length"] = get_file_size(source)
request_constructor.source = ltn12.source.file(source)
else
request_constructor.headers["Content-Length"] = tostring(#source)
request_constructor.source = ltn12.source.string(source)
end
if post_prot == "http" then if post_prot == "http" then
ok, response_code, response_headers, response_status_line = http.request(request_constructor) ok, response_code, response_headers, response_status_line = http.request(request_constructor)