Ошибка типа:> не поддерживается между экземплярами numpy.ndarray и str

Основное изложение того, что я хочу, чтобы программа делала:

Aubio печатает частоту (высоту) и громкость (громкость) из того, что вводится с микрофона

Я хочу перебрать словарь, и в зависимости от того, какая частота выводится, вывести цвет, соответствующий ключу в словаре, который выдает частоту из выборок.

Я продолжаю получать эту ошибку:

Traceback (последний вызов был последним): TypeError: '>' не поддерживается между экземплярами 'numpy.ndarray' и 'str'

Кто-нибудь сможет мне помочь? Данный код является заявлением для

import aubio
import numpy as num
import pyaudio
import sys

# Some constants for setting the PyAudio and the
# Aubio.
BUFFER_SIZE = 2048
CHANNELS = 1
FORMAT = pyaudio.paFloat32
METHOD = "default"
SAMPLE_RATE = 44100
HOP_SIZE = BUFFER_SIZE//2
PERIOD_SIZE_IN_FRAME = HOP_SIZE
index = 0

def main(args):

    # Initiating PyAudio object.
    pA = pyaudio.PyAudio()
    # Open the microphone stream.
    mic = pA.open(format=FORMAT, channels=CHANNELS,
                  rate=SAMPLE_RATE, input=True,
                  frames_per_buffer=PERIOD_SIZE_IN_FRAME)

    # Initiating Aubio's pitch detection object.
    pDetection = aubio.pitch(METHOD, BUFFER_SIZE,
                             HOP_SIZE, SAMPLE_RATE)
    # Set unit.
    pDetection.set_unit("Hz")
    # Frequency under -40 dB will considered
    # as a silence.
    pDetection.set_silence(-40)

    # Infinite loop!
    while True:

        # Always listening to the microphone.
        data = mic.read(PERIOD_SIZE_IN_FRAME)
        # Convert into number that Aubio understand.
        samples = num.fromstring(data,
                                 dtype=aubio.float_type)
        # Finally get the pitch.
        pitch = pDetection(samples)[0]
        # Compute the energy (volume)
        # of the current frame.
        volume = num.sum(samples**2)/len(samples)
        # Format the volume output so it only
        # displays at most six numbers behind 0.
        volume = "{:6f}".format(volume)

        answer = pitch_detection(samples)

        # Finally print the pitch and the volume.
        print(str(pitch) + " " + str(volume) + (str(answer)))


def pitch_detection(samples):
    colordict = {
        (0.0, 13.99): "Red",
        (14.00, 250.00): "Blue",
    }

    for index, key in enumerate(colordict, start=0):
        if samples > colordict[key][0] and samples < colordict[key][1]:
            return key
        return "Not Found"


if __name__ == "__main__":
    main(sys.argv)

2 ответа

samples это массив NumPy.colordict[key][0] это символ (так как colordict[key] это текст как "Red", [0] получит первый символ из этой строки "R")

Ваше сравнение if samples > colordict[key][0] and samples < colordict[key][1]: сравнивает массив NumPy с символом, и это не удается.

Теперь я не уверен, что вы действительно хотите. если ты имеешь ввиду key[0] а также key[1] (чтобы получить каждое значение из ключа отдельно), тогда вам нужно сравнить с одним числом с плавающей запятой, а не samples (которые содержат несколько значений - это массив) или может быть перебрать samples сравнивать?

for index, key in enumerate(colordict):
    if pitch > key[0] and pitch < key[1]:
        return colordict[key]

Закончилось это исправить. Спасибо всем <3

Другие вопросы по тегам