FBTTS API

FrostBound TTS - это современное решение для интеграции синтеза речи (Text-to-Speech) в ваши проекты на платформе Garry's Mod и других совместимых системах. Наш продукт позволяет легко и быстро добавить поддержку голосовых сообщений, автоматическую озвучку чата.

Возможности:

Технические детали: Данная TTS система изначально разрабатывалась для личного использования и хостится на локальной машине с видеокартой RTX 5090.

Временные ограничения: В настоящий момент потоковая генерация речи временно недоступна, но TTS находится в раннем доступе. В ближайшее время планируется запуск новой модели, которая будет в 100 раз лучше, способна на эмоции и многое другое.

Пример новой модели с эмоциями:

Стоимость: Базовая цена составляет ~1000 рублей в месяц. Итоговая стоимость может быть выше и зависит от масштаба и специфики вашего проекта (например, количество пользователей, нагрузка, дополнительные функции).

Связь и консультации: По всем вопросам, предложениям и для получения консультации по интеграции обращайтесь в нашу группу ВКонтакте: https://vk.com/an1meworid. Мы оперативно ответим, поможем с настройкой и реализацией, а также подберём оптимальное решение под ваши задачи.

Примеры текущей модели:

Серверная часть

1. Получение API ключа


TTSKey = TTSKey or nil

timer.Create("TTSKeyUpdate", 300, 0, function()
    http.Post("http://95.31.52.58:55453/get_apikey", {
        user = "login",
        pass = "password"
    }, function(body)
        local data = util.JSONToTable(body)
        if data and data.apikey then
            TTSKey = data.apikey
            for _, ply in pairs(player.GetAll()) do
                ply:SetNWString("TTSKey", TTSKey)
            end
        else
            print("Ошибка получения ключа:", body)
        end
    end, function(err) print("HTTP ошибка:", err) end)
end)

Получение и обновление ключа нужно для того чтобы никто не мог пользоваться вашим аккаунтом, после получения ключ распределяется всем игрокам через NWString, 300 секунд или более достаточно для базового примера.

2. Даём ключ и получаем модель голоса при входе игрока (Если вы хотите его сохранять)

hook.Add("PlayerInitialSpawn", "ChangeTTSVoice", function(ply)
    if not IsValid(ply) then return end
    ply:SetNWString("TTSModel", ply:GetInfo("TTSModel"))
    ply:SetNWString("TTSKey", TTSKey)
  end)

3. Команда смены голосов для клиентов

concommand.Add("ChangeTTSVoice", function(ply, cmd, args)
    local model = args[1]
    if not model then return end
    ply:SetNWString("TTSModel", model)
  end)

Клиентская часть

1. Получение голосов

http.Fetch("http://95.31.52.58:55453/GetModels", function(body)
    print(body)
end)

2. Воспроизведение звука при сообщениях в чат

local function URLToStr(text)
    return text:gsub("([^%w%-%.%_%d])", function(c) return string.format("%%%02X", string.byte(c)) end)
end

local stations = {}
CreateClientConVar('TTSModel', '', true, true)

// Для DarkRP: OnPlayerChat
// Для Helix: MessageReceived
// Для NutScript: OnChatReceived

hook.Add("OnPlayerChat", "TTSVoice", function(ply, strText, bTeam, bDead)
    if not IsValid(ply) or not ply:IsPlayer() then return end
    if ply ~= LocalPlayer() and ply:IsMuted() then return true end
    if not ply:GetNWBool('DonateTTs') then return end
    local model = ply:GetNWString('TTSModel', '')
    if model == '' then return end
    if IsValid(stations[ply]) then stations[ply]:Stop() end
    sound.PlayURL('http://95.31.52.58:55453/tts?key=' .. LocalPlayer():GetNWStringLocal('TTSKey') .. '&model=' .. model .. '&text=' .. URLToStr(strText), '3d', function(station)
        if not IsValid(station) or not IsValid(ply) then return end
        station:SetPos(ply:GetPos())
        station:SetVolume(0.7)
        stations[ply] = station
    end)
end)

hook.Add("EntityRemoved", "TTSVoiceCleanup", function(ent)
    if IsValid(stations[ent]) then stations[ent]:Stop() end
    stations[ent] = nil
end)

Небольшой пример что будет на вашем проекте после установки нашей TTS