最近花了三天解决了一个不是问题的问题,花三整整三天,可谓真是太惨痛了。
近期做呼叫中心的语音合成(TTS),使用了百度语音平台进行语音合成。百度语音合成出来的语音是MP3格
式。这里共遇到几个问题:
(1)百度语音平台导出来的语音格式是 mp3, 强制转成 wav 时,正常播放没有问题。但是通过 sox 做转换时
提示 RIFF header not found 等错误。
(2)如果以 mp3 的方式导出,执行 sox xxx.mp3 -r 8000 -c 1 xxx.vox 时,提示 sox 不支持 mp3。通过编译的方式后,解决了 sox 支持 mp3 的问题。
最终定下来的解决方案是:百度语音导出成 mp3 ,然后调用 sox 的方式转换成 vox 格式,可以在电话系统中直接播放。
定下方案后,发现在 java 后台执行,执行系统转换命令:
Process p = Runtime.getRuntime().exec("sox xxx.mp3 -r 8000 -c 1 xxx.vox");
提示:Cannot run program "sox": java.io.IOException: error=2, No such file or directory
但是在控制台直接执行 sox xxx.mp3 -r 8000 -c 1 xxx.vox 时,挺是没有问题的。
开始以为是 权限问题,在转换前将语音文件的权限增加到最大,但是还是提示相同的错误。
经过各种测试,还是没有办法解决,
No such file or directory ,难道是文件不存在?
后来决定不直接执行 sox ,而是通过执行 复制操作,确定是否文件真的存在。即是
Process p = Runtime.getRuntime().exec(cp xxxx.mp3 xxx_bak.mp3);
谁知道写错了,写成了 copy xxx.mp3 xxx_bak.mp3 居然提示同样的错误,后来改正后,可以正常执行。
看来 No such file or directory 这个提示,并非是要复制或是要转换的文件不存在,看来是操作命令的问题。
即是 sox 这个操作命令不存在。
最后,通过 /usr/bin/sox xxx.mp3 -r 8000 -c 1 xxx.vox ,终于能正常执行。
经过三天才真正定位到错误原因。
这次解决问题完全是因为写错了 copy 才定位到的原因,真是无心插柳。