2013-08-23 4 views
6

Sto cercando di eseguire uno script Python in background e utilizzare pyaudio per registrare i file audio quando la soglia del microfono ha raggiunto un certo punto. Questo è per un monitor su una rete radio a due vie. Quindi, vogliamo solo registrare l'audio trasmesso.Python registra audio sul suono rilevato

Compiti in mente:

  • Record ingresso audio su una soglia% cancello

  • interrompere la registrazione dopo tanti secondi di silenzio

  • mantenere la registrazione per tanti secondi dopo l'audio

  • Fase 2: immettere i dati nel database MySQL per cercare le registrazioni

sto guardando una struttura di file del simile

/home/Recodings/2013/8/23/12-33.wav sarebbe una registrazione della transmision il 23/08/2013 @ 12: 33.wav

ho usato il codice

Detect and record a sound with python

sono ad un po 'di una perdita di dove andare da qui ora e un po' di orientamento sarebbe molto apprezzato

grazie

+0

Sogni per questo? –

risposta

0

Quindi hai solo bisogno della funzione getLevel(data)? Un hack rapido potrebbe essere:

def getLevel(data): 
    sqrsum = 0 
    for b in data: 
     b = ord(b) 
     sqrsum+=b*b 
    return sqrsum 

che dovrebbe aumentare con il volume. Imposta la soglia in modo appropriato attraverso tentativi ed errori.

+0

Grazie ejk314, dove pensi che l'ho messo nel codice. è anche getLevel una funzione pyaudio? – ZeroG

8

Qualche tempo fa ho scritto alcuni dei passi

  • Record audio input on a n% gate threshold

A: Avviare un tipo di variabile booleana per "Silenzio" e si può calcolare RMS per decidere se il silenzio è vera o falsa , Impostare una soglia RMS

  • stop recording after so many seconds of silence

A: Avete bisogno di calcolare un timeout, perché ottenere il frame rate, dimensioni del blocco e quanti secondi vuoi, per calcolare il timeout make (FrameRate/chunk * Max_Seconds)

  • keep recording for so many seconds after audio

A: se il silenzio è falso == (RMS> Soglia) ottenere l'ultimo blocco di dati di audio (LastBlock) e continuate a registrare :-)

  • Phase 2: input data into MySQL database to search the recordings

A: Questo passaggio è a voi

Codice sorgente:

import pyaudio 
import math 
import struct 
import wave 

#Assuming Energy threshold upper than 30 dB 
Threshold = 30 

SHORT_NORMALIZE = (1.0/32768.0) 
chunk = 1024 
FORMAT = pyaudio.paInt16 
CHANNELS = 1 
RATE = 16000 
swidth = 2 
Max_Seconds = 10 
TimeoutSignal=((RATE/chunk * Max_Seconds) + 2) 
silence = True 
FileNameTmp = '/home/Recodings/2013/8/23/12-33.wav' 
Time=0 
all =[] 

def GetStream(chunk): 
    return stream.read(chunk) 
def rms(frame): 
    count = len(frame)/swidth 
    format = "%dh"%(count) 
    shorts = struct.unpack(format, frame) 

    sum_squares = 0.0 
    for sample in shorts: 
     n = sample * SHORT_NORMALIZE 
     sum_squares += n*n 
     rms = math.pow(sum_squares/count,0.5); 

     return rms * 1000 

def WriteSpeech(WriteData): 
    stream.stop_stream() 
    stream.close() 
    p.terminate() 
    wf = wave.open(FileNameTmp, 'wb') 
    wf.setnchannels(CHANNELS) 
    wf.setsampwidth(p.get_sample_size(FORMAT)) 
    wf.setframerate(RATE) 
    wf.writeframes(WriteData) 
    wf.close() 

def KeepRecord(TimeoutSignal, LastBlock): 
    all.append(LastBlock) 
    for i in range(0, TimeoutSignal): 
     try: 
      data = GetStream(chunk) 
     except: 
      continue 
     #I chage here (new Ident) 
     all.append(data) 

    print "end record after timeout"; 
    data = ''.join(all) 
    print "write to File"; 
    WriteSpeech(data) 
    silence = True 
    Time=0 
    listen(silence,Time)  

def listen(silence,Time): 
    print "waiting for Speech" 
    while silence: 
     try: 
      input = GetStream(chunk) 
     except: 
      continue 
     rms_value = rms(input) 
     if (rms_value > Threshold): 
      silence=False 
      LastBlock=input 
      print "hello ederwander I'm Recording...." 
      KeepRecord(TimeoutSignal, LastBlock) 
     Time = Time + 1 
     if (Time > TimeoutSignal): 
      print "Time Out No Speech Detected" 
      sys.exit() 

p = pyaudio.PyAudio() 

stream = p.open(format = FORMAT, 
    channels = CHANNELS, 
    rate = RATE, 
    input = True, 
    output = True, 
    frames_per_buffer = chunk) 

listen(silence,Time) 
+0

Ok, sto arrivando da qualche parte, ma ho bisogno che il programma funzioni in modo indefenico e crei i file in modo autonomo nel momento in cui trovo un file non trovato sul codice di ederwander. il programma sta rilevando correttamente il suono ..... dobbiamo avere un timeout per il programma o possiamo solo interrompere questa registrazione e quindi iniziare di nuovo ad ascoltare. Mi spiace essere un po 'legato in un nodo qui – ZeroG

+0

Ok Non ricevo errori ora e ho un output di file che funziona correttamente. il problema è che ottengo solo una registrazione di 1 secondo dell'audio del trigger, ne ho bisogno per registrare fino a nuovo silenzio e quindi scrivere su file e quindi ricominciare ad ascoltare. – ZeroG

+0

Rientra correttamente questa riga "all.append (dati)", vedi aggiornamento! – ederwander