Lines

INVENTED
WORLDS

Нейронные сети (звук)

Эмулятор голоса RVC

https://huggingface.co/datasets/Ba1yya/RVC_rmvpe/tree/main см. Общий генератор аудио

Разделение записи на отрезки

pip install pydub
from pydub import AudioSegment
from pydub.silence import split_on_silence

# Нормализация
def match_target_amplitude(aChunk, target_dBFS):
    ''' Нормализация полученных отрезков '''
    change_in_dBFS = target_dBFS - aChunk.dBFS
    return aChunk.apply_gain(change_in_dBFS)

song = AudioSegment.from_mp3("Misha.mp3")
chunks = split_on_silence (
    song, 
    # время длительности тишины.
    min_silence_len = 1000,
    # порог тишины
    silence_thresh = -60
)

# Нарезка треков
for i, chunk in enumerate(chunks):
    # отступ тишины.
    silence_chunk = AudioSegment.silent(duration=500)
    # склейка.
    audio_chunk = silence_chunk + chunk + silence_chunk
    # нормализация по громкости.
    normalized_chunk = match_target_amplitude(audio_chunk, -20.0)
    # экспорт.
    print("Exporting chunk{0}.mp3.".format(i))
    normalized_chunk.export(
        ".//chunk{0}.mp3".format(i),
        bitrate = "192k",
        format = "mp3"
    )

Для WAV

from pydub import AudioSegment
from pydub.silence import split_on_silence

# Нормализация
def match_target_amplitude(aChunk, target_dBFS):
    ''' Нормализация полученных отрезков '''
    change_in_dBFS = target_dBFS - aChunk.dBFS
    return aChunk.apply_gain(change_in_dBFS)

# Загрузка аудио из WAV файла
song = AudioSegment.from_wav("Misha.wav")

# Разделение на отрезки по тишине
chunks = split_on_silence(
    song,
    min_silence_len=1000,
    silence_thresh=-60
)

# Нарезка и обработка треков
for i, chunk in enumerate(chunks):
    # отступ тишины
    silence_chunk = AudioSegment.silent(duration=500)
    # склейка
    audio_chunk = silence_chunk + chunk + silence_chunk
    # нормализация по громкости
    normalized_chunk = match_target_amplitude(audio_chunk, -20.0)
    # экспорт в WAV
    print("Exporting chunk{0}.wav.".format(i))
    normalized_chunk.export(
        ".//chunk{0}.wav".format(i),
        format="wav"
    )

Генератор музыки MusicGen

git clone https://github.com/facebookresearch/audiocraft

находясь внутри директории audiocraft

python -m pip install -e .

Скопировать musicgen_app.py из demos в корень audiocraft и запустить

python musicgen_app.py

Длинна вставляемой музыки для образца не больше 30 секунд см. Общий генератор аудио

Общий генератор аудио

https://github.com/gitmylo/audio-webui/

git clone https://github.com/gitmylo/audio-webui/

Запуск из run.bat Обновление из update.bat Дополнительно поставить tensorboardX

source venv/Scripts/activate
pip install tensorboardX

RVC создать 40к v2 RVC во вкладке train. Указать путь к wav файлу с записанными фразами. Можно самому не делить. Тренировать и преобразовывать на torchcrepe (torchcrepe hop length = 256) или на rmvpe. Для тренировки использовать фразы только на одном языке. rmvpe 300 эпох с Filter radius = 3 Обученные модели класть в C:\Music_NW\audio-webui\data\models\rvc\имя_модели В барк модели использовать профиль v2/ru_4 Text temperature = 0.65 Waveform temperature = 0.05 min end of audio probability = 0.05 В преобразовании torchcrepe hop length = 256 Index rate for feature retrieval = 0 (иногда 1 даёт лучшей результат, зависит от исходной записи) Filter radius = 0 Protect amount = 0

Изменение голоса в режиме реального времени

https://github.com/w-okada/voice-changer/blob/master/README_en.md Виртуальный аудио кабель https://vb-audio.com/Cable/index.htm Скачать последнюю версию для win (MMVCServerSIO_win_onnxgpu-cuda_v.1.5.3.17b.zip), PyTorch(cpu,cuda) https://huggingface.co/wok000/vcclient000/tree/main Запускать из start_http.bat Extra на максимум — 131072 Модель rmvpe Chunk в зависимости от задержки, минимум от 256 — 320 В дискорде: Выключить автоматическое шумоподавление Выключить автоматическая регулировка усиления

Соединение 2 треков в один

https://rave.dj/mix

SUNO

https://suno.com/create Если надо продлить трек или взять его стиль — Extend Чтобы поменять слова в песне: Подготовить в AdobeAudition (если авторские права) — Пресеты — Time and Pitch — Pitch Shifter. Тон на 3 сдвинуть (-мужской, +женский), cents на 12 в ту же сторону. Применить — Apply. При добавлении своих слов не добавлять никаких стилей. В Style of Music: pop, rock, electro, female vocal, earworm Пример разметки в Lyrics:

[Intro]
СтАло слОжно так педагогом быть. 
Покричать нельзя, с уроков отпустить. 
Сочинения надо проверять, 
Личные дела в школе заполнять. 

[Instrumental Interlude]
 
[Verse 1]
Что же делать нам, как же повлиять? 
Надо всех жалеть, ещё и обучать. 
Классный час, зачем? Ведь восьмой урок. 
Как же трудно, но... Но я педагог! 
 
[Bridge]
Хэхэ-хэ-хэ-хэй! Танцуй! 
 
[Pre-Chorus]
Дети, я учИтель, по партам не скачИте, 
Костя, хватит драться, ты уже большОй. 
Дети, я учИтель, я друг, а не мучИтель, 
Вы потом поймёте, пАру лет спустя. 

[Piano Solo]
 
[Verse 2]
Дежурство уроки. Моя жизнь. 
Сегодня контрольная. Мозг мой держись, 
Журналы, тетради для кого-то совет 
Храню я в памяти этот секрет 
 
[Verse 3]
Свобода формы, свобода мыслей 
Чем больше учишь, тем интересней 
Дети, приколы, коллеги, уроки 
Я педагог, это не просто строки 
 
[Verse 4]
Пусть польётся пляс и формат слетит. 
В школу я иду, пусть грызу гранит 
Праздник жизни тут и улыбок строй 
Ты готов? Со мной эту песню пой! 
 
[Chorus]
Любимая родная! Душу согревает. 
В школе мы как дома. Дружная семья. 

Любимая родная! Душу согревает. 
В школе мы как дома. Дружная семья. 
 
Любимая родная! Душу согревает. 
В школе мы как дома. Дружная семья. 
 
[Outro]
Любимая родная! Душу согревает. 
В школе мы как дома. Дружная семья. 

[End]

OmniVoice

Клонируем репозиторий https://github.com/k2-fsa/OmniVoice.git Создаём виртуальное окружение Устанавливаем библиотеки

pip install -e .

Для запуске на GPU

pip uninstall torch torchaudio -y
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu128

Скрипт для теста

"""Один раз загружает OmniVoice, затем в терминале вводите текст (одна строка — один WAV).

Запуск из корня репозитория после `pip install -e .`:

    python examples/interactive_tts.py

Клонирование голоса по образцу:

    python examples/interactive_tts.py --ref_audio ref.wav --ref_text "что сказано на записи"

Описание голоса (voice design), без образца:

    python examples/interactive_tts.py --instruct "female, British accent"
"""

from __future__ import annotations

import argparse
import logging
from datetime import datetime
from pathlib import Path

import soundfile as sf
import torch

from omnivoice.models.omnivoice import OmniVoice


def _best_device() -> str:
    if torch.cuda.is_available():
        return "cuda"
    if torch.backends.mps.is_available():
        return "mps"
    return "cpu"


def main() -> None:
    logging.basicConfig(
        format="%(asctime)s %(levelname)s %(message)s",
        level=logging.INFO,
        force=True,
    )

    p = argparse.ArgumentParser(
        description="Интерактивное озвучивание в терминале (OmniVoice)"
    )
    p.add_argument(
        "--model",
        default="k2-fsa/OmniVoice",
        help="Идентификатор на Hugging Face или локальный путь к чекпоинту",
    )
    p.add_argument(
        "--device",
        default=None,
        help="Устройство: cuda, mps или cpu; если не указано — выбор автоматически",
    )
    p.add_argument(
        "--out_dir",
        type=Path,
        default=Path("tts_terminal_out"),
        help="Папка для сохранения сгенерированных WAV-файлов",
    )
    p.add_argument(
        "--ref_audio",
        type=str,
        default=None,
        help="Путь к референсному аудио для клонирования голоса (WAV предпочтительно)",
    )
    p.add_argument(
        "--ref_text",
        type=str,
        default=None,
        help="Текст, соответствующий ref_audio; если не задан — автотранскрипт (Whisper)",
    )
    p.add_argument(
        "--instruct",
        type=str,
        default=None,
        help="Инструкция для режима voice design (без ref_audio), напр. пол, акцент",
    )
    p.add_argument(
        "--language",
        type=str,
        default=None,
        help="Язык: имя (например Russian) или код (например ru)",
    )
    p.add_argument(
        "--num_step",
        type=int,
        default=32,
        help="Число шагов диффузии (меньше — быстрее, грубее)",
    )
    p.add_argument(
        "--speed",
        type=float,
        default=1.0,
        help="Темп речи: >1 быстрее, <1 медленнее",
    )
    args = p.parse_args()

    device = args.device or _best_device()
    args.out_dir.mkdir(parents=True, exist_ok=True)

    logging.info("Загрузка модели %s на устройстве %s …", args.model, device)
    model = OmniVoice.from_pretrained(
        args.model, device_map=device, dtype=torch.float16
    )
    logging.info(
        'Готово. Введите строку и нажмите Enter; пустая строка или «:q» — выход. Ctrl+C — прервать.'
    )

    session = datetime.now().strftime("%Y%m%d_%H%M%S")
    n = 0
    while True:
        try:
            line = input("Озвучить> ")
        except EOFError:
            break
        text = line.strip()
        if not text or text in (":q", ":quit", "exit", "quit"):
            logging.info("Выход.")
            break

        n += 1
        out_path = args.out_dir / f"{session}_{n:04d}.wav"
        logging.info("Синтез (%d симв.) → %s", len(text), out_path)
        audios = model.generate(
            text=text,
            language=args.language,
            ref_audio=args.ref_audio,
            ref_text=args.ref_text,
            instruct=args.instruct,
            num_step=args.num_step,
            speed=args.speed,
        )
        sf.write(str(out_path), audios[0], model.sampling_rate)
        logging.info("Сохранено.")


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        logging.info("Прервано пользователем.")

Комментарии

Комментариев пока нет.