Привет.
Хочу поделиться одним техническим экспериментов, который меня заставила провести жизнь.
Страдаю такой проблемой как ХРАП и если неудачно ночью перевернусь, то буду храпеть сильно, очень сильно. Поэтому уже давно по ночам (большей ее части) сплю один в отдельной комнате. У жены нервы сдают, дети просыпаются, потом фиг уложишь. После "неудачные" ночи, когда много храплю, целый день мучаюсь с головной болью и полной апатией к работе. Поэтому долго думал как с этой напастью бороться. Заметил, что если меня ночью будят, и заставляют перевернуться, то это очень помогает и ночь превращается в "удачную".
Долго думал кто-же будет моей механической сиделкой, которая будет бдить за моим спокойным сном. Долго пытался воспользоваться детскими игрушками-повторяшками которые реагирут на голос. НО как-то не срасталось, то порог срабатывания не тот, то звуки и их громкость не соответствует ночному режиму в квартире.
И тут меня осенило - попробовать мой Raspberry Pi (блин, чет я раньше не додумался). Короче собрал и закодировал за полдня отличный боевой прототип:
- Raspberry Pi
- c270 Logitech webcam (в роли микрофона)
- колонки.
Программная начинка:
- Python + PyAudio
Кода на один экран (как же все просто!)
В общем запускается скрипт - он считывает выходные данные с микрофона в буфер (порциями) и анализирует (пока анализ примитивный - получение пикового значения). Если превышен порог срабатывания - запускается проигрывание wav файла. Нагрузка в режиме "слежения за сном" на малинку минимальная (в районе 1-2%) так что можно не беспокоиться за экологичность данного способа.
Теперь буду испытывать
на практике.
В перспективе улучшить метод анализа звука с микрофона и запись в базу. Потом можно будет писать в базу и слать на внешний сервер для последующего анализа.
Кстати пока писал нашел похожее решение, но там чувак пошел дальше. Он еще прикрутил motion detection (один хрен web камера то есть в распоряжении) и датчик положения тела (но тут я конечно сомневаюсь в целесообразности - опутывать себя проводами ночью сомнительное удовольствие). В итоге он писал в базу и звуки и положение тела и еще фоткал это дело. Ну полный набор.
А ты не пробовал нос проаперировать? У моей жены есть такая же проблема, будем резать. Конечно, Raspberry Pi дешевле даже плюс твоя работа. Но это не только на сон влияет.
Нам в частной клинике в Минске выставили пока счет в $1000.
Да мне пока никто и не предлагал, по крайней мере из бесплатных врачей.
Надо будет сходить в платную с этим вопросом.
Моей жене в детстве ломали нос. Она в баскет играла и вообще она у меня боевая дама. С храпом у нее не таки проблемы ка ку тебя, но есть со здоровьем. И одна из причин - недостаточное количество кислорода.
Вот реально не уверен что причина храпа именно в этом))
У меня с перегородкой все норм, мне в детстве ничего не ломали, да и комисси всякие в военные академии проходил на ура. В общем хз что за хрень. Типа стандартная причина - расслабляются какая-то мембрана и язык и закрываю доступ кислорода. Будем думать.
Пока устройство прошло боевое крещение - будило меня сегодня ночью ну ОЧЕНЬ часто - я даже со счета сбился. На удивление чувствую себя бодричком
. Но то что так часто "сработка" шла это не радует. По ходу я храплю все время пока сплю. Надо еще прикрутить запись в базу, чтобы потом проанализировать и точно сказать что ночью происходит.
Может потому, что ты не хирург с 10-летним стажем? ;-) Нам два врача в разных клиниках сказали одно и тоже. Я надеюсь, что они оба правы :-)
Да, мы тоже были уверенны, что нос в этом случае ну очень малую роль играет. Но мы пошли с носом к этим врачам и оба спрашивали, а не беспокоит ли нас храп. В твоем случае, Дима, может только Raspberry Pi поможет :-)
Попробуй уменьшить чувствительность или увеличить количество Децибел, при которых срабатывает "будильник".
Есть программы для web/ip камер, так вот там такие шумы можно фильтровать. Там, правда, помимо звука можно настраивать и картинку. Но про звук я знаю из этих программ. Как только звук с микрофона переваливает за выставленной количество дБ она начинает записывать. Тебе надо найти эту цифру. Я думаю тебя "будильник" должен будить только при очень громком храпе.
Да, есть эта цифра в скрипте. Опытным путем найду оптимальный вариант.
На счет существующих программ - это не наш метод
Мы ж программисты - все самописное и самопальное - зато максимально гибкое.
Кстати и работать с изображением с камеры на Python еще проще чем со звуком. Это была моя давняя задумка - замутить на базе RPi домашнюю сигнализацию и с видеонаблюдением и с оповещением и по максимуму автономную. Уже были попытки собрать на базе RPi + web камера + 3G модем + датчики (проводные пока). Не зватило свободного времени.
Насколько же эта маленькая коробочка классная!!! Я просто боготворю тех кто ее придумал.
Кстати небольшой опыт в офисе показал - что распберри вполне хватит для организации рабочего места для какой-нибудь девочки HR или офис менеджера. Полноценная система, работает даже быстрее чем у многих засранные домашние компы. Все приложения (офисные + браузер) есть. И все это за 50$ + HDMI моник. А сколько еще преимуществ - просто огонь!!!
Кстати еще заметил одну штуку.

Пока пилил месяц на nodejs, да и вообще javascript - настолько привык к его асинхронности (что раньше сильно ругал) что вчера на питоне тупо застрял на простейших вещах - основной цикл скрипта + асинхронные анализаторы. Пришлось выдумывать синхронно все на счетчикам - жесть. Все-таки NodeJS если его понять и "простить"
офигенская штука. Пилить асинхронные штуки так просто это мега круто. Не спорю что в python это тоже реализовано на потоках, но почему-то у меня быстро не завелось - все-таки надо изучать эту тему а не просто брать и использовать. Так что хочу признать что NodeJS рулит!
Попробую запустить что-то на NodeJS на малинке. Только боюсь что резурсов будет жрать значительно больше чем python.
Отрезать лишние всегда можно)) а мой доктор более гуманный таблетачку даст само всё отвалится ))
Там не отрезать, а разломать, выпрямить и зашить.
Один из докторов не делает операции, а только консультации. Так что одному точно никакой выходы от операции нет.
Ок ладно согласен, прямой нос никому не мешал.Димы случай на мой взгляд это операция через одно место.
Я тоже думаю, что Диме только Raspberry Pi поможет :-)
![]()
По просьбам трудящихся программистов и волей судьбы страдающих тем же недугом выкладываю сюда информацию по моей наработке.
Вот сам код скрипта на python:
import pyaudio
import audioop
import struct
import math
import time
import wave
import os
import sysTHRESHOLD = 1500
FORMAT = pyaudio.paInt16
RATE = 48000
INPUT_FRAMES_PER_BLOCK = 8192 #int(RATE*INPUT_BLOCK_TIME)f = wave.open(os.path.dirname(os.path.realpath(__file__))+"/Clinking_Teaspoon-Simon_Craggs-59102891.wav", "rb")
class TapTester(object):
def __init__(self):
self.pa = pyaudio.PyAudio()
#self.stream = self.open_mic_stream()self.show_devices()
print "INPUT_DEVICE_INDEX:", self.INPUT_DEVICE_INDEX
print "OUTPUT_DEVICE_INDEX:", self.OUTPUT_DEVICE_INDEXself.stream = self.pa.open(format = FORMAT,
channels = 1,
rate = RATE,
input = True,
input_device_index = self.INPUT_DEVICE_INDEX,
frames_per_buffer = INPUT_FRAMES_PER_BLOCK)
self.stream2 = self.pa.open(format = self.pa.get_format_from_width(f.getsampwidth()),
channels = f.getnchannels(),
rate = f.getframerate(),
output = True,
output_device_index = self.OUTPUT_DEVICE_INDEX)def show_devices(self):
for i in range( self.pa.get_device_count() ):
devinfo = self.pa.get_device_info_by_index(i)
print( "Device %d: %s"%(i, devinfo["name"]) )
if "USB Sound Device" in devinfo["name"]:
self.OUTPUT_DEVICE_INDEX = i;
if "USB Device" in devinfo["name"]:
self.INPUT_DEVICE_INDEX = i;def stop(self):
self.stream.close()
self.stream2.close()def listen(self):
try:
block = self.stream.read(INPUT_FRAMES_PER_BLOCK, exception_on_overflow = False)
except IOError, e:
print( "Error recording: %s"%(e) )
returnamplitude = audioop.rms(block, 2)
if amplitude > THRESHOLD:
print 'A: ', amplitude
print 'Play!'f.setpos(0)
data = f.readframes(1024)
while data:
self.stream2.write(data)
data = f.readframes(1024)sys.stdout.flush()
if __name__ == "__main__":
tt = TapTester()timer = 0
while True:
tt.listen()
if timer < time.time():
timer = time.time() + 10
print '.'
sys.stdout.flush()
!!! Просьба не кидать тапками по поводу качества кода - делал тупо из копипастов чтобы хоть как-то работало. Оптимизировать желания пока не появлялось.
Из нюансов:
метод show_devices при запуске выведет в консоль список доступных звуковых устройств подключенных к распбери. У меня это были камера Logitech с270 (определялась как "USB Device ...") и USB Sound Card производства какого-то подвального супермегагиганта звуковой индустрии из китая (за 10$) (определялась как "USB Sound Device ..."). Номера этих устройств надо передать в output_device_index и input_device_index при инициализации. Собственно вся магия. В цикле читается stream, определяется превышение порога и в stream2 происходит проигрываение wav файла.
Этого достаточно чтобы заставить работать скрип в ручном режиме.
Для автоматизации автозапуска (чтобы после включения распбери не лазить по ssh и не запускать скрипт) я использую supervisord - там никакой сложности - самые примитивные настройки по любому hello world.
Дима, спасибо большое. Ты себя доктором не ощущаешь? Можно еще электрошокер подрубить
Это вариант!!! Главное было бы что-то похожее, чем можно управлять программно. ![]()
а ты не искал готовые решения для смартфона? может есть проги, которые в заданное время включают микрофон смартфона и слушают определенные звуки? конечно такой режим жрет батарею, но все равно ночью тел на зарядке
Кстати вполне возможно!
Я просто пока так и не перешел на смартфоны и для меня эти устройства далеки.
НО в принципе любой смартфон это отличная альтернатива распбери (не по цене конечно
)
В них и камера и динамики и датчики и связь с интернет есть и работать могут автономно. Надо просто научиться под них кодировать ![]()
Продолжая тему. Так как наконец-то стал обладаталем Андроид, то решил пробить и тему храпа на данной платформе.
Оказывается все уже давно придумано до нас
вот такое приложение Sleep As Android (походу топовое, топовее не нашел
)

позволяет превратить телефон в целый комбайн по управлению и контролю за сном.
И одни их фич - определение храпа, запись в звуковой файл. И даже есть функция "разбудить" при определении храпа.
Испытывал прошлой ночью на себе. Итог не утишительный
За всю ночь я спал без храпа наверное только 20% времени. Все остальное время храплю. Хорошо так, забористо, голосисто! При всем желании телефона меня разбудить (это отражено на графике) у него ничего не вышло. Сам я лично помню только пару раз просыпался, хотя по графику отметки идут через каждый 3 минуты. А итог на утро - как будто и не спал
Но само приложение классное. Там есть много фич. Не знаю насколько они все полезные, но поиграться можно. Есть фича как определение фаз сна и подстройка будильника. Но я толком и не понял как это работает.