Ошибка атрибута: объект ‘list’ не имеет атрибута ‘detect_nonsilent’

#python #list #while-loop #pydub

#python #Список #цикл while #pydub

Вопрос:

Запуск этого фрагмента кода:

 while True:
    print('recording')
    myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=1, dtype=np.int16)
    sd.wait()  # Wait until recording is finished
    write('output.wav', fs, myrecording.astype(np.int16))
    sound = AudioSegment.from_file("output.wav", format="wav")
    lsound = sound   35

    silence = silence.detect_nonsilent(lsound, min_silence_len=1000, silence_thresh=-15)

    silence = [((start/1000),(stop/1000)) for start,stop in silence] #convert to sec
    print(silence)
    print(len(silence))
    if len(silence) == 0:
        print('silence')
    else:
        print('have recording')
        lsound.export("loutput.wav", format='wav')
  

Во время первой итерации все работает нормально

 recording
[(0.0, 0.502), (1.842, 5.0)]
2
have recording
  

Но во время следующей итерации получаем:

 recording
Traceback (most recent call last):
  File "sttgft.py", line 43, in <module>
    silence = silence.detect_nonsilent(lsound, min_silence_len=1000, silence_thresh=-15)
AttributeError: 'list' object has no attribute 'detect_nonsilent'
  

Попытался удалить ‘silence’ с помощью команды del silence, но затем получил;

 Traceback (most recent call last):
  File "sttgf1.py", line 43, in <module>
    silence = silence.detect_nonsilent(lsound, min_silence_len=1000, silence_thresh=-15)
NameError: name 'silence' is not defined
  

Не знаю, что попробовать

Комментарии:

1. После первой итерации вашего while цикла эта строка silence = [((start/... создаст silence a, list следовательно silence.detect_nonsilent( , не будет работать по причине, указанной в вашем обратном отслеживании

Ответ №1:

  1. Если вы удалите silence, то в приведенной ниже строке кода будет выдана ошибка, поскольку для получения окончательного silence значения оно должно быть уже там.

silence = silence.detect_nonsilent(lsound, min_silence_len=1000, silence_thresh=-15)

  1. Теперь проверьте, каково значение silence перед циклом while, потому что после его завершения первая итерация silence становится типом данных списка, и та же строка кода, упомянутая выше, выполнит list.detect_nonsilent . Вот почему вы получаете первую ошибку после первой итерации.

Комментарии:

1. Понять. Есть ли способ обойти это?

2. пожалуйста, укажите тип данных тишины, который задается перед циклом while, и чего это detect_nonsilent ожидает

Ответ №2:

Глупая ошибка. Использование имени ‘silence’ в ‘silence = silence.detect_nonsilent …’ вызвало ошибку. как только я изменил на «silenc = silence.detect_nonsilent …», это сработало отлично.