Нейронные сети (звук)
Эмулятор голоса 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("Прервано пользователем.")
Комментарии
Комментариев пока нет.