diff src/tts.mp3.luan @ 12:2d4b3f003ec2

tts
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 24 Jul 2025 22:14:49 -0600
parents
children f5425a3c1898
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tts.mp3.luan	Thu Jul 24 22:14:49 2025 -0600
@@ -0,0 +1,39 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+local Parsers = require "luan:Parsers.luan"
+local xml_encode = Parsers.xml_encode or error()
+local Io = require "luan:Io.luan"
+local uri = Io.uri or error()
+local Http = require "luan:http/Http.luan"
+local Config = require "site:/private/Config.luan"
+
+
+local region = Config.azure_tts.region or error()
+local url = "https://"..region..".tts.speech.microsoft.com/cognitiveservices/v1"
+local headers = {
+	["Ocp-Apim-Subscription-Key"] = Config.azure_tts.key or error()
+	["Content-Type"] = "application/ssml+xml"
+	["X-Microsoft-OutputFormat"] = "audio-16khz-128kbitrate-mono-mp3"
+}
+
+local function text_to_speech(lang,text)
+	local xml = `%>
+<speak version='1.0' xml:lang='<%=lang%>'>
+    <voice name='en-US-BrandonMultilingualNeural'>
+<%=		xml_encode(text) %>
+    </voice>
+</speak>
+<%	`
+	local options = {
+		method = "POST"
+		headers = headers
+		content = xml
+	}
+	return uri(url,options)
+end
+
+return function()
+	local text = Http.request.parameters.text or error()
+	local input = text_to_speech("ja-JP",text)
+	Http.response.binary_writer().write_from(input)
+end