commit a622e587929aa9f0a0ab10a924f91bae0bf58744 Author: ckoch Date: Fri Jun 12 09:33:42 2026 -0400 Add cathy, cynda, and james Piper voices for Home Assistant Three medium-quality en-US single-speaker Piper TTS voices, each with its .onnx model and .onnx.json config, plus README install instructions. Co-Authored-By: Claude Opus 4.8 (1M context) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ff076e9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# OS / editor cruft +.DS_Store +Thumbs.db +*~ +.idea/ +.vscode/ + +# Python (if you add training/conversion scripts later) +__pycache__/ +*.pyc +.venv/ +venv/ + +# Audio test output +*.wav diff --git a/README.md b/README.md new file mode 100644 index 0000000..642c4a4 --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +# AIVoices_HA + +Custom [Piper](https://github.com/OHF-Voice/piper1-gpl) text-to-speech voices for [Home Assistant](https://www.home-assistant.io/). + +These are medium-quality, single-speaker English (`en-US`) neural voices trained for use with Home Assistant's local TTS engine. + +## Voices + +| Voice | Files | Language | Sample rate | Quality | +|-------|-------|----------|-------------|---------| +| **cathy** | `en_us-cathy-medium.onnx` + `.onnx.json` | en-US | 22050 Hz | medium | +| **cynda** | `en_us-cynda-medium.onnx` + `.onnx.json` | en-US | 22050 Hz | medium | +| **james** | `en_us-james-medium.onnx` + `.onnx.json` | en-US | 22050 Hz | medium | + +Each voice consists of two files that must stay together: + +- `*.onnx` — the trained model weights +- `*.onnx.json` — the voice configuration (phoneme map, sample rate, inference settings) + +## Installation (Home Assistant) + +These voices work with the **Piper** add-on / [wyoming-piper](https://github.com/rhasspy/wyoming-piper). + +1. Locate the Piper data directory where custom voices are stored. For the + official **Piper** add-on this is the share folder, typically: + + ``` + /share/piper/ + ``` + +2. Copy **both** files for each voice you want into that directory: + + ``` + en_us-cathy-medium.onnx + en_us-cathy-medium.onnx.json + ``` + +3. Restart the Piper add-on. Then in Home Assistant go to + **Settings → Voice assistants → (your assistant) → Text-to-speech** + and select the new voice. + +> Tip: If a voice does not appear, confirm the `.onnx` and `.onnx.json` +> filenames match exactly and that both files are present. + +## Testing a voice locally + +With Piper installed you can render a sample to a WAV file: + +```bash +echo "Hello from Home Assistant." | \ + piper --model en_us-cathy-medium.onnx --output_file sample.wav +``` + +## License + +The licensing of a trained Piper voice depends on the dataset it was trained +on. Add a `LICENSE` file describing the terms that apply to these models and +their training data before distributing them. diff --git a/en_us-cathy-medium.onnx b/en_us-cathy-medium.onnx new file mode 100644 index 0000000..79ab038 Binary files /dev/null and b/en_us-cathy-medium.onnx differ diff --git a/en_us-cathy-medium.onnx.json b/en_us-cathy-medium.onnx.json new file mode 100644 index 0000000..e9f0274 --- /dev/null +++ b/en_us-cathy-medium.onnx.json @@ -0,0 +1,497 @@ +{ + "dataset": "en_us-cathy-medium", + "audio": { + "sample_rate": 22050, + "quality": "training" + }, + "espeak": { + "voice": "en-us" + }, + "language": { + "code": "en-us" + }, + "inference": { + "noise_scale": 0.667, + "length_scale": 1, + "noise_w": 0.8 + }, + "phoneme_type": "espeak", + "phoneme_map": {}, + "phoneme_id_map": { + " ": [ + 3 + ], + "!": [ + 4 + ], + "\"": [ + 150 + ], + "#": [ + 149 + ], + "$": [ + 2 + ], + "'": [ + 5 + ], + "(": [ + 6 + ], + ")": [ + 7 + ], + ",": [ + 8 + ], + "-": [ + 9 + ], + ".": [ + 10 + ], + "0": [ + 130 + ], + "1": [ + 131 + ], + "2": [ + 132 + ], + "3": [ + 133 + ], + "4": [ + 134 + ], + "5": [ + 135 + ], + "6": [ + 136 + ], + "7": [ + 137 + ], + "8": [ + 138 + ], + "9": [ + 139 + ], + ":": [ + 11 + ], + ";": [ + 12 + ], + "?": [ + 13 + ], + "X": [ + 156 + ], + "^": [ + 1 + ], + "_": [ + 0 + ], + "a": [ + 14 + ], + "b": [ + 15 + ], + "c": [ + 16 + ], + "d": [ + 17 + ], + "e": [ + 18 + ], + "f": [ + 19 + ], + "g": [ + 154 + ], + "h": [ + 20 + ], + "i": [ + 21 + ], + "j": [ + 22 + ], + "k": [ + 23 + ], + "l": [ + 24 + ], + "m": [ + 25 + ], + "n": [ + 26 + ], + "o": [ + 27 + ], + "p": [ + 28 + ], + "q": [ + 29 + ], + "r": [ + 30 + ], + "s": [ + 31 + ], + "t": [ + 32 + ], + "u": [ + 33 + ], + "v": [ + 34 + ], + "w": [ + 35 + ], + "x": [ + 36 + ], + "y": [ + 37 + ], + "z": [ + 38 + ], + "\u00e6": [ + 39 + ], + "\u00e7": [ + 40 + ], + "\u00f0": [ + 41 + ], + "\u00f8": [ + 42 + ], + "\u0127": [ + 43 + ], + "\u014b": [ + 44 + ], + "\u0153": [ + 45 + ], + "\u01c0": [ + 46 + ], + "\u01c1": [ + 47 + ], + "\u01c2": [ + 48 + ], + "\u01c3": [ + 49 + ], + "\u0250": [ + 50 + ], + "\u0251": [ + 51 + ], + "\u0252": [ + 52 + ], + "\u0253": [ + 53 + ], + "\u0254": [ + 54 + ], + "\u0255": [ + 55 + ], + "\u0256": [ + 56 + ], + "\u0257": [ + 57 + ], + "\u0258": [ + 58 + ], + "\u0259": [ + 59 + ], + "\u025a": [ + 60 + ], + "\u025b": [ + 61 + ], + "\u025c": [ + 62 + ], + "\u025e": [ + 63 + ], + "\u025f": [ + 64 + ], + "\u0260": [ + 65 + ], + "\u0261": [ + 66 + ], + "\u0262": [ + 67 + ], + "\u0263": [ + 68 + ], + "\u0264": [ + 69 + ], + "\u0265": [ + 70 + ], + "\u0266": [ + 71 + ], + "\u0267": [ + 72 + ], + "\u0268": [ + 73 + ], + "\u026a": [ + 74 + ], + "\u026b": [ + 75 + ], + "\u026c": [ + 76 + ], + "\u026d": [ + 77 + ], + "\u026e": [ + 78 + ], + "\u026f": [ + 79 + ], + "\u0270": [ + 80 + ], + "\u0271": [ + 81 + ], + "\u0272": [ + 82 + ], + "\u0273": [ + 83 + ], + "\u0274": [ + 84 + ], + "\u0275": [ + 85 + ], + "\u0276": [ + 86 + ], + "\u0278": [ + 87 + ], + "\u0279": [ + 88 + ], + "\u027a": [ + 89 + ], + "\u027b": [ + 90 + ], + "\u027d": [ + 91 + ], + "\u027e": [ + 92 + ], + "\u0280": [ + 93 + ], + "\u0281": [ + 94 + ], + "\u0282": [ + 95 + ], + "\u0283": [ + 96 + ], + "\u0284": [ + 97 + ], + "\u0288": [ + 98 + ], + "\u0289": [ + 99 + ], + "\u028a": [ + 100 + ], + "\u028b": [ + 101 + ], + "\u028c": [ + 102 + ], + "\u028d": [ + 103 + ], + "\u028e": [ + 104 + ], + "\u028f": [ + 105 + ], + "\u0290": [ + 106 + ], + "\u0291": [ + 107 + ], + "\u0292": [ + 108 + ], + "\u0294": [ + 109 + ], + "\u0295": [ + 110 + ], + "\u0298": [ + 111 + ], + "\u0299": [ + 112 + ], + "\u029b": [ + 113 + ], + "\u029c": [ + 114 + ], + "\u029d": [ + 115 + ], + "\u029f": [ + 116 + ], + "\u02a1": [ + 117 + ], + "\u02a2": [ + 118 + ], + "\u02a6": [ + 155 + ], + "\u02b0": [ + 145 + ], + "\u02b2": [ + 119 + ], + "\u02c8": [ + 120 + ], + "\u02cc": [ + 121 + ], + "\u02d0": [ + 122 + ], + "\u02d1": [ + 123 + ], + "\u02de": [ + 124 + ], + "\u02e4": [ + 146 + ], + "\u0303": [ + 141 + ], + "\u0327": [ + 140 + ], + "\u0329": [ + 144 + ], + "\u032a": [ + 142 + ], + "\u032f": [ + 143 + ], + "\u033a": [ + 152 + ], + "\u033b": [ + 153 + ], + "\u03b2": [ + 125 + ], + "\u03b5": [ + 147 + ], + "\u03b8": [ + 126 + ], + "\u03c7": [ + 127 + ], + "\u1d7b": [ + 128 + ], + "\u2191": [ + 151 + ], + "\u2193": [ + 148 + ], + "\u2c71": [ + 129 + ] + }, + "num_symbols": 256, + "num_speakers": 1, + "speaker_id_map": {}, + "piper_version": "1.0.0" +} \ No newline at end of file diff --git a/en_us-cynda-medium.onnx b/en_us-cynda-medium.onnx new file mode 100644 index 0000000..2bc8fe9 Binary files /dev/null and b/en_us-cynda-medium.onnx differ diff --git a/en_us-cynda-medium.onnx.json b/en_us-cynda-medium.onnx.json new file mode 100644 index 0000000..d6dce1b --- /dev/null +++ b/en_us-cynda-medium.onnx.json @@ -0,0 +1,497 @@ +{ + "dataset": "en_us-cynda-medium", + "audio": { + "sample_rate": 22050, + "quality": "training" + }, + "espeak": { + "voice": "en-us" + }, + "language": { + "code": "en-us" + }, + "inference": { + "noise_scale": 0.667, + "length_scale": 1, + "noise_w": 0.8 + }, + "phoneme_type": "espeak", + "phoneme_map": {}, + "phoneme_id_map": { + " ": [ + 3 + ], + "!": [ + 4 + ], + "\"": [ + 150 + ], + "#": [ + 149 + ], + "$": [ + 2 + ], + "'": [ + 5 + ], + "(": [ + 6 + ], + ")": [ + 7 + ], + ",": [ + 8 + ], + "-": [ + 9 + ], + ".": [ + 10 + ], + "0": [ + 130 + ], + "1": [ + 131 + ], + "2": [ + 132 + ], + "3": [ + 133 + ], + "4": [ + 134 + ], + "5": [ + 135 + ], + "6": [ + 136 + ], + "7": [ + 137 + ], + "8": [ + 138 + ], + "9": [ + 139 + ], + ":": [ + 11 + ], + ";": [ + 12 + ], + "?": [ + 13 + ], + "X": [ + 156 + ], + "^": [ + 1 + ], + "_": [ + 0 + ], + "a": [ + 14 + ], + "b": [ + 15 + ], + "c": [ + 16 + ], + "d": [ + 17 + ], + "e": [ + 18 + ], + "f": [ + 19 + ], + "g": [ + 154 + ], + "h": [ + 20 + ], + "i": [ + 21 + ], + "j": [ + 22 + ], + "k": [ + 23 + ], + "l": [ + 24 + ], + "m": [ + 25 + ], + "n": [ + 26 + ], + "o": [ + 27 + ], + "p": [ + 28 + ], + "q": [ + 29 + ], + "r": [ + 30 + ], + "s": [ + 31 + ], + "t": [ + 32 + ], + "u": [ + 33 + ], + "v": [ + 34 + ], + "w": [ + 35 + ], + "x": [ + 36 + ], + "y": [ + 37 + ], + "z": [ + 38 + ], + "\u00e6": [ + 39 + ], + "\u00e7": [ + 40 + ], + "\u00f0": [ + 41 + ], + "\u00f8": [ + 42 + ], + "\u0127": [ + 43 + ], + "\u014b": [ + 44 + ], + "\u0153": [ + 45 + ], + "\u01c0": [ + 46 + ], + "\u01c1": [ + 47 + ], + "\u01c2": [ + 48 + ], + "\u01c3": [ + 49 + ], + "\u0250": [ + 50 + ], + "\u0251": [ + 51 + ], + "\u0252": [ + 52 + ], + "\u0253": [ + 53 + ], + "\u0254": [ + 54 + ], + "\u0255": [ + 55 + ], + "\u0256": [ + 56 + ], + "\u0257": [ + 57 + ], + "\u0258": [ + 58 + ], + "\u0259": [ + 59 + ], + "\u025a": [ + 60 + ], + "\u025b": [ + 61 + ], + "\u025c": [ + 62 + ], + "\u025e": [ + 63 + ], + "\u025f": [ + 64 + ], + "\u0260": [ + 65 + ], + "\u0261": [ + 66 + ], + "\u0262": [ + 67 + ], + "\u0263": [ + 68 + ], + "\u0264": [ + 69 + ], + "\u0265": [ + 70 + ], + "\u0266": [ + 71 + ], + "\u0267": [ + 72 + ], + "\u0268": [ + 73 + ], + "\u026a": [ + 74 + ], + "\u026b": [ + 75 + ], + "\u026c": [ + 76 + ], + "\u026d": [ + 77 + ], + "\u026e": [ + 78 + ], + "\u026f": [ + 79 + ], + "\u0270": [ + 80 + ], + "\u0271": [ + 81 + ], + "\u0272": [ + 82 + ], + "\u0273": [ + 83 + ], + "\u0274": [ + 84 + ], + "\u0275": [ + 85 + ], + "\u0276": [ + 86 + ], + "\u0278": [ + 87 + ], + "\u0279": [ + 88 + ], + "\u027a": [ + 89 + ], + "\u027b": [ + 90 + ], + "\u027d": [ + 91 + ], + "\u027e": [ + 92 + ], + "\u0280": [ + 93 + ], + "\u0281": [ + 94 + ], + "\u0282": [ + 95 + ], + "\u0283": [ + 96 + ], + "\u0284": [ + 97 + ], + "\u0288": [ + 98 + ], + "\u0289": [ + 99 + ], + "\u028a": [ + 100 + ], + "\u028b": [ + 101 + ], + "\u028c": [ + 102 + ], + "\u028d": [ + 103 + ], + "\u028e": [ + 104 + ], + "\u028f": [ + 105 + ], + "\u0290": [ + 106 + ], + "\u0291": [ + 107 + ], + "\u0292": [ + 108 + ], + "\u0294": [ + 109 + ], + "\u0295": [ + 110 + ], + "\u0298": [ + 111 + ], + "\u0299": [ + 112 + ], + "\u029b": [ + 113 + ], + "\u029c": [ + 114 + ], + "\u029d": [ + 115 + ], + "\u029f": [ + 116 + ], + "\u02a1": [ + 117 + ], + "\u02a2": [ + 118 + ], + "\u02a6": [ + 155 + ], + "\u02b0": [ + 145 + ], + "\u02b2": [ + 119 + ], + "\u02c8": [ + 120 + ], + "\u02cc": [ + 121 + ], + "\u02d0": [ + 122 + ], + "\u02d1": [ + 123 + ], + "\u02de": [ + 124 + ], + "\u02e4": [ + 146 + ], + "\u0303": [ + 141 + ], + "\u0327": [ + 140 + ], + "\u0329": [ + 144 + ], + "\u032a": [ + 142 + ], + "\u032f": [ + 143 + ], + "\u033a": [ + 152 + ], + "\u033b": [ + 153 + ], + "\u03b2": [ + 125 + ], + "\u03b5": [ + 147 + ], + "\u03b8": [ + 126 + ], + "\u03c7": [ + 127 + ], + "\u1d7b": [ + 128 + ], + "\u2191": [ + 151 + ], + "\u2193": [ + 148 + ], + "\u2c71": [ + 129 + ] + }, + "num_symbols": 256, + "num_speakers": 1, + "speaker_id_map": {}, + "piper_version": "1.0.0" +} \ No newline at end of file diff --git a/en_us-james-medium.onnx b/en_us-james-medium.onnx new file mode 100644 index 0000000..a793aee Binary files /dev/null and b/en_us-james-medium.onnx differ diff --git a/en_us-james-medium.onnx.json b/en_us-james-medium.onnx.json new file mode 100644 index 0000000..e5e9132 --- /dev/null +++ b/en_us-james-medium.onnx.json @@ -0,0 +1,497 @@ +{ + "dataset": "en_us-james-medium", + "audio": { + "sample_rate": 22050, + "quality": "training" + }, + "espeak": { + "voice": "en-us" + }, + "language": { + "code": "en-us" + }, + "inference": { + "noise_scale": 0.667, + "length_scale": 1, + "noise_w": 0.8 + }, + "phoneme_type": "espeak", + "phoneme_map": {}, + "phoneme_id_map": { + " ": [ + 3 + ], + "!": [ + 4 + ], + "\"": [ + 150 + ], + "#": [ + 149 + ], + "$": [ + 2 + ], + "'": [ + 5 + ], + "(": [ + 6 + ], + ")": [ + 7 + ], + ",": [ + 8 + ], + "-": [ + 9 + ], + ".": [ + 10 + ], + "0": [ + 130 + ], + "1": [ + 131 + ], + "2": [ + 132 + ], + "3": [ + 133 + ], + "4": [ + 134 + ], + "5": [ + 135 + ], + "6": [ + 136 + ], + "7": [ + 137 + ], + "8": [ + 138 + ], + "9": [ + 139 + ], + ":": [ + 11 + ], + ";": [ + 12 + ], + "?": [ + 13 + ], + "X": [ + 156 + ], + "^": [ + 1 + ], + "_": [ + 0 + ], + "a": [ + 14 + ], + "b": [ + 15 + ], + "c": [ + 16 + ], + "d": [ + 17 + ], + "e": [ + 18 + ], + "f": [ + 19 + ], + "g": [ + 154 + ], + "h": [ + 20 + ], + "i": [ + 21 + ], + "j": [ + 22 + ], + "k": [ + 23 + ], + "l": [ + 24 + ], + "m": [ + 25 + ], + "n": [ + 26 + ], + "o": [ + 27 + ], + "p": [ + 28 + ], + "q": [ + 29 + ], + "r": [ + 30 + ], + "s": [ + 31 + ], + "t": [ + 32 + ], + "u": [ + 33 + ], + "v": [ + 34 + ], + "w": [ + 35 + ], + "x": [ + 36 + ], + "y": [ + 37 + ], + "z": [ + 38 + ], + "\u00e6": [ + 39 + ], + "\u00e7": [ + 40 + ], + "\u00f0": [ + 41 + ], + "\u00f8": [ + 42 + ], + "\u0127": [ + 43 + ], + "\u014b": [ + 44 + ], + "\u0153": [ + 45 + ], + "\u01c0": [ + 46 + ], + "\u01c1": [ + 47 + ], + "\u01c2": [ + 48 + ], + "\u01c3": [ + 49 + ], + "\u0250": [ + 50 + ], + "\u0251": [ + 51 + ], + "\u0252": [ + 52 + ], + "\u0253": [ + 53 + ], + "\u0254": [ + 54 + ], + "\u0255": [ + 55 + ], + "\u0256": [ + 56 + ], + "\u0257": [ + 57 + ], + "\u0258": [ + 58 + ], + "\u0259": [ + 59 + ], + "\u025a": [ + 60 + ], + "\u025b": [ + 61 + ], + "\u025c": [ + 62 + ], + "\u025e": [ + 63 + ], + "\u025f": [ + 64 + ], + "\u0260": [ + 65 + ], + "\u0261": [ + 66 + ], + "\u0262": [ + 67 + ], + "\u0263": [ + 68 + ], + "\u0264": [ + 69 + ], + "\u0265": [ + 70 + ], + "\u0266": [ + 71 + ], + "\u0267": [ + 72 + ], + "\u0268": [ + 73 + ], + "\u026a": [ + 74 + ], + "\u026b": [ + 75 + ], + "\u026c": [ + 76 + ], + "\u026d": [ + 77 + ], + "\u026e": [ + 78 + ], + "\u026f": [ + 79 + ], + "\u0270": [ + 80 + ], + "\u0271": [ + 81 + ], + "\u0272": [ + 82 + ], + "\u0273": [ + 83 + ], + "\u0274": [ + 84 + ], + "\u0275": [ + 85 + ], + "\u0276": [ + 86 + ], + "\u0278": [ + 87 + ], + "\u0279": [ + 88 + ], + "\u027a": [ + 89 + ], + "\u027b": [ + 90 + ], + "\u027d": [ + 91 + ], + "\u027e": [ + 92 + ], + "\u0280": [ + 93 + ], + "\u0281": [ + 94 + ], + "\u0282": [ + 95 + ], + "\u0283": [ + 96 + ], + "\u0284": [ + 97 + ], + "\u0288": [ + 98 + ], + "\u0289": [ + 99 + ], + "\u028a": [ + 100 + ], + "\u028b": [ + 101 + ], + "\u028c": [ + 102 + ], + "\u028d": [ + 103 + ], + "\u028e": [ + 104 + ], + "\u028f": [ + 105 + ], + "\u0290": [ + 106 + ], + "\u0291": [ + 107 + ], + "\u0292": [ + 108 + ], + "\u0294": [ + 109 + ], + "\u0295": [ + 110 + ], + "\u0298": [ + 111 + ], + "\u0299": [ + 112 + ], + "\u029b": [ + 113 + ], + "\u029c": [ + 114 + ], + "\u029d": [ + 115 + ], + "\u029f": [ + 116 + ], + "\u02a1": [ + 117 + ], + "\u02a2": [ + 118 + ], + "\u02a6": [ + 155 + ], + "\u02b0": [ + 145 + ], + "\u02b2": [ + 119 + ], + "\u02c8": [ + 120 + ], + "\u02cc": [ + 121 + ], + "\u02d0": [ + 122 + ], + "\u02d1": [ + 123 + ], + "\u02de": [ + 124 + ], + "\u02e4": [ + 146 + ], + "\u0303": [ + 141 + ], + "\u0327": [ + 140 + ], + "\u0329": [ + 144 + ], + "\u032a": [ + 142 + ], + "\u032f": [ + 143 + ], + "\u033a": [ + 152 + ], + "\u033b": [ + 153 + ], + "\u03b2": [ + 125 + ], + "\u03b5": [ + 147 + ], + "\u03b8": [ + 126 + ], + "\u03c7": [ + 127 + ], + "\u1d7b": [ + 128 + ], + "\u2191": [ + 151 + ], + "\u2193": [ + 148 + ], + "\u2c71": [ + 129 + ] + }, + "num_symbols": 256, + "num_speakers": 1, + "speaker_id_map": {}, + "piper_version": "1.0.0" +} \ No newline at end of file