Medium-size French female voice.
1from piper import PiperVoice
2
3voice = PiperVoice.load("model.onnx")
4for chunk in voice.synthesize("Hello, this is a test."):
5 # chunk.audio_float_array contains float32 audio
6 pass
1import json, subprocess, numpy as np, onnxruntime as ort, soundfile as sf
2from huggingface_hub import hf_hub_download
3
4model_id = "Trelis/piper-fr-fr-siwis-medium"
5onnx_path = hf_hub_download(model_id, "model.onnx")
6config_path = hf_hub_download(model_id, "model.onnx.json")
7
8with open(config_path) as f:
9 config = json.load(f)
10
11session = ort.InferenceSession(onnx_path, providers=["CPUExecutionProvider"])
12phoneme_id_map = config["phoneme_id_map"]
13espeak_voice = config["espeak"]["voice"]
14
15def phonemize(text, voice):
16 out = subprocess.run(
17 ["espeak-ng", "-v", voice, "-q", "--ipa=2", "-x", text],
18 capture_output=True, text=True,
19 ).stdout.strip()
20 return [list(line.replace("_", " ")) for line in out.split("\n") if line.strip()]
21
22def to_ids(phonemes, pmap):
23 ids = [pmap["^"][0], pmap["_"][0]]
24 for p in phonemes:
25 if p in pmap:
26 ids.extend(pmap[p])
27 ids.append(pmap["_"][0])
28 ids.append(pmap["$"][0])
29 return ids
30
31text = "Hello, this is a test."
32audio_chunks = []
33for sentence in phonemize(text, espeak_voice):
34 ids = to_ids(sentence, phoneme_id_map)
35 if len(ids) < 3:
36 continue
37 audio = session.run(None, {
38 "input": np.array([ids], dtype=np.int64),
39 "input_lengths": np.array([len(ids)], dtype=np.int64),
40 "scales": np.array([
41 config["inference"]["noise_scale"],
42 config["inference"]["length_scale"],
43 config["inference"]["noise_w"],
44 ], dtype=np.float32),
45 })[0]
46 audio_chunks.append(audio.squeeze())
47
48audio = np.concatenate(audio_chunks).astype(np.float32)
49sf.write("output.wav", audio, config["audio"]["sample_rate"])
You can fine-tune this model on your own voice data using
Trelis Studio. Piper models can be trained on custom datasets to create personalized voices.
Trained on
SIWIS French Speech Synthesis Database. Fine-tuned from lessac medium.