这是一个从后遵循: Python record audio on detected soundPython的功能无法正常运行
我有大部分排序,但现在仍然有一个错误?
程序运行一次后保存一个录音并将其录入DB,返回打印等待语音打印。不管音量多大,它不会再次录制,你必须跳出该节目?
我已删除了听()函数,所以现在回到基本从一开始就在寻找一种方式来录制完成后开始,等待下一个音频
这里本代码:
import pyaudio
import math
import struct
import wave
import datetime
import os
import sys
import MySQLdb
utc_datetime = datetime.datetime.utcnow()
FileTime = utc_datetime.strftime("%Y-%m-%d-%H%M")
#Assuming Energy threshold upper than 30 dB
Threshold = 30
SHORT_NORMALIZE = (1.0/32768.0)
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 16000
swidth = 2
Max_Seconds = 5
TimeoutSignal=((RATE/chunk * Max_Seconds) + 2)
silence = True
FileNameTmp = '/var/www/Recordings/'+FileTime+'.wav'
FileNameWWW = 'Recordings/'+FileTime+'.wav'
Time=0
all =[]
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
output = True,
frames_per_buffer = chunk)
# SQL DB Connection
db = MySQLdb.connect("localhost","root","*****","radiolink")
cursor = db.cursor()
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
# Define What to Do When WriteSpeech is Called
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
all.append(data)
print "end record after timeout";
data = ''.join(all)
print "Creating File " +FileNameTmp;
WriteSpeech(data)
print "Entering Record into DB";
File = FileNameWWW
query ="""
INSERT INTO recordings
(`id`, `time`,`filename`,`active`,`status`)
VALUES
(NULL,NOW(), %s,1,1) """
cursor.execute(query,(File))
db.commit()
silence = True
Time=0
print "Listening......"
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 "Recording...."
KeepRecord(TimeoutSignal, LastBlock)
Time = Time + 1
if (Time > TimeoutSignal):
print "Waiting No Speech Detected"
sys.exit()
我肯定失去了一些东西简单在这里先谢谢了
亚历
可能有可能不相关,但我不认为调用'listen()'会做你认为它的工作。如果你打算长时间运行,即使它能够工作,它也会因无限递归而最终崩溃。 – Brian