Если вы, как и я, гоняете всю нейронку через OpenRouter, потому что на балансе OpenAI пусто, то держите неприятный сюрприз, на который я наткнулся прямо посреди сборки SceneX. OpenRouter проксирует только текстовые модели, а вот транскрипцию Whisper и эмбеддинги через него не получить никак, вообще никак. То есть текст и семантику он гоняет нормально, а распознавание речи и векторы нет, и пайплайн на этом месте просто встаёт колом. Решение в итоге оказалось простым и рабочим: текстовые вызовы оставить на OpenRouter, а распознавание речи и эмбеддинги увести на локальные модели прямо на маке, и тогда всё снова едет.
С чего вообще началась эта история с OpenRouter
У меня банально не было баланса на OpenAI, а пополнить его — отдельный квест, который я так и не осилил. Я тогда так и сформулировал ассистенту: «Короче я бы рад дать опенаи, но я хз как пополнить баланс там». Думаю, ситуация знакомая многим, кто сидит из России и пытается платить за зарубежные сервисы. Поэтому всю нейронку в проектах я перевёл на OpenRouter, это такой шлюз, который проксирует кучу разных моделей через один ключ и один эндпоинт, и платить там получается проще. Про сам переезд я уже подробно расписывал в посте про то, как два проекта умерли одновременно из-за денег на OpenAI, так что повторяться не буду, скажу только, что для текстовых задач OpenRouter зашёл отлично и вопрос закрыл.
Прелесть ещё и в том, что переезжать почти ничего не пришлось переписывать. Текстовые вызовы как шли через OpenAI SDK, так и идут, я просто подменил base_url на адрес OpenRouter, и всё, тот же код, тот же интерфейс, другой провайдер под капотом. Для генерации текста, для всякой семантической логики на чат-моделях это работает идеально, и я уже было расслабился, что вопрос с нейросетями закрыт на всех проектах одним махом.
SceneX и где всё сломалось
SceneX — это мой прототип, который автоматом нарезает короткие видео из фильмов. И пайплайн там устроен так, что без двух вещей он просто мёртв. Во-первых, надо распознать речь в видео, то есть прогнать аудио через транскрипцию и получить текст с таймкодами. А во-вторых, надо эту речь и сцены векторизовать, получить эмбеддинги, чтобы потом по смыслу находить нужные куски и собирать из них ролик. То есть и Whisper для транскрипции, и эмбеддинги тут держат всю конструкцию, без них резать нечего и не из чего.
И вот тут меня и накрыло. Текстовые модели через OpenRouter летают, всё прекрасно, а когда дошло до транскрипции и до эмбеддингов, выяснилось, что OpenRouter их не проксирует. Совсем. Он берёт на себя только текстовые модели, а аудио-в-текст и векторизацию нет, это просто не его профиль. То есть половина пайплайна у меня висит на провайдере, который физически не умеет делать то, что мне нужно, и никакой подменой base_url это не лечится, потому что лечить там нечего, таких эндпоинтов у него просто не существует. Кстати, ровно об эту же стену я уже бился в Картаре — там голосовой ввод через OpenRouter не работал в принципе, так что грабли знакомые.
Можно было психануть и пойти заводить баланс на OpenAI любой ценой, ведь там и Whisper есть, и эмбеддинги. Но я же ровно от этого и убегал, у меня не было способа туда нормально закинуть денег, с этого вся история и закрутилась. И получился замкнутый круг: на OpenAI не плачу, а на OpenRouter ровно того, что мне надо, как раз и нет.
Что в итоге сделал: локальные модели на маке
Разрулил я это разделением по слоям, и оно оказалось даже логичнее, чем тащить вообще всё в одно облако. Текст и семантику на чат-моделях оставил на OpenRouter, там он силён и дёшев. А распознавание речи и эмбеддинги увёл на локальные модели прямо на свой мак, чтобы они не зависели ни от какого провайдера и крутились у меня на машине.
Для транскрипции взял faster-whisper, это реализация Whisper на CTranslate2, которая нормально молотит на CPU, то есть даже без видеокарты мак тянет распознавание речи без боли. Тут, кстати, есть и альтернатива под Apple Silicon — про то, почему я в другой утилите выбрал mlx-whisper вместо faster-whisper, я разбирал отдельно. А для эмбеддингов поставил sentence-transformers с моделью multilingual-e5-small, она выдаёт векторы на 384 размерности, мультиязычная, лёгкая, и для моих задач по семантическому поиску кусков её хватает за глаза. Вышло так, что текст идёт в облако, а тяжёлая для бюджета часть, речь и векторы, работает локально и бесплатно после установки.
Один нюанс, к которому стоит быть готовым: при первом запуске оно тянет сами модели, и весит этот первый прогон где-то 325 МБ. То есть в первый раз вы ждёте, пока всё скачается, а дальше оно уже работает с диска без интернета. Мелочь, но если запускаете на свежей машине или в контейнере, заложите это время и место заранее, чтобы не словить сюрприз там, где не ждали.
Что я из этого вынес про бюджет и провайдеров
Бюджет на всю нейронку по проектам у меня 10–50 долларов в месяц, не больше, и я считаю каждую копейку, которая утекает на API. И эта история отлично показала, что не всё надо тащить в облако только потому, что так привычнее. Транскрипция и эмбеддинги — это ровно те задачи, которые прекрасно живут локально, не жрут токены и не зависят от того, есть у меня баланс на каком-то сервисе или нет. А значит, и платить за них никому не надо.
И ещё момент, который мне кажется важным для всех, кто строит что-то на ии для автоматизации своих процессов. Прежде чем завязывать весь пайплайн на одного провайдера, проверьте, что он реально умеет всё, что вам надо, а не только то, что красиво лежит на витрине. OpenRouter — отличная штука для текстовых моделей и для разработки с ии в целом, но это шлюз именно текстовых моделей, и Whisper с эмбеддингами он не закрывает, и хорошо, если вы узнаете это до того, как полпроекта легло на его плечи, а не посреди сборки, как я.
Так что схема, которую я теперь держу в голове, такая: текст и логику — в облако через OpenRouter, потому что там дёшево и удобно, а речь и векторы — локально, потому что так надёжнее и не зависит от баланса. Звучит как очевидность, согласен, но к этой очевидности я пришёл через сломанный пайплайн и пару часов недоумения, так что если эта заметка сэкономит вам эти часы, значит, написал не зря. Весь код, как обычно, писал не я руками, а Claude Code под моим управлением, я оркестрировал, а нейросеть собирала, и в этом смысле даже сам разбор «почему не работает и куда переезжать» мы прошли вместе. Вот и делайте выводы.