Эта «единственная разница» - огромная разница.
Формат WAV по умолчанию хранит сэмплы в виде 16-разрядных целых чисел со знаком с прямым порядком байтов.Таким образом, когда вы записываете массив int16
значений в виде необработанных данных, вы получаете воспроизводимый WAV-файл (по крайней мере в системе с прямым порядком байтов).
Но когда вы пишете массив int32
значения, вы получаете ерунду - каждое число превращается в 2 образца, один из которых является старшим словом ваших данных, а следующий - младшим словом.Таким образом, у вас есть исходные аудиосэмплы с половинной скоростью и чередование с фактически случайным шумом.
Или, в качестве альтернативы, вы можете использовать формат WAV не по умолчанию.Вы не показали достаточного количества своего кода, чтобы показать, как вы справляетесь с этим, но вы можете записывать файлы WAV в различных форматах: от 8-разрядного беззнакового целого до 32-разрядного с плавающей запятой, а 32-разрядные целые числа со знаком являютсядействительный формат.Файлы WAV могут даже справляться со сжатием (включая MP3).
Но менее распространенные форматы могут воспроизводиться не с каждым инструментом;многие программы предполагают, что WAV - это 16-битные целые числа, и не будут знать, что делать с чем-либо еще.
Итак, вам, вероятно, лучше писать 16-разрядные целые числа.
Или, может быть, вы уже делаете это - записываете 32-разрядные значения типа int с правым заголовком -и, возможно, ваш плеер обрабатывает их правильно.
Но вы пишете 32-битные значения типа int в диапазоне от -32768 до 32767. Это означает, что вы используете только 1/55636 от динамического диапазона, так что все будетневероятно тихоЕсли вы хотите записать 32-разрядные значения типа int, вы должны нормализовать их в 32-разрядном диапазоне int, а не в 16-разрядном диапазоне int.
Самое простое решение всех этих проблем -: преобразовать значения обратно в int16
перед записью их:
y3 = y2.astype(np.int16)