对于一只伪geek来说,生活中总会有一些奇奇怪怪的Task.

7月23日考托福了,口语那个叫烂啊,于是有不会读的词语还是求助于Lingoes吧,Lingoes有真人发声词库,我下了里面的韦氏词典语音库,嗯,听起来还是挺靠谱的。唯独有一点,都是wav文件,解压放在那里快1个G啊。想想还是压缩一下吧,这就有了这么一个task:

如何把14万个wav文件转成mp3?

首先想到的必然是最人类本能的方法,打开foobar,批量读入然后转换,后来发现foobar几乎是一秒钟一个的速度在读取文件的时候,我崩塌了… >_<

想起来mp3的原理无非是encoder对文件的作用,于是开始geek路线,找到foobar下面的lame.exe文件,这是一个命令行程序,用lame.exe --help查看帮助。

配合批处理文件的for循环,下面要写一个批处理文件,批量调用lame.exe,处理所有wav文件,我写的第一版批处理文件是这样的:

1
for /r %%i in (*.wav) do lame -V %%i

这里有三个bug,首先 %%i 是wav文件的路径 里面含有一个经典的空格Program Files, 这样提示找不到文件;再次,这里使用lame默认输出,lame默认输出的文件的格式居然是 abide.wav.mp3 ….这样的愚蠢的标题,这语音引擎必须找不到这个mp3,最后是lame 用VBR编码必须在 -V后面指定级别,比如 -V4…

第一个好解决,强制把%%i作为字符串,也就是写成 “%%i”. 第二个bug比较纠结,我为此反查了短达3-4页的for循环使用说明,发现”%%~pni”可以指代路径和文件名,这样再强行指定扩展名。第三个bug嗯,浮云。这样得到第二版批处理文件,这次已经没bug了:

1
for /r %%i in (*.wav) do lame -V4 "%%i" "%%~pni.mp3"

最后为了批处理文件的完美,再次翻看lame的完全说明:lame --longhelp,考虑到十四万个文件,每次输出结果必然非常占用程序时间,因此尽可能不输出结果,并且最后还要删除掉庞大的Wav文件,这样得到最终版的批处理文件:

1
2
3
@echo off
@for /r %%i in (*.wav) do lame -V4 "%%i" "%%~pni.mp3" --silent -c --tt "%%~ni" --tl "Webster Voice"
@for /r %%i in (*.wav) do del /f /q "%%i"

嗯,批处理文件每次做完,都是那个感慨,几行命令就能解决实在的棘手问题。

附录:运行完后发现还有部分wav没有转,原来这些Wav用的还不是PCM编码而是MPEG Layer III,再翻开lame的帮助,再次运行

@for /r %%i in (*.wav) do lame -V4 "%%i" "%%~pni.mp3" --silent --mp3input -c --tt %%~ni --tl "Webster Voice"

就好了,真是一波三折 |||