Top.Mail.Ru
Ответы

Подскажите, кто знаком с PyTorch, а точнее с TorchScript и libtorch c++

Я пытаюсь переписать синтез голоса silero tts на c++

Внутри оригинальной модели лежит питоновский файл, в котором инициализируется класс с помощью функции __init__

12345
 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, этот питоновский файл соответственно удаляется
и как тогда можно узнать откуда берутся эти аргументы?

Пробовал вывести список атрибутов модели,

123
 for (const auto& attr : model.named_attributes()) { 
	std::cout << attr.name << std::endl; 
} 

но там имена не совпадают с питоном

По дате
По рейтингу
Аватар пользователя
Ученик
4мес

Вы правы, что аргументы, такие как 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. Там могут быть примеры использования модели, включая загрузку конфигурационных данных.