Почти не генерирует речь из пары слов

#20
by Osony1 - opened

Я пытался использовать несколько вариантов кода чтобы сгенерировать разные по длине и содержанию речи, например:

from f5_tts.api import F5TTS
from ruaccent import RUAccent

text = """
Правительство утвердило
"""

f5tts = F5TTS(
    ckpt_file="model/model_last_inference.safetensors",
    vocab_file='model/vocab.txt'
)
accentizer = RUAccent()
accentizer.load(
    omograph_model_size="turbo3",
    use_dictionary=True,
    workdir="ru_accent",
)
gen_text = accentizer.process_all(text)
wav, sr, spec = f5tts.infer(
    ref_file="reference.wav",
    ref_text="Правительство утвердило финансирование государственной программы «Искусственный интеллект в помощь сельскому жителю».",
    gen_text=gen_text,
    file_wave="output.wav"
)
import soundfile as sf
from ruaccent import RUAccent
from f5_tts.infer.utils_infer import (
  infer_process,
  load_model,
  load_vocoder,
  preprocess_ref_audio_text
)
from f5_tts.model import DiT
from f5_tts.model.utils import seed_everything

seed_everything(seed=4242)

DEVICE = 'cuda'
RUACCENT_DIR: str = "ru_accent"

vocoder = load_vocoder(device=DEVICE)
ckpt_path = 'model/model_last_inference.safetensors'
vocab_path = 'model/vocab.txt'
model_cfg = dict(dim=1024, depth=22, heads=16, ff_mult=2, text_dim=512, conv_layers=4)
model_obj = load_model(model_cls=DiT, model_cfg=model_cfg, ckpt_path=ckpt_path, vocab_file=vocab_path)

accentizer = RUAccent()
accentizer.load(
    omograph_model_size="turbo3",
    use_dictionary=True,
    workdir=RUACCENT_DIR,
)

def generate(text, out_path, ref):
  ref_file, ref_text = preprocess_ref_audio_text(ref_audio_orig=ref[0], ref_text=ref[1])
  gen_text = accentizer.process_all(text) + ' '

  wav, sr, _ = infer_process(
    ref_audio=ref_file,
    ref_text=ref_text,
    gen_text=gen_text,
    model_obj=model_obj,
    vocoder=vocoder,
    cross_fade_duration=0.15,
    nfe_step=64,
    speed=1,
    device=DEVICE,
  )

  sf.write(file=out_path, data=wav, samplerate=sr)
  return out_path

ref = (
  'reference.wav',
  'Правительство утвердило финансирование государственной программы «Искусственный интеллект в помощь сельскому жителю».'
)
gen_text = 'Правительство'

generate(text=gen_text, out_path="output.wav", ref=ref)

С RuAccent и без, с infer_process или с infer_batch_process, через API и через функцию, запись в файл или отправку в аудиострим, установка через pip или через клон репозитория в github. Я даже версии f5-tts менял с 1.1.5 до 1.1.7.
Использовал "F5TTS_v1_Base_v2/model_last_inference.safetensors" и "F5TTS_v1_Base/vocab.txt", python 3.10 (uv), torch 2.6.0+rocm6.2.4, torch 2.5.1+rocm6.2 или torch 2.7.1+rocm6.3, Nobara Linux 42.

Длинные текста из примеров на странице misha24-10.github.io/Misha24-10 генерируются на 99% нормально, но стоит мне написать 1-4 слова, я часто получаю пустое аудио или с куском одного слова, или с одним словом из нескольких. По времени генерации, звукам видеокарты и её нагрузке видно, что генерация происходит, также по чанкам отправляемым в аудиострим видно что там не нули и по размеру они такие какие должны быть. Ощущение что оно генерируется, но аудиоданные сдвигаются относительно конечного аудиофайла или чанков стрима.

Что вы используете и что мне делать чтобы оно генерировало любой текст с любым размером?

Попробовал сгенерить одно слово из вашего примера, генерировал 10 раз:
4 - нормально
1 - обрезано
5 - тишина
Вы не один)
Как поправить не знаю, предполагаю проблема из датасета (но не тестил так базовую модель)

Updated:
Провернул то же самое с моделью F5-TTS_RUSSIAN/F5TTS_v1_Base/model_240000_inference.safetensors
Результаты:
4 - нормально
3 - обрезано
3 - тишина

Привет, действительно, есть такая проблема с моделью (это скорее с самой моделью, нежели с версиями). Можешь скинуть пример аудиофайла?

Пока возможные пути решения это - изменить немного параметры инференса. Добавить дополнительно точку для текста генерации, например:
gen_text = '. Правительство.'
Такой способ не тестировал, возможно поможет.
Или ждать следующую версию, возможно там с этим будет чуть лучше)

Sign up or log in to comment