diff --git a/programs/chat.lua b/programs/chat.lua index 8a13b81..5e239d7 100644 --- a/programs/chat.lua +++ b/programs/chat.lua @@ -40,6 +40,7 @@ local function receiveLoop() elseif message.type == "chat" then print(message.username .. ": " .. message.content) speaker.play("notification") + speaker.playTTSFile(message.content) end write("> ") diff --git a/speaker-driver.lua b/speaker-driver.lua index 4349f05..d0c1a71 100644 --- a/speaker-driver.lua +++ b/speaker-driver.lua @@ -1,6 +1,7 @@ local speaker = peripheral.find("speaker") local dfpwm = require("cc.audio.dfpwm") - +local encoder = dfpwm.make_encoder() +local decoder = dfpwm.make_decoder() local sounds = { {name = "notification", file = "notification.dfpwm"} @@ -49,5 +50,49 @@ local function play(name) end return true end +---------------- -return { initialize = initialize, play = play } +local function getFileName(name) + local extension = ".dfpwm" + local fullFile = name .. extension + return fullFile +end + +local function randomFileName() + local name = "" + for i = 1, 12 do + name = name .. string.char(math.random(97, 122)) -- a–z + end + return name +end + +local function playSound(fileName) + local fileStream = getFileName(fileName) + local values = io.lines(fileStream, 16 * 1024) + for input in values do + local decoded = decoder(input) + while not speaker.playAudio(decoded, 3.0) do + os.pullEvent("speaker_audio_empty") + end + end +end + + + +local function playTTSFile(value) + local message = textutils.urlEncode(value) + local url = "http://api.astrocore.space/api/TextToSpeech?message=" .. message + local response, err = http.get { url = url, binary = true } + local name = randomFileName() + local fileName = name .. ".dfpwm" + + local fileData = response.readAll() + local file = fs.open(fileName,"w") + file.write(fileData) + file.close() + response.close() + playSound(name) + shell.execute("rm", fileName) +end + +return { initialize = initialize, play = play, playTTSFile = playTTSFile }