Отключение звука рекламы на телевизоре через ИИ

В моём вопросе я спрашивал что мне делать во время рекламы? Наверно я что то пропустил в этой жизни, если человек элементарно не понимает о чём разговор. Кто же из нас тупит - вопрос.

его опять накрыло, пошел в каждой теме отмечаться и посты старые подымать.
не обращай ты внимания.

а у меня еще идейка появилась, можно еще нейроинтерфейс попытаться заточить под управление звуком, для этого я думаю будет достаточно испытывать негативные эмоции, и их то заметит… но это не точно… а как включать обратно надо подумать…

вооо даже готовый модуль продается https://aliexpress.ru/item/1005004567488199.html

что думать, по ИИ ТСу уже всю информацию выдали, работающий код тоже не проблема, просто он ленивая до нельзя задница это раз,
не в состоянии обучить модель своим хотелкам это два, да ещё и пургу несёт!
Код, рабочий, ESP32S3

#include "TFLiteMicro_ArduinoESP32S3.h"
#include "micro_speech_quantized_model.h"

#include "audio_provider.h"
#include "command_responder.h"
#include "feature_provider.h"
#include "micro_model_settings.h"

// Добавляем библиотеку для работы с IR
#include <IRremote.h>

// Пины для IR передатчика
#define IR_LED_PIN 15  // Пин для IR передатчика

// Globals
namespace
{
  FeatureProvider *feature_provider = nullptr;
  int32_t previous_time = 0;
  int8_t feature_buffer[kFeatureElementCount];
  int8_t *model_input_buffer = nullptr;
  
  // Переменные для управления звуком телевизора
  bool tv_muted = false;
  bool last_command_sent = false;
  unsigned long last_command_time = 0;
  const unsigned long COMMAND_COOLDOWN = 2000; // Задержка между командами (мс)
  
  // IR коды для Samsung TV (стандартные NEC коды)
  const uint32_t SAMSUNG_POWER = 0xE0E040BF;     // Кнопка Power
  const uint32_t SAMSUNG_MUTE = 0xE0E0F00F;      // Кнопка Mute (отключение звука)
  const uint32_t SAMSUNG_VOL_UP = 0xE0E0E01F;    // Громкость +
  const uint32_t SAMSUNG_VOL_DOWN = 0xE0E0D02F;  // Громкость -
  
  // Создаем объект с уникальным именем, не конфликтующим с библиотекой
  IRsend tv_ir_sender;  // Изменено имя с IrSender на tv_ir_sender
} // namespace

// Функция управления звуком телевизора
void controlTvMute(bool mute)
{
  if (mute) {
    Serial.println("Выключение звука телевизора...");
    tv_ir_sender.sendNEC(SAMSUNG_MUTE, 32);
    tv_muted = true;
    Serial.println("Звук выключен");
  } else {
    Serial.println("Включение звука телевизора...");
    tv_ir_sender.sendNEC(SAMSUNG_MUTE, 32);
    tv_muted = false;
    Serial.println("Звук включен");
  }
  last_command_sent = true;
  last_command_time = millis();
}

// Функция для определения команды по результатам распознавания
void processVoiceCommand(int detected_index, float score)
{
  // Проверяем, не прошло ли еще время ожидания после последней команды
  if (last_command_sent && (millis() - last_command_time) < COMMAND_COOLDOWN) {
    Serial.println("Ожидание перед следующей командой...");
    return;
  }
  
  if (score > 0.8f) {
    const char* command = kCategoryLabels[detected_index];
    
    if (strcmp(command, "yes") == 0) {
      if (!tv_muted) {
        Serial.println("Команда 'yes' - выключить звук");
        controlTvMute(true);
      } else {
        Serial.println("Звук уже выключен");
      }
    }
    else if (strcmp(command, "no") == 0) {
      if (tv_muted) {
        Serial.println("Команда 'no' - включить звук");
        controlTvMute(false);
      } else {
        Serial.println("Звук уже включен");
      }
    }
  }
}

void setup()
{
  // Инициализируем последовательный порт для отладки
  Serial.begin(115200);
  while (!Serial);
  
  Serial.println("Инициализация системы...");
  
  // Инициализация IR передатчика
  tv_ir_sender.begin(IR_LED_PIN);
  Serial.print("IR передатчик инициализирован на пине ");
  Serial.println(IR_LED_PIN);
  
  // Инициализация TFLite модели
  TFLMinterpreter = TFLMsetupModel<TFLMnumberOperators, 20000>(TFLM_micro_speech_quantized_model, TFLMgetResolver);

  if (!TFLMinterpreter) {
    Serial.println("The model was not setup correctly.");
    for(;;){}
  }

  if ((TFLMinput->dims->size != 2) || (TFLMinput->dims->data[0] != 1) ||
      (TFLMinput->dims->data[1] != (kFeatureCount * kFeatureSize)) ||
      (TFLMinput->type != kTfLiteInt8))
  {
    Serial.println("Bad input tensor parameters in model");
    return;
  }
  
  model_input_buffer = tflite::GetTensorData<int8_t>(TFLMinput);

  static FeatureProvider static_feature_provider(kFeatureElementCount, feature_buffer);
  feature_provider = &static_feature_provider;

  previous_time = 0;
  
  Serial.println("Система готова. Жду команд 'yes' (выкл звук) или 'no' (вкл звук)");
}

void loop()
{
  const int32_t current_time = LatestAudioTimestamp();
  int how_many_new_slices = 0;

  TfLiteStatus feature_status = feature_provider->PopulateFeatureData(previous_time, current_time, &how_many_new_slices);
  if (feature_status != kTfLiteOk)
  {
    Serial.println("Feature generation failed");
    return;
  }
  
  previous_time = current_time;

  if (how_many_new_slices == 0)
  {
    return;
  }

  for (int i = 0; i < kFeatureElementCount; i++)
  {
    model_input_buffer[i] = feature_buffer[i];
  }

  TFLMpredict();

  float output_scale = TFLMoutput->params.scale;
  int output_zero_point = TFLMoutput->params.zero_point;
  int max_idx = 0;
  float max_result = 0.0;

  for (int i = 0; i < kCategoryCount; i++)
  {
    float current_result =
        (tflite::GetTensorData<int8_t>(TFLMoutput)[i] - output_zero_point) *
        output_scale;
    if (current_result > max_result)
    {
      max_result = current_result;
      max_idx = i;
    }
  }

  if (max_result > 0.8f)
  {
    Serial.print("Detected ");
    Serial.print(kCategoryLabels[max_idx]);
    Serial.print(", score: ");
    Serial.println(max_result);
    
    // Обрабатываем голосовую команду
    processVoiceCommand(max_idx, max_result);
  }
  
  // Небольшая задержка для стабильности
  delay(50);
}

и чтобы не говорил, что не компилируется

Скетч использует 574758 байт (43%) памяти устройства. Всего доступно 1310720 байт.
Глобальные переменные используют 100516 байт (30%) динамической памяти, оставляя 227164 байт для локальных переменных. Максимум: 327680 байт.

Включать/выключать и регулировать громкость голосом у меня и сейчас работает через Алису. Опять оппонент пургу несёт, не понимая в чём состоит задача. Может кто то сможет объяснить ему (не хочу опускаться до его один два три в комментариях кто он) что задачу он не понял. Ну да ладно. Видно чел так мир видит. Не буду разочаровывать его в фантазиях.

я как понял с питоном он предлагает делать интернет тв… и так будет работать, и собрать относительно легко… в принципе наверное реально, только вникать надо… и может не совсем то… если вам понравился вариант с нейроинтерфесом… то возможно вам подойдет вариант с mpu6050, фишка в том что крепим на палец, или на браслет, чуть наклоняем и звук выключается,

такое предлагал использовать для протезов, парень предлагал 0 зп в месяц, 10к на датчики мышц, и 50к по факту, ну я ему и выдал результат на эти деньги)))) как же сладко он матюкался)))) и дебилом называл))) кстате 50к за результат разработки протеза не только он предлагал, я в шоке куда катиться мир… так что если это не подходит, не расстраивайтесь, и не ругайтесь, я просто предложил))))

это своеобразный вариант как жать большую кнопку))) только может чуть удобнее…

при чем тут голосом, подключаете в скетч модель по голосу определяющую рекламу, хотите через видео, в примерах есть распознавание рукописного теста 28х28 пикселей и распознавайте маркер рекламы, это библиотека для ИИ, какую модель ей зададите, то она и сделает, делайте что-нибудь уже
Видимо скучно, поговорить захотелось

Для того чтобы кинуться начинать что то делать, надо иметь инструмент, которого пока нет. И потом, уже изучать практически как подключать к вашему скетчу модели рекламные. Всё кроется в нюансах о которых вы не рассказываете, а может и сами не знаете как это делается (пока только теория) Если есть уже проект, то поделитесь. А пока в ваших словах какая то бравада сквозит (смотрите какой я великий). Заказал на всякий случай S3.

поэтому я и сказал, что модели ИИ нет, выделить сигнатуру из видео потока и по ней отработать, как делают все, значительно проще…

ua6em как бы он сейчас ругаться не начал…
доведете же человека…

самое время освоить новую Уно Q :slight_smile: Она появилась на Али примерно за 5-6 тыр
Там и линукс на борту, и какой-то модуль для ИИ, вроде :slight_smile: