diff --git a/internal/ffmpeg/ffmpeg.go b/internal/ffmpeg/ffmpeg.go index c5587e3c..ff66c835 100644 --- a/internal/ffmpeg/ffmpeg.go +++ b/internal/ffmpeg/ffmpeg.go @@ -195,6 +195,8 @@ func parseArgs(s string) *ffmpeg.Args { args.Input = device.GetInput(s[i+1:]) case "virtual": args.Input = virtual.GetInput(s[i+1:]) + case "tts": + args.Input = virtual.GetInputTTS(s[i+1:]) } } else { args.Input = inputTemplate("file", s, query) diff --git a/internal/ffmpeg/virtual/virtual.go b/internal/ffmpeg/virtual/virtual.go index f738c41f..4dc3b025 100644 --- a/internal/ffmpeg/virtual/virtual.go +++ b/internal/ffmpeg/virtual/virtual.go @@ -60,3 +60,20 @@ func GetInput(src string) string { return input } + +func GetInputTTS(src string) string { + query, err := url.ParseQuery(src) + if err != nil { + return "" + } + + input := `-re -f lavfi -i "flite=text='` + query.Get("text") + `'` + + // ffmpeg -f lavfi -i flite=list_voices=1 + // awb, kal, kal16, rms, slt + if voice := query.Get("voice"); voice != "" { + input += ":voice" + voice + } + + return input + `"` +}