Views
No views yet
<break/> markers.📄 Paper: "Improving Synthetic Speech Quality via SSML Prosody Control"
Authors: Nassima Ould-Ouali, Awais Sani, Ruben Bueno, Jonah Dauvet, Tim Luka Horstmann, Eric Moulines
Conference: ICNLSP 2025
🔗 Demo & Audio Samples: https://hi-paris.github.io/DemoTTS/
| Stage | Model | Purpose |
|---|---|---|
| 1️⃣ | hi-paris/ssml-text2breaks-fr-lora | Predicts natural pause locations |
| 2️⃣ | hi-paris/ssml-breaks2ssml-fr-lora | Converts breaks to full SSML with prosody |
Bonjour comment allez-vous aujourd'hui ?Bonjour comment allez-vous aujourd'hui ?<break/>pip install torch transformers peft accelerate1from transformers import AutoTokenizer, AutoModelForCausalLM
2from peft import PeftModel
3import torch
4
5# Load base model and tokenizer
6base_model = AutoModelForCausalLM.from_pretrained(
7 "Qwen/Qwen2.5-7B",
8 torch_dtype=torch.float16,
9 device_map="auto"
10)
11tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B")
12
13# Load LoRA adapter
14model = PeftModel.from_pretrained(base_model, "hi-paris/ssml-text2breaks-fr-lora")
15
16# Prepare input
17text = "Bonjour comment allez-vous aujourd'hui ?"
18formatted_input = f"### Task:\nConvert text to SSML with pauses:\n\n### Text:\n{text}\n\n### SSML:\n"
19
20# Generate
21inputs = tokenizer(formatted_input, return_tensors="pt").to(model.device)
22with torch.no_grad():
23 outputs = model.generate(
24 **inputs,
25 max_new_tokens=256,
26 temperature=0.7,
27 do_sample=True,
28 pad_token_id=tokenizer.eos_token_id
29 )
30
31response = tokenizer.decode(outputs[0], skip_special_tokens=True)
32result = response.split("### SSML:\n")[-1].strip()
33print(result) # "Bonjour comment allez-vous aujourd'hui ?<break/>"1from text2breaks_inference import Text2BreaksInference
2
3# Memory-efficient shared model approach
4model = Text2BreaksInference()
5result = model.predict("Bonjour comment allez-vous aujourd'hui ?")1from breaks2ssml_inference import CascadedInference
2
3# Initialize full pipeline (memory efficient)
4cascade = CascadedInference()
5
6# Convert plain text directly to full SSML
7text = "Bonjour comment allez-vous aujourd'hui ?"
8ssml_output = cascade.predict(text)
9print(ssml_output)
10# Output: '<prosody pitch="+2.5%" rate="-1.2%" volume="-5.0%">Bonjour comment allez-vous aujourd'hui ?</prosody><break time="300ms"/>'q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj@inproceedings{ouali-etal-2025-improving,
title = "Improving {F}rench Synthetic Speech Quality via {SSML} Prosody Control",
author = "Ouali, Nassima Ould and
Sani, Awais Hussain and
Bueno, Ruben and
Dauvet, Jonah and
Horstmann, Tim Luka and
Moulines, Eric",
editor = "Abbas, Mourad and
Yousef, Tariq and
Galke, Lukas",
booktitle = "Proceedings of the 8th International Conference on Natural Language and Speech Processing (ICNLSP-2025)",
month = aug,
year = "2025",
address = "Southern Denmark University, Odense, Denmark",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2025.icnlsp-1.30/",
pages = "302--314"
}