Ошибка типа:> не поддерживается между экземплярами 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