使用Sound eXchange (SoX)进行DSD、PCM格式转换

不是什么严肃的文字内容,就考虑用点废话的样子来写了。
一、如何遇到Sound eXchange (SoX)这个软件的:
hifi群友推荐的博客——浴沂咏归(ZexWoo's Blog):https://zexwoo.blog/
翻找文章的时候,有两篇文章提到过SoX:
《重采样与降位深指南》:https://zexwoo.blog/posts/tutorials/resampling-and-bit-depth-reduction/ 里面说用SoX在降采样率速度快,效果好。
《SACD》:https://zexwoo.blog/posts/knowledge/sacd/
当中有一篇名叫《DSD转PCM分析》跳转到国外的博客——@Archimago:https://archimago.blogspot.com/,一番找寻后,里面直接提到SoX这个软件很牛,DSD to PCM效果不输专业付费音频转换软件的。(文章标题太长我偷懒了):https://archimago.blogspot.com/2021/10/measurements-look-at-dsd-and-using-sox.html
好奇心满满的我,开始了一些尝试。
二、SoX有什么效果
SoX是开源软件,只有命令行,没有GUI图形界面。
SoX的重采样能力很强,转换速度快,听感上数据保留量较好。
SoX同时可以进行抖动(Dither)处理,关于44.1/48kHz采样率还可以使用一些噪声整形(Noise Shaping)处理音频数据。
SoX也可以做一些音效处理,也可以调整音量(音频增益或音量归一化)。
我主要是用来做格式转换和抖动处理的,音效方面没怎么使用过。
介绍文章请看:https://www.jianshu.com/p/be8977de4a6b

三、SoX的使用
SoX的下载:
https://sourceforge.net/projects/sox/files/sox/
按照Archimago博客的推荐,我使用了以下两个版本的SoX:
https://audiodigitale.eu/repo/sox/ (AVX、AVX2)
https://www.audiofaidate.org/sw/sox-dsd/ (MSVC、x86_64)
以上两个改版支持PCM to DSD,原版只能PCM to PCM。
我使用的是AVX2版本的,具体可以用CPU-Z查看自己的CPU指令集,找适合自己CPU的。
还有一个小细节就是,原版对日文等字符的支持不佳,文件名需要更改才能正常运行。但在改版上就没有这个问题。
SoX的使用(全局环境的部署):参照该文章部署SoX全局环境
简单点说,将SoX解压对应位置,将文件夹对应路径加入系统Path环境中,就完成了。

SoX的使用命令:
SoX命令原则为:sox [gopts] [[fopts] infile]... [fopts] outfile [effect [effopt]]
SoX命令介绍:
[gopts]:全局选项,用于配置全局设置,如全局缓冲区大小、多线程等。
[[fopts] infile]...:输入文件和相关选项,[fopts]代表文件选项,可以配置输入文件的格式、采样率等。infile代表输入文件的路径。
[fopts] outfile:输出文件和相关选项,[fopts]代表文件选项,可以配置输出文件的格式、采样率等。outfile代表输出文件的路径。
[effect [effopt]]:SoX支持多种效果和效果选项,可以对音频进行处理、转换和调整。effect代表效果的名称,effopt代表效果的选项。
一个例子:sox -S -V3 -D -G --buffer 4194304 --multi-threaded <输入文件> -r 176.4k -b 32 -f <输出文件>
从左到右为:显示转换状态,不进行抖动,自动音量增益,内存缓存为4G,启用多线程,<输入文件>,输出比特率176.4K,输出位深32位,浮点,<输出文件>
具体命令如下:
-r 输出比特率,即44.1k/88.2k/176.4k/352.8k/705.6k/1411.2k(DSD转PCM请严格按照44.1k计算)
-b 输出位深,即16/24/32 (-f)。
-f 与输出位深-b结合使用,采用浮点方式输出。
DSD to PCM建议转换参数:DSD to PCM建议转换参数
DSD64 88.2k/24
DSD128 88.2&176.4k/24
DSD256 176.4/352.8k/24
[全局]-G(--guard),即“gain -h+gain -r”,自动计算音量增益,防止频率被削波。
[全局]-S(--show-progress),显示转换状态。默认是隐藏的,建议加入此命令。
[全局]-D(--no-dither),即不进行抖动(不进行量化失真)。
[全局]-V[1-6],显示SoX运行状态。1只显示错误信息,2显示警告,3显示细节,4-6属于调试级别。建议加入此命令。(注意要写成【-V3】,而非【-V 3】)
[全局]--buffer 任意数字,单位为千字节(KB)。即手动设定使用多少内存容量用于转换,默认8192KB(8MB)。与启用多线程--multi-threaded结合使用。
(1G=1048576、2G=2097152、4G=4194304、10G=10485760、20G=20971520)
[全局]--multi-threaded,即启用多线程。
SoX的批处理文件:
感谢ChatGPT编写的批处理,这下终于可以解决输入命令问题了:

举个例子:将音频文件转换成88.2k/24 wav文件,转换过程中不进行抖动处理。
@echo off
setlocal enabledelayedexpansion
for %%F in (*.wav *.flac *.w64 *.dff *.dsf) do (
set "filename=%%~nF"
set "output_filename=!filename! (88.2+24+禁dither).wav"
sox -S -D -V3 --buffer 4194304 --multi-threaded "%%F" -r 88.2k -b 24 "!output_filename!"
)
endlocal

【for %%F in (*.wav *.flac *.w64 *.dff *.dsf) do (】
%%F in 后面可以加入想要的格式,例如(*.wav *.flac *.w64 *.dff *.dsf)
【output_filename=!filename! (88.2+24+禁dither).wav】
!filename!后面可以加入想要的内容,!filename!前面加入想要的内容似乎会报错。
“!filename! (88.2+24+禁dither).wav”,.wav这里可以修改为需要的格式,例如(.wav/.flac/.w64)
【sox -S -D -V3 --buffer 4194304 --multi-threaded "%%F" -r 88.2k -b 24 "!output_filename!"】
这部分是具体的命令了,请参照上文来填写。


以上的命令全部打包上传在123网盘了:
https://www.123pan.com/s/Fm0qVv-NGIl.html提取码:KbS0