annotate src/tts.mp3.luan @ 31:1e7d855afde3

voices
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 03 Aug 2025 17:05:38 -0600
parents d3f5448743bf
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 local Luan = require "luan:Luan.luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2 local error = Luan.error
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 local Parsers = require "luan:Parsers.luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 local xml_encode = Parsers.xml_encode or error()
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5 local Io = require "luan:Io.luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
6 local uri = Io.uri or error()
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
7 local Http = require "luan:http/Http.luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
8 local Config = require "site:/private/Config.luan"
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10
26
d3f5448743bf add doc links
Franklin Schmidt <fschmidt@gmail.com>
parents: 16
diff changeset
11 -- https://learn.microsoft.com/en-us/azure/ai-services/speech-service/index-text-to-speech
d3f5448743bf add doc links
Franklin Schmidt <fschmidt@gmail.com>
parents: 16
diff changeset
12
12
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
13 local region = Config.azure_tts.region or error()
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14 local url = "https://"..region..".tts.speech.microsoft.com/cognitiveservices/v1"
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15 local headers = {
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
16 ["Ocp-Apim-Subscription-Key"] = Config.azure_tts.key or error()
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
17 ["Content-Type"] = "application/ssml+xml"
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18 ["X-Microsoft-OutputFormat"] = "audio-16khz-128kbitrate-mono-mp3"
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19 }
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
20
31
Franklin Schmidt <fschmidt@gmail.com>
parents: 26
diff changeset
21 local function text_to_speech(lang,voice,text)
12
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22 local xml = `%>
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 <speak version='1.0' xml:lang='<%=lang%>'>
31
Franklin Schmidt <fschmidt@gmail.com>
parents: 26
diff changeset
24 <voice name='<%=voice%>'>
12
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25 <%= xml_encode(text) %>
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 </voice>
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 </speak>
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 <% `
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 local options = {
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30 method = "POST"
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 headers = headers
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 content = xml
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33 }
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 return uri(url,options)
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
35 end
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
37 return function()
16
f5425a3c1898 add languages
Franklin Schmidt <fschmidt@gmail.com>
parents: 12
diff changeset
38 local lang = Http.request.parameters.lang or error()
31
Franklin Schmidt <fschmidt@gmail.com>
parents: 26
diff changeset
39 local voice = Http.request.parameters.voice or error()
12
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 local text = Http.request.parameters.text or error()
31
Franklin Schmidt <fschmidt@gmail.com>
parents: 26
diff changeset
41 local input = text_to_speech(lang,voice,text)
12
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
42 Http.response.binary_writer().write_from(input)
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43 end