curses icon indicating copy to clipboard operation
curses copied to clipboard

Piper TTS Support

Open zqlk256 opened this issue 1 year ago • 1 comments

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:

pull-request

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 files
  • speak to speak some text out loud

When 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 to zh_cn and zh_tw. You'll want to replace these with proper translations.

The error messages produced by the rust module are all in English as well.

zqlk256 avatar Sep 29 '24 17:09 zqlk256

This is really amazing. I will complete the Chinese translation work in the future

tianmiao8152 avatar Sep 30 '24 09:09 tianmiao8152