comparison 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
comparison
equal deleted inserted replaced
11:003a90ce72d7 12:2d4b3f003ec2
1 local Luan = require "luan:Luan.luan"
2 local error = Luan.error
3 local Parsers = require "luan:Parsers.luan"
4 local xml_encode = Parsers.xml_encode or error()
5 local Io = require "luan:Io.luan"
6 local uri = Io.uri or error()
7 local Http = require "luan:http/Http.luan"
8 local Config = require "site:/private/Config.luan"
9
10
11 local region = Config.azure_tts.region or error()
12 local url = "https://"..region..".tts.speech.microsoft.com/cognitiveservices/v1"
13 local headers = {
14 ["Ocp-Apim-Subscription-Key"] = Config.azure_tts.key or error()
15 ["Content-Type"] = "application/ssml+xml"
16 ["X-Microsoft-OutputFormat"] = "audio-16khz-128kbitrate-mono-mp3"
17 }
18
19 local function text_to_speech(lang,text)
20 local xml = `%>
21 <speak version='1.0' xml:lang='<%=lang%>'>
22 <voice name='en-US-BrandonMultilingualNeural'>
23 <%= xml_encode(text) %>
24 </voice>
25 </speak>
26 <% `
27 local options = {
28 method = "POST"
29 headers = headers
30 content = xml
31 }
32 return uri(url,options)
33 end
34
35 return function()
36 local text = Http.request.parameters.text or error()
37 local input = text_to_speech("ja-JP",text)
38 Http.response.binary_writer().write_from(input)
39 end