mirror of
https://github.com/ndarilek/tts-rs.git
synced 2024-11-17 12:39:36 +00:00
Split text sent to Tolk backend to account for some sort of length limit.
Tolk seems to fail on strings larger than 325 characters in length. Here we: * Send any strings with 300 or fewer characters through directly. * For larger strings, split on whitespace boundaries, then create and send buffers of 300 or fewer characters. This may not handle internationalized text, and may not handle someone bombarding TTS with a giant word. PRs for either welcome.
This commit is contained in:
parent
6c091f3284
commit
665013fdff
|
@ -28,7 +28,25 @@ impl Backend for Tolk {
|
|||
|
||||
fn speak(&mut self, text: &str, interrupt: bool) -> Result<(), Error> {
|
||||
trace!("speak({}, {})", text, interrupt);
|
||||
self.0.speak(text, interrupt);
|
||||
const BUFFER_LENGTH: usize = 300;
|
||||
if text.len() <= BUFFER_LENGTH {
|
||||
self.0.speak(text, interrupt);
|
||||
} else {
|
||||
if interrupt {
|
||||
self.stop()?;
|
||||
}
|
||||
let tokens = text.split_whitespace();
|
||||
let mut buffer = String::new();
|
||||
for token in tokens {
|
||||
if buffer.len() + token.len() > BUFFER_LENGTH {
|
||||
self.0.speak(buffer, false);
|
||||
buffer = String::new();
|
||||
} else {
|
||||
buffer.push_str(token);
|
||||
buffer.push(' ');
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user