Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
I added Piper as a new TTS provider.
Motivation
A twitch streamer I watch is using Curses as part of their speech-to-text-to-speech setup. Until now they were using an Azure TTS voice, but they're unhappy with a recent update and now want to switch to a TTS setup they have more control over. Piper is open source, runs locally, and most voice files are CC-licensed, so it seems ideal.
They asked their community for help with integrating Piper into Curses and I volunteered.
Changes Made
UI
I added a new TTS service "Piper" complete with settings:
The user must specify the path of
piper.exe
as well as the directory containing the voice files.To this end I added an
InputFilePath
component, essentially a text input with a button that opens a file dialog.Backend
The new module
services::piper_tts
exposes two functions:get_voices
to scan a directory for Piper voice filesspeak
to speak some text out loudWhen invoking
piper.exe
I need to provide it with a file path for the generated.wav
file.I added a dependency on the
tempfile
crate to handle this.Translations
I added a few items to the
tts
section of the translation files.I don't speak Chinese, so I just copied the
en
strings tozh_cn
andzh_tw
.You'll want to replace these with proper translations.
The error messages produced by the rust module are all in English as well.