view src/tts.mp3.luan @ 26:d3f5448743bf

add doc links
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 01 Aug 2025 17:12:03 -0600
parents f5425a3c1898
children 1e7d855afde3
line wrap: on
line source

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"


-- https://learn.microsoft.com/en-us/azure/ai-services/speech-service/index-text-to-speech

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 lang = Http.request.parameters.lang or error()
	local text = Http.request.parameters.text or error()
	local input = text_to_speech(lang,text)
	Http.response.binary_writer().write_from(input)
end