我正在尝试使用 pydub 处理来自 pyaudio 的音频。来自麦克风的音频由阈值检测并“保存”在变量而不是文件中。那么它现在只是播放音频数据。 代码如下
from array import array
from io import BytesIO
import json
import os
from pyaudio import PyAudio, paInt16
import time
from pydub import *
LANG = en
DEBUG = True
# Mic Settings
THRESHOLD = 5
RATE = 16000
TIMEOUT_LENGTH = 1
CHUNK = 4000
SHORT_NORMALIZE = (1.0 / 32768.0)
NORMALIZE = 1 / 32768
class AudioDetection:
def __init__(self):
p = PyAudio()
self.stream = p.open(rate=RATE,
channels=1,
format=paInt16,
input=True,
output=True,
input_device_index=None, # None use default
output_device_index=None, # None use default
frames_per_buffer=8000,)
self.stream.start_stream()
@staticmethod
def rms(frame):
shorts = array('h', frame)
sum_squares = sum(
(sample * NORMALIZE) ** 2
for sample in shorts
)
return (sum_squares / len(shorts)) ** 0.5 * 1000
@staticmethod
def add_silence(raw_data, duration):
# create silence audio segment
silence = AudioSegment.silent(duration=duration) # duration in milliseconds
# read wav audio segment
# frame = AudioSegment.from_wav(raw_data)
# Add above two audio segments
# res = silence + array('h', raw_data)
res = silence + raw_data
# Either save modified audio
# res.export(format="wav")
return res
def detect(self, frame):
if DEBUG:
print("Noise detected")
rec = [frame]
current = time.time()
end = time.time() + TIMEOUT_LENGTH
while current <= end:
data = self.stream.read(CHUNK)
if self.rms(data) >= THRESHOLD:
end = time.time() + TIMEOUT_LENGTH
current = time.time()
rec.append(data)
rec = self.add_silence(rec, 500)
if DEBUG:
print("Play Stream")
self.stream.write(b''.join(rec))
def run(self):
print("Listening...")
while True:
mic_input = self.stream.read(CHUNK)
rms_val = self.rms(mic_input)
if rms_val >= THRESHOLD:
self.detect(mic_input)
if __name__ == '__main__':
recorder = AudioDetection()
recorder.run()
但是每次出现这个错误时都会得到:
TypeError: float() argument must be a string or a number, not 'list'
有人知道怎么解决吗? 我尝试了许多不同的示例,但每次都会出现该错误...