User:Wordfa/oldphonehack/code14nov

From XPUB & Lens-Based wiki
< User:Wordfa‎ | oldphonehack
Revision as of 17:16, 14 November 2024 by Wordfa (talk | contribs) (Created page with "``` #!/usr/bin/env python import sys, os, time, random, pygame import RPi.GPIO as GPIO import argparse import tempfile import queue import sys from os import walk import random import numpy # Make sure NumPy is loaded before it is used in the callback assert numpy # avoid "imported but unused" message (W0611) import datetime ## Folder Config folder = 'recordings/' processedFolder = 'processed/' rawFolder = 'raw/' ## Recently Recorded File fileForProcessing = '' ##...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

```

  1. !/usr/bin/env python

import sys, os, time, random, pygame import RPi.GPIO as GPIO import argparse import tempfile import queue import sys from os import walk import random

import numpy # Make sure NumPy is loaded before it is used in the callback assert numpy # avoid "imported but unused" message (W0611) import datetime

    1. Folder Config

folder = 'recordings/' processedFolder = 'processed/' rawFolder = 'raw/'

    1. Recently Recorded File

fileForProcessing =

    1. Varible to detect is Launch Sequence has happened

launched = True

  1. Name pins

dialPIN = 25 numberPIN = 23 handsetPIN = 24

  1. Set Up Pins

GPIO.setmode(GPIO.BCM) GPIO.setup(dialPIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(handsetPIN, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(numberPIN, GPIO.IN, pull_up_down = GPIO.PUD_UP)


  1. Start audio mixer

pygame.mixer.init()

def getNumber():

   print('Listening for Number Presses')
   # number of Pulses
   nPulsen = 0
   # Watch Dail or Button
   DialContact = GPIO.input(dialPIN)
   NumberContact = GPIO.input(numberPIN) # Low if pressed
   while DialContact == False and NumberContact == True:
       DialContact = GPIO.input(dialPIN)
       NumberContact = GPIO.input(numberPIN)
   # Number Pressed (Selected)
   if NumberContact == False:
       return -1
   # Handle Pulses
   done = False
   while done == False and DialContact == True:
       nPulsen = nPulsen + 1
       startTime = time.time()
       time.sleep(0.1)
       DialContact = GPIO.input(dialPIN)
       # Check time between Pulses
       while done == False and DialContact == False:
           if time.time() - startTime >= 0.2:
               done = True
           DialContact = GPIO.input(dialPIN)
   # Return number
   number = nPulsen % 10
   
   # Play number on Tone
   playAudio(f'tones/{number}.mp3', True)
   return number
    1. Process Recently Recorded File

def handleRecording(fileName):

   global folder, processedFolder, rawFolder, fileForProcessing
   ## Removes Noise
   os.system(f"sox '{folder + rawFolder + fileName}.mp3' '{folder + rawFolder + fileName}-Clean.mp3' noisered noise.prof 0.10")
   ## Normalises Volume
   os.system(f"sox '{folder + rawFolder + fileName}-Clean.mp3' '{folder + rawFolder + fileName}-Clean-Louder.mp3' gain +6")
   ## Normalises Volume
   os.system(f"sox --norm '{folder + rawFolder + fileName}-Clean-Louder.mp3' '{folder + processedFolder + fileName}-Clean-Louder.mp3'")
   ## Resets fileForProcessing so it doenst run again until new recording
   
   fileForProcessing = 
   print('recording processed')
    1. Tell you when handset is picked up/ Put Down

def handsetCallback(channel):

   global launched
   global fileForProcessing
   print('handset State Change')
   handsetContact = GPIO.input(handsetPIN)
   ## Checks if someone was recording on hang up
   if fileForProcessing != :
       # Stop Recording if recording
       os.system('killall rec')
       print('Recoridng stopped')
       # Send file for processing
       print("file for processing", fileForProcessing)
       handleRecording(fileForProcessing)
   # Restart Script
   launched = False
   GPIO.cleanup()
   python = sys.executable
   os.execl(python, python, * sys.argv)
   
  1. Use an interrupt for the handset, because it can be put down at any time

GPIO.add_event_detect(handsetPIN, GPIO.BOTH, callback = handsetCallback)

def playAudio(fileName, playthrough = False):

   print('Play Audio: ', fileName)
   pygame.mixer.music.load(fileName)
   pygame.mixer.music.set_volume(1)
   pygame.mixer.music.play()
   if(playthrough):
       while pygame.mixer.music.get_busy() == True:
           continue
   time.sleep(1)

def startRecording():

   global fileForProcessing, rawFolder,folder
   
   ## TODO: INSERT 'Please leave a msg after tone etc'
   
   #play Tone
   playAudio('tones/machineBeep.wav', True)
   ##Assign File name based on time
   fileName = datetime.datetime.now().strftime("%m-%d-%Y, %H:%M:%S")
   fileFolder = folder + rawFolder + fileName
   fileForProcessing = fileName
   
   print('Started recording: ', fileForProcessing)
   os.system(f"rec '{fileFolder}.mp3'")
   
   ## Keeps it recording and not going to menu || not sure if this done anything
   handsetContact = GPIO.input(handsetPIN)
   while handsetContact == False:
       print('recording')
       handsetContact = GPIO.input(handsetPIN)
       time.sleep(1)
   # print('Recoridng stopped')


def runFunc(number):

   global folder, processedFolder
   print('running Func ' , number)
   
   ## Check if a file is playing, stop it if it is
   if pygame.mixer.music.get_busy() == True:
       pygame.mixer.music.stop()
       
   ## Do a function based on number
   if number == 1:
       
       ## Playing Sound from proccessed folder
       ## Give it a file
       file = random.choice(filenames)
       file =  folder + processedFolder + file
       playAudio(file, True)


   elif number == 2:
       
       ## Start recording
       startRecording()
   elif number == 3:
       print('Playing in Random Order')
       
       # Play each file in random order
       for file in random.sample(filenames, len(filenames)):
           print(file)
           file = folder + processedFolder + file
           playAudio(file, True)
           time.sleep(1)
       
           ### TODO: PLAY A TONE IN BETWEEN
       
   else:
       print('No Function for number ', number)


  1. Main Loop of the code

while True:

   try:
       # Compile a list of audio files to play
       filenames = next(walk(folder + processedFolder), (None, None, []))[2]
       print('Number of Audio Files:', len(filenames))
       
       # Wait for pick up
       print("Wait for pick up...")
       handsetContact = GPIO.input(handsetPIN)
       while handsetContact == True:
           handsetContact = GPIO.input(handsetPIN)
       
       # If handset up do this
       time.sleep(1)
       while True: 
           # Check if we are launching for the first time 
           if launched == False:
               # Play dail tone
               dailTone = "Ringing_3rings.mp3"
               playAudio(dailTone,True)
               
               # Play greating
               greeting = "testIntro.mp3"
               playAudio(greeting,True)
               
               # Main menu
               # Play greating
               menuAudio = "testIntro.mp3"
               playAudio(menuAudio)
               print("Press a number")
               launched = True
           
           # Wait for number press
           number = getNumber()
           print("number is: ", number)
           runFunc(number)
           time.sleep(1)
       
   except KeyboardInterrupt: # Ctrl+C
       print('disconnecting aggressivly')
       GPIO.cleanup()

```