使用 pydub 进行音频操作

时间:2020-12-29 16:47:33

标签: pyaudio pydub

我正在尝试使用 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'

有人知道怎么解决吗? 我尝试了许多不同的示例,但每次都会出现该错误...

0 个答案:

没有答案