gpt4 book ai didi

python - Python音频功能无法正常工作

转载 作者:行者123 更新时间:2023-12-03 02:17:24 25 4
gpt4 key购买 nike

这是该帖子的后续内容:
Python record audio on detected sound

我现在对其中的大多数进行了排序,但是仍然存在一个错误。

程序运行一次后,保存一个录音并将其输入到DB中,然后返回以打印收听和等待语音。不管音量多大,它都不会再次录制,您必须退出该程序吗?

我已经删除了listen()函数,因此现在回到基础知识,寻找从头开始录制结束后等待下一个音频的方法。

这是现在的代码:

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()

最佳答案

我强烈建议您阅读BUT之后的内容,看来WriteSpeech会停止并关闭stream,而它从未重新打开过。这可能被您的try / except块掩盖了。

while silence:
try:
input = GetStream(chunk)
except:
continue

现在说,
  • 尝试从流中读取。
  • 如果有异常,请返回循环顶部。
  • 重复步骤1-2广告博物馆

  • 要解决此问题,您可以尝试在except块内重新打开流。

    在试图回答您的问题之前我写的乱语

    由于没有为问题提供真正的答案,这会招致不满的危险,我认为您需要重组一些代码,然后才能解决该问题。以下内容旨在完全具有 build 性,请通过其他方式告诉我。

    您的 listen()函数对自身有多个 recursive调用,这似乎并不是您想要的。这与将控制权转移到代码的那部分的 jumpgoto命令不同。实际上,这将为单独执行 listen()函数创建另一个堆栈框架。总体上,这对您的代码有几个影响。
  • listen()的每个堆栈帧的本地范围内都将重新定义所有局部变量。这将导致内存使用量急剧增加。例如,您实际上在内存中有很多很多SHORT_NORMALIZE变量。
  • 您定义的闭包(函数内的函数)将针对每个listen()的本地范围进行重新定义。同样的问题。
  • 在这样的部分中:
    listen()
    Time = Time + 1

    if (Time > TimeoutSignal):
    print "Waiting No Speech Detected"
    listen()

    在对listen()的初始调用之后,什么也不会执行,因为在return的任何地方都没有退出条件(listen)。

  • 因此,在解决此问题然后遇到性能/稳定性问题之前,我会建议:
  • 在类似listen()的whilet循环中将while True:(而不是变量声明)中的所有代码包装起来
  • 您当前在listen()函数本身内部具有listen的所有位置,将其替换为continue。这将告诉python不要从循环中执行更多代码,而只是继续进行下一个循环迭代,从而使执行回到循环顶部。
  • 在此主循环中添加退出条件:
    if exit:
    print 'Terminating normally'
    break
  • 底部没有KeepRecord调用listen()。只要让它完成执行即可。执行结束后,执行将返回listen,因为这是对KeepRecord的调用。
  • 找到一种方法将Time = Time + 1节移动到其他地方,以便实际上执行它。即使在这里执行了步骤1-4,此代码仍将永远不会执行。

  • 实现此步骤后,请验证当前结果是否相同。在重组此代码的过程中,您实际上可能会解决您的问题。我会将您的代码复制到一个新脚本中,并在该脚本中工作以保留当前的内容。

    附言

    如果这是您第一次尝试编码,那么您完全不应该为发布和寻求帮助而感到羞耻。您在这里进行了很多工作,并且作为第一次编程的尝试,它实际上是非常令人印象深刻的。

    关于python - Python音频功能无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18640719/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com