Я случайно забыл преобразовать некоторые массивы NumPy в байтовые объекты при использовании PyAudio, но, к моему удивлению, он все еще воспроизводил звук, даже если он звучал немного не так. Я написал небольшой тестовый скрипт (см. Ниже) ...

1
BatWannaBe 5 Апр 2021 в 23:40

1 ответ

Лучший ответ

Проблема более тонкая, чем вы описываете. Ваш первый вызов передает массив байтов размером 192000. Второй вызов передает список значений float32 размером 48000. pyaudio обрабатывает их оба и передает буфер в portaudio для воспроизведения.

Однако, когда вы открыли pyaudio, вы сказали, что отправляете данные paFloat32, которые имеют 4 байта на выборку. Обработчик pyaudio write берет длину массива, который вы ему предоставили, и делит его на количество каналов, умноженное на размер выборки, чтобы определить, сколько аудиосэмплов имеется. Во втором вызове длина массива равна 48 000, что делится на 4, и тем самым сообщает portaudio, что «здесь 12 000 отсчетов».

Итак, все понимали формат, но запутались в размере. Если вы измените второй вызов на

stream.write(sina, 48000)

Тогда никто не должен гадать, и он отлично работает.

2
Tim Roberts 5 Апр 2021 в 21:24