Compare commits

...

2 Commits

Author SHA1 Message Date
laurent
87b3c602c9 Edit the readme too. 2025-07-16 21:06:05 +02:00
laurent
cecbe46d4b Fix the pytorch tts streaming example. 2025-07-16 21:01:16 +02:00
2 changed files with 28 additions and 4 deletions

View File

@ -237,6 +237,14 @@ echo "Hey, how are you?" | python scripts/tts_pytorch.py - -
python scripts/tts_pytorch.py text_to_say.txt audio_output.wav
```
The `tts_pytorch.py` script waits for all the text to be available before
starting the audio generation. A fully streaming implementation is available in
the `tts_pytorch_streaming.py` script, which can be used as follows:
```bash
echo "Hey, how are you?" | python scripts/tts_pytorch_streaming.py audio_output.wav
```
This requires the [moshi package](https://pypi.org/project/moshi/), which can be installed via pip.
If you have [uv](https://docs.astral.sh/uv/) installed, you can skip the installation step
and just prefix the command above with `uvx --with moshi`.

View File

@ -21,13 +21,27 @@ from moshi.models.loaders import CheckpointInfo
from moshi.conditioners import dropout_all_conditions
from moshi.models.lm import LMGen
from moshi.models.tts import (
Entry,
DEFAULT_DSM_TTS_REPO,
DEFAULT_DSM_TTS_VOICE_REPO,
TTSModel,
ConditionAttributes,
script_to_entries,
)
def prepare_script(model: TTSModel, script: str, first_turn: bool) -> list[Entry]:
multi_speaker = first_turn and model.multi_speaker
return script_to_entries(
model.tokenizer,
model.machine.token_ids,
model.mimi.frame_rate,
[script],
multi_speaker=multi_speaker,
padding_between=1,
)
def _make_null(
all_attributes: tp.Sequence[ConditionAttributes],
) -> list[ConditionAttributes]:
@ -206,9 +220,10 @@ def main():
channels=1,
callback=audio_callback,
) and tts_model.mimi.streaming(1):
first_turn = True
for line in sys.stdin:
# TODO: Fix the following to only include bos on the first line.
entries = tts_model.prepare_script([line.strip()], padding_between=1)
entries = prepare_script(tts_model, line.strip(), first_turn=first_turn)
first_turn = False
for entry in entries:
gen.append_entry(entry)
gen.process()
@ -227,9 +242,10 @@ def main():
gen = TTSGen(tts_model, [condition_attributes], on_frame=_on_frame)
with tts_model.mimi.streaming(1):
first_turn = True
for line in sys.stdin:
# TODO: Fix the following to only include bos on the first line.
entries = tts_model.prepare_script([line.strip()], padding_between=1)
entries = prepare_script(tts_model, line.strip(), first_turn=first_turn)
first_turn = False
for entry in entries:
gen.append_entry(entry)
gen.process()