Подскажите, кто знаком с PyTorch, а точнее с TorchScript и libtorch c++
Я пытаюсь переписать синтез голоса silero tts на c++
Внутри оригинальной модели лежит питоновский файл, в котором инициализируется класс с помощью функции __init__
class TTSModelMultiAcc_v3():
def __init__(self, ..., symbols, speaker_to_id, symb_ascii_dict={}, ...):
# symbols это - "_~|!+,-.:;?абвгдежзийклмнопрстуфхцчшщъыьэюяё–… "
# speaker_to_id это - {"aidar": 0, "baya": 1, "kseniya": 2 ....}
# symb_ascii_dict - мапа типа {'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g' ... }
Вопрос в том откуда берутся эти аргументы в __init__
Судя по всему они передаются изнутри самой модели.
После конвертации модели в Torchscript, этот питоновский файл соответственно удаляется
и как тогда можно узнать откуда берутся эти аргументы?
Пробовал вывести список атрибутов модели,
for (const auto& attr : model.named_attributes()) {
std::cout << attr.name << std::endl;
}
но там имена не совпадают с питоном
Вы правы, что аргументы, такие как symbols, speaker_to_id и symb_ascii_dict, передаются внутрь модели при её инициализации. После конвертации модели в TorchScript, эти данные могут быть "зашиты" внутри модели или передаваться через внешние конфигурационные файлы. Вот как можно разобраться с этой проблемой:
1. Изучите исходный код модели
Перед конвертацией модели в TorchScript, изучите, как именно инициализируются эти аргументы в оригинальном Python-коде. Возможно, они загружаются из внешних файлов (например, JSON, YAML) или генерируются динамически. Например:
symbols может быть строкой, определяющей алфавит модели.
speaker_to_id может быть словарём, который сопоставляет имена спикеров с их идентификаторами.
symb_ascii_dict может быть словарём для транслитерации символов.
Если эти данные загружаются из файлов, вам нужно будет перенести эти файлы в вашу C++ реализацию.
2. Изучите сконвертированную TorchScript модель
После конвертации модели в TorchScript, Python-код удаляется, но данные, необходимые для инициализации, могут быть сохранены внутри модели. Вы можете попробовать извлечь их:
Используйте torch::jit::Module в C++ для доступа к атрибутам модели.
Проверьте, есть ли в модели атрибуты, содержащие эти данные. Например:
cpp
Copy
for (const auto& attr : model.named_attributes()) {
std::cout << attr.name << std::endl;
}
Если вы видите атрибуты, похожие на symbols, speaker_to_id или symb_ascii_dict, попробуйте извлечь их значения.
3. Используйте внешние конфигурационные файлы
Если данные не сохранились внутри модели, вам нужно будет создать внешние файлы (например, JSON), которые будут содержать:
symbols: строку с символами.
speaker_to_id: словарь с сопоставлением спикеров и их ID.
symb_ascii_dict: словарь для транслитерации.
Затем загрузите эти файлы в вашу C++ программу и передайте данные в модель.
4. Пример работы с TorchScript в C++
Вот пример того, как можно загрузить модель и передать ей данные:
cpp
Copy
#include <torch/script.h> // TorchScript
#include <iostream>
int main() {
// Загрузка модели
torch::jit::script::Module model;
try {
model = torch::jit::load(" model.pt ");
}
catch (const c10::Error& e) {
std::cerr << "Ошибка загрузки модели\n";
return -1;
}
// Пример передачи данных
std::string symbols = "_~|!+,-.:;?абвгдежзийклмнопрстуфхцчшщъыьэюяё–… ";
std::unordered_map<std::string, int> speaker_to_id = {{"aidar", 0}, {"baya", 1}, {"kseniya", 2}};
std::unordered_map<std::string, std::string> symb_ascii_dict = {{"а", "a"}, {"б", "b"}, {"в", "v"}};
// Передача данных в модель
// (Здесь нужно адаптировать код под вашу модель)
std::vector<torch::jit::IValue> inputs;
inputs.push_back(torch::tensor(...)); // Пример входных данных
auto output = model.forward(inputs).toTensor();
std::cout << "Результат: " << output << std::endl;
}
5. Изучите документацию Silero TTS
Если вы используете модель Silero TTS, проверьте их репозиторий на GitHub. Там могут быть примеры использования модели, включая загрузку конфигурационных данных.