Как стать автором
Обновить

Моя б̶е̶з̶умная колонка: часть вторая // программная

Уровень сложностиПростой
Время на прочтение16 мин
Количество просмотров4.6K
Всего голосов 37: ↑37 и ↓0+48
Комментарии28

Комментарии 28

Я сделал похожую систему с распознаванием и генерацией голоса, но на старом ноутбуке под Linux - одного ключевого слова оказалось маловато, частые ложные срабатывания, ожидание классического "СЛУШАЙ ИМЯ_АССИСТЕНТА" работает лучше.

Ложных срабатываний не наблюдал, были события когда в стороннем источнике звука (просмотр ютуб или фильма) присутствовало имя Альфа или что-то похожее(Алиса например), тогда да, срабатывало. В крайнем случае, можно увеличить порог процента схожести строки, чтобы избежать ложных срабатываний.

Именно такие срабатывания я и обозвал "ложными", ютуб-тестирование их хорошо провоцирует.

Очень редкие события, пару раз за год использования.

Интересно, у нас другой опыт. Разрабатывали для бизнеса голосового помощника (на raspberry pi 5), и быстро пришли к тому, что вся эта затея будет иметь смысл только при условии максимально качественного распознавания как ключевого слова, так и всей речи. К сожалению бесплатные решения, пришлось заменить на коммерческие. Тот же porcupine например, существенно лучше показывает себя в зашумленных помещениях (цех, гараж), да и в офисе откликается в 9 случаев из 10, в то время, как всё остальное, что пробовали, в лучшем случае 7-8 из 10.

Тут нужно понимать, что в статье речь идет о DIY проекте и каких-то супер возможностях, как в коммерческих продуктах, речи не идет. Само собой, что в коммерческих проектах не стоит применять описанные в статье решения, так же стоит учитывать, что при коммерческой разработке бюджет "шире" и команда больше.

Несомненно. Я оставил свой комментарий лишь по той причине, что после прочтения вашей по настоящему полезной статьи, у неискушенного читателя может сложиться обманчивое впечатление, что всё просто, всё работает. Отчасти это так, но и нюансы есть, которые могут выйти на первый план, если задача будет немного отличаться. Воспринимайте это просто как дополнение, а не контраргументы.

P.S. В качестве сценариев, которых нет у Вас в списке, можно добавить отправку заметок в Телеграм (на имя созданного там бота) (хотя ассистент в моей системе ограничен тем, что преобразует в текст только те слова, которые есть в словаре STT, но бывает удобно) и установка таймера (на команду "три", например, ждет три минуты и проигрывает мелодию).

Да, здесь большие возможности по расширению функционала. Можно и в Гугл календарь добавлять заметки и тд/тп/

Отличная статья, молодец!

Где бы готовое железо взять? Может прошиваются уже какие-нибудь серийные колонки?

Это мой эксперимент, цель которого проверить возможность разработки голосового ассистента для умного дома на дешевом железе. В предыдущей статье я описал аппаратную реализацию: https://habr.com/ru/articles/772080/

В теории должно работать на любых устройствах на базе Linux, главное чтобы хватило производительности системных ресурсов.

Спасибо, я уже прочел вашу предыдущую статью. Мне просто не очень хочется "колхозить" корпус, травить плату, и т.д

Вот только что идея появилась: взять какую-нибудь Яндекс-Алису, вынуть из нее все кишки, вставить esp8266 для кнопок и светодиодов, bt-модуль для динамика и микрофона, ну и всё. Всю обработку делать на другом одноплатнике, или мини-пк, или на домашнем сервере, тут уже как нравится. Зато ограничений не будет, хоть LLM там крути на видеокарте. Надо будет попробовать.

Можно заказать печать корпуса и изготовление платы, благо сейчас это не проблема. И никакого "колхоза".

Как дела с безопасностью? Слушается только хозяина или всех? Телевизор? Радио?

Что вы имеете ввиду под безопасностью? Если речь идет о приватности, то все процессы выполняются локально. Я не ставил цели распределение ролей с помощью идентификации голоса. Слушает всех, кто произнесет её имя.

Вместо silero попробуй piper tts, работает лучше и быстрее, цифры читать умеет.

Если задача выживать в бункере не стоит то всё сильно упрощается. Бесплатное распознавание голоса есть у гугла и.. гугла(gemini), работает почти идеально. Бесплатный tts есть у гугла и микрософта, без заморочек с цифрами и сокращениями, и вообще без заморочек.

Бесплатные большие ллм у groq и google gemini, у них заморочки только с проксями.

Бесплатные маленькие ллм - openrouter, там дают ллама3-8б итп мелочевку.

Тут вся фишка в том, чтобы отвязаться от гуглов, яндексов и прочих подобных.

Приватность и изоляция от интернет зависимых сервисов.

Я натыкался на такое DIY решение: https://heywillow.io/

Чувак пилит открытую замену Алексе, но вроде она неразговорчивая, команды выполняет, а TTS нет

Насколько я понял, аппаратная часть его проекта построена на базе esp32, сомнительное решение, ну Ок. Такие вещи лучше строить на базе железа, где есть NPU или графическое ядро. В моем проекте есть возможность использовать API Vulkan встроенного графического ядра, что обеспечивает значительное ускорение работы моделей.

У вас получилось запустить Vulkan на Orange Pi Zero 2W? Как именно?
В Mesa есть рабочее ускорение только для OpenGL, а Vulkan через llvmpipe драйвер это не ускорение, а замедление.

Я еще не пробовал, но драйвер установлен. Если у вас работает OpenGL, то можно и его использовать. А так на CPU нормально работает.

Для распознавания можно указать список возможных слов или фраз:

model = Model(model_name="vosk-model-en-us-0.22-lgraph")

trigger_words = ["please enter the number you hear", "please type the numbers you hear"]
numbers = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "zero"]

# You can also specify the possible word or phrase list as JSON list,
# the order doesn't have to be strict
rec = KaldiRecognizer(model,
    wf.getframerate(),
    f'[{", ".join(map(lambda s: json.dumps(s), trigger_words + numbers))}, "[unk]"]')

while True:
    data = wf.readframes(4000)
    if len(data) == 0:
        break
    if rec.AcceptWaveform(data):
        print(json.loads(rec.Result())["text"], end=', ')

print(json.loads(rec.FinalResult())["text"])

Так можно избавиться от необходимости подбирать похожие команды

А что насчет RHVoice? На телефоне стоит, голос немного "роботический", но читает нормально

Зарегистрируйтесь на Хабре, чтобы оставить комментарий