Потенциальные источники проблем
Частота дискретизации
44,1 кГц часто используется для musi c, так как это то, что используется в аудио CD. 48 кГц обычно используется для видео, как и на DVD. Обе эти частоты дискретизации намного выше, чем требуется для речи, поэтому вполне вероятно, что ваши различные провайдеры преобразования текста в речь выводят что-то другое. 22,05 кГц (половина от 44,1 кГц) распространены, и 11,025 кГц тоже там.
Хотя каждый кадр определяет свою собственную частоту выборки, что позволяет генерировать поток с различными частотами выборки, я никогда видел попытку декодера переключать частоты дискретизации в среднем потоке. Я подозреваю, что декодер пропускает эти кадры или, возможно, даже пропускает произвольный блок, пока не получит согласованные данные снова.
Используйте что-то вроде FFmpeg (или FFprobe), чтобы выяснить, что Частоты дискретизации ваших файлов:
ffmpeg -i sound2.mp3
Вы получите такой вывод:
Duration: 00:13:50.22, start: 0.011995, bitrate: 192 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 192 kb/s
В этом примере частота дискретизации составляет 44,1 кГц.
Количество каналов
Я ожидаю, что ваши голосовые MP3 будут в моно, но это не помешало бы проверить, чтобы быть уверенным. Как и выше, проверьте вывод FFmpeg. В моем примере выше написано stereo
.
Как и в случае с частотой дискретизации, технически каждый кадр может указывать свой собственный счетчик каналов, но я не знаю ни одного проигрывателя, который бы выполнял переключение счетчика каналов в среднем потоке. , Поэтому, если вы объединяете, вам нужно убедиться, что все количества каналов одинаковы.
Теги ID3
Обычно существует метаданных ID3 в начало (ID3v2) и / или конец (ID3v1) файла. Меньше ожидается, что эти данные будут в середине потока. Вы должны убедиться, что все эти метаданные удалены перед объединением.
MP3 Bit Reservoir
Кадры MP3 не обязательно стоят отдельно. Если у вас есть постоянный битрейт, кодировщик может по-прежнему использовать меньше данных для кодирования одного кадра и больше данных для кодирования другого. Когда это происходит, некоторые кадры содержат данные для других кадров. Таким образом, кадры, которые могут извлечь выгоду из дополнительной полосы пропускания, могут получить ее, в то же время приспосабливая весь поток в пределах постоянной скорости передачи данных. Это «резервуар битов».
Если вы обрезаете поток и объединяете его в другом потоке, вы можете разделить кадр и зависимые от него кадры. Это обычно вызывает сбой в работе аудио, но может также привести к пропуску декодера вперед. Некоторые плохо ведущие себя декодеры просто перестанут играть. В вашем примере вы ничего не режете, так что это, вероятно, не является источником вашей проблемы ... но я упоминаю об этом здесь, потому что это определенно относится к тому, как вы работаете с этими потоками.
См. Также: http://wiki.hydrogenaud.io/index.php?title=Bit_reservoir
Решения
Выберите «нормальный» формат, выполните повторную выборку и перекодируйте несоответствующие файлы
Если большинство ваших источников имеют один и тот же формат и только один или два ожидающих обработки, вы можете преобразовать несоответствующий файл. Оттуда извлеките теги ID3 из всего и объедините их.
Чтобы выполнить преобразование, я бы рекомендовал перенести его в FFmpeg как дочерний процесс .
child_process.spawn('ffmpeg' [
// Input
'-i', inputFile, // Use '-' to write to STDIN instead
// Set sample rate
'-ar', '44100',
// Set audio channel count
'-ac', '1',
// Audio bitrate... try to match others, but not as critical
'-b:a', '64k',
// Ensure we output an MP3
'-f', 'mp3',
// Output
outputFile // As with input, use '-' to write to STDOUT
]);
Лучшее решение: пусть FFmpeg (или аналогичный) сделает всю работу за вас
Самое простое и надежное решение всего этого - позволить FFmpeg создать для вас совершенно новый поток. Это приведет к тому, что ваши аудиофайлы будут декодированы в PCM, и будет создан новый поток. Вы можете добавить параметры для повторной выборки этих входов и, при необходимости, изменить количество каналов. Затем выведите один поток. Используйте concat filter .
Таким образом, вы можете принимать аудиофайлы любого типа, вам не нужно писать код, чтобы взламывать эти потоки вместе, и после настройки вы выиграли ' об этом не стоит беспокоиться.
Единственный недостаток в том, что для этого потребуется перекодировка всего, что означает потерю качества другого поколения. В любом случае это потребуется для любых несоответствующих файлов, и это всего лишь речь, поэтому я бы не стал об этом думать.