Смена тембра голоса (RVC) на Windows без fairseq — плюс честная проверка результата.
RVC меняет тембр уже готового звука, а не синтезирует речь:
текст → синтез (edge-tts / silero) → wav → RVC → wav нужным голосом
Библиотека закрывает три вещи, на которых обычно всё встаёт.
fairseq==0.12.2 под Windows с torch 2.x не компилируется — C++ расширения.
В этом и стена.
Но fairseq нужен RVC ровно в одном месте — загрузке эмбеддера ContentVec:
# modules/vc/utils.py — единственный жёсткий импорт в рабочем пути
from fairseq import checkpoint_utilsЗдесь он заменён на ONNX-версию той же модели. Тот же ContentVec, те же признаки, только без fairseq:
from rvc_studio.patch import OnnxContentVec
shim = OnnxContentVec("base_model/content_vec_500.onnx", device="cuda:0")
# подменяем load_hubert — см. patch.pyПодробный разбор и пошаговая инструкция: docs/fairseq.md.
faiss.read_index() открывает файл через C++ fopen, который не понимает
не-ASCII пути. Файл на месте, а в логе «No such file or directory».
Опаснее всего то, что в готовых реализациях это обёрнуто в try/except:
конвертация тихо идёт без индекса, лог чистый, результат просто хуже.
Вы об этом не узнаете.
from rvc_studio.patch import read_index_unicode
index = read_index_unicode(r"E:\голоса\Персонаж\model.index")Обычные способы врут:
| Способ | Почему не годится |
|---|---|
| ASR (Whisper) | врёт на самом синтезе: «все системы запущены» → «все системы запрещены» |
| Усреднённые MFCC | косинус 0.95+ на любой речи, порог бесполезен |
| Спектральный центроид | «улучшается» и нужным тембром, и простым задавливанием верха |
| Разборчивость | 48.8% против 46.9% — искажения не видно, а ухо слышит |
Работают три метрики, и они в комплекте:
from rvc_studio import quality
report = quality.compare("in.wav", "out.wav")
for note in report["notes"]:
print("•", note)
# • сигнал пересобран вокодером — конвертация действительно произошла
# • контур тона сохранён (корреляция 0.95)
# • форманты на месте — гласные не искажены| Метрика | Норма | Что означает |
|---|---|---|
| Корреляция формы волны | |corr| < 0.3 | сигнал пересобран вокодером |
| Контур тона | > 0.9 | содержание речи сохранено |
| Форманты (LPC) | ΔF1 < 40, ΔF2 < 60 Гц | гласные не искажены |
Главное: если корреляция формы волны ~0.99 — это плохо. Сигнал прошёл насквозь, RVC не сработал. «Похоже на вход» — не хороший признак.
Разбор метрик и порогов: docs/quality.md.
pip install numpy # минимум: метрики и разбор моделей работают без torch
# для самой конвертации
pip install torch torchaudio librosa scipy soundfile faiss-cpu onnxruntime \
praat-parselmouth pyworld torchcrepe resampy tqdmrvc_python вендорится, а не ставится: вы будете править его внутренности.
pip download rvc-python --no-deps -d tmp
unzip tmp/rvc_python-*.whl -d tmp/x
cp -r tmp/x/rvc_python libs/rvc_python# что вообще есть в папке (torch не нужен)
python -m rvc_studio voices --voices-dir "E:\голоса"
# сконвертировать и сразу проверить
python -m rvc_studio convert --voice Narrator --input in.wav --output out.wav
# проверить уже готовую пару файлов
python -m rvc_studio doctor --input in.wav --output out.wav
# веб-интерфейс
python -m rvc_studio serve # голос индекс размер замечание
──────────────────────────────────────────────────────────────
1 Narrator есть 42.1 МБ
2 Child есть 38.4 МБ
3 Old copy — без индекса — похожесть будет хуже
Перетащить WAV, выбрать модель, подвигать ползунки, послушать «оригинал / результат» переключателем и сразу увидеть разбор: форма волны, контур тона, форманты, выводы человеческим языком.
Сервер на стандартной библиотеке — фреймворк ради одной страницы не нужен. Слушает только localhost.
from rvc_studio import RvcEngine, quality, find_voices, find_duplicates
# дубликаты — бесплатно и мгновенно
print(find_duplicates(find_voices(r"E:\голоса")))
# [['Child', 'Copy']] — один голос под двумя именами
engine = RvcEngine(voices_dir=r"E:\голоса", lib_dir="libs/rvc_python")
engine.load_voice("Narrator")
engine.convert_file("in.wav", "out.wav", f0_up_key=-2, index_rate=0.5)Движок создаётся один раз и держит внутри тяжёлые объекты — иначе будете ждать 8 секунд там, где нужно 1.6.
| Операция (GTX 1650 SUPER, 4 ГБ, fp32, 40 кГц) | Время |
|---|---|
| Создание движка | 7–8 с |
| Загрузка голоса | ~1.5 с |
| Конвертация 7.4 с звука, холодная | 12 с |
| Конвертация, прогретая | 1.6 с (×4.5 к реальному времени) |
Транспонирование — плохая замена подходящему источнику. Низкий мужской синтез (~100 Гц) под детский голос требует +24 полутона и всё равно звучит натужно. Дешевле взять высокий источник.
итог = тон_источника × 2^(сдвиг / 12)
Меняйте тембр, а не высоту — иначе непонятно, что именно помогло.
Пресеты живут в presets.json, пример — examples/presets.example.json.
pip install numpy
python -m unittest discover -s tests -t .
# Ran 112 tests — OKМетрики качества, разбор моделей, поиск дубликатов и раскладка отчётов проверяются без torch: сигналы синтезируются прямо в тестах.
Как это собиралось, на чём я спотыкался и почему привычные способы проверки врут: docs/article.md.
Voice conversion (RVC) on Windows without fairseq, with honest result verification.
- No fairseq. It fails to build on Windows with torch 2.x. It is needed in
exactly one place — loading the ContentVec embedder — which is replaced by an
ONNX version of the same model (
patch.py). - Cyrillic paths break faiss silently.
faiss.read_index()uses a C++fopenthat cannot handle non-ASCII paths. Wrapped intry/except(as it is in most implementations), conversion quietly proceeds without the index and you never find out. - Verification that actually works. ASR lies on synthesized speech, MFCC gives 0.95 for any voice, spectral centroid is gamed by simply rolling off the top end. This uses waveform correlation (should be near zero — the vocoder rebuilds the signal), log-scale pitch contour correlation, and LPC formants.
- Zero-dependency core.
audio,quality,voicesandreportneed only numpy — you can audit a model folder or check finished files without a GPU.
MIT licensed.
Инструмент для работы с моделями, на которые у вас есть права, и с голосами персонажей. Подделка речи реальных людей — не то, для чего это сделано.
MIT. См. LICENSE.
