(惨痛教训) java runtime().exec() 提示 No such file or directory

 最近花了三天解决了一个不是问题的问题,花三整整三天,可谓真是太惨痛了。

 近期做呼叫中心的语音合成(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 才定位到的原因,真是无心插柳。

猜你喜欢

转载自hwzyyx.iteye.com/blog/2367801