将音频文件转换为适用于CMU Sphinx 4的输入格式。

8
我有一大批文件,想使用CMU Sphinx 4进行识别。 Sphinx需要以下格式:
  • 16 khz
  • 16 bit
  • 单声道
  • 小端
我的文件大约为44100 khz的32位立体声mp3文件。我尝试使用Tritonus,然后使用bakuzen的代码来转换它的更新版本JavaZoom。但是,AudioSystem.getAudioInputStream(File)抛出一个UnsupportedAudioFileException,而且我无法找出原因,所以我就放弃了。
现在我正在尝试使用ffmpeg。命令ffmpeg -i input.mp3 -ac 1 -ab 16 -ar 16000 output.wav似乎可以完成任务(除了小端),但是当我用Audacity检查输出时,它仍然标记为“32位浮点数”。我在this site上找到的命令也使用-acodec pcm_s16le,从其名称中看来,它输出16位小端;但是,Audacity仍然告诉我输出是32位浮点数
有人能告诉我如何将音频文件转换为CMU Sphinx 4所需的格式吗?
1个回答

21

你实际上尝试了在CMU Sphinx 4中使用ffmpeg的输出吗?Audacity中32位浮点数可能是您的默认采样格式(编辑>首选项>质量)。我猜它会将任何导入的文件转换为这些设置,因此可能不报告实际文件的参数,而是Audacity中的工作文件。

删除-ab 16。这将指示编码器使用16位/秒,但ffmpeg无论如何都会忽略它,针对pcm_s16le。因此,您的命令将如下所示:

ffmpeg -i input.mp3 -acodec pcm_s16le -ac 1 -ar 16000 output.wav

在Linux中转换目录中的所有mp3文件:

for f in *.mp3; do ffmpeg -i "$f" -acodec pcm_s16le -ac 1 -ar 16000 "${f%.mp3}.wav"; done

或者Windows:

for /r %i in (*) do ffmpeg -i %i -acodec pcm_s16le -ac 1 -ar 16000 %i.wav
在Windows批处理文件中:
for /r %%i in (*.mp3) do ffmpeg -i "%%i" -acodec pcm_s16le -ac 1 -ar 16000 "%i.wav"

你可以使用fileffmpegffprobemediainfo等其他工具来查看文件信息:

您可以使用 fileffmpegffprobemediainfo 等实用工具查看文件信息:
$ file hjl0bC.wav 
hjl0bC.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 16000 Hz

$ ffmpeg -i hjl0bC.wav
[...]
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 16000 Hz, mono, s16, 256 kb/s

谢谢,这似乎是正确的格式。然而,我的输出文件仍然无法在Sphinx 4上运行。可能需要直接询问@Nikolay Shmyrev... - Nate Glenn
格式没问题。我的文件只是有零能量级别的区域,所以一旦我在前端添加了抖动,一切都很顺利。 - Nate Glenn
@NateGlenn 我添加了你的编辑,这些编辑被其他用户拒绝了。我不是Windows用户,所以我没有测试它。 - llogan
谢谢。我猜如果我的编辑被拒绝,那么我需要审查编辑政策。 - Nate Glenn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接