2012-03-26 70 views
0

我一直在试图让某个Google API工作两天。已经尝试了三个不同的项目 - 一个使用Perl(在很早的时候就死掉了),一个使用Python(在最后一道障碍时崩溃并烧毁),最后一个使用Ruby。从命令行调用时作为一个标准的命令,Ruby的一个实际工作,即:Ruby Gem在命令行和irb上运行 - 以ruby脚本或通过Java进程运行时失败

speech2text somefile.wav 

,即使你打通irb,并把在项目现场发现,样本代码工作:

require 'speech' 
audio = Speech::AudioToText.new("i-like-pickles.wav") 
puts audio.to_text.inspect 

但是,使用ruby -rubygems somescript.rb执行时,带有上述内容的Ruby .rb文件将不起作用。它退出这个:

/Library/Ruby/Gems/1.8/gems/speech2text-0.3.4/lib/speech/audio_inspector.rb:50:in `initialize': undefined method `first' for nil:NilClass (NoMethodError) 
from /Library/Ruby/Gems/1.8/gems/speech2text-0.3.4/lib/speech/audio_splitter.rb:77:in `new' 
from /Library/Ruby/Gems/1.8/gems/speech2text-0.3.4/lib/speech/audio_splitter.rb:77:in `initialize' 
from /Library/Ruby/Gems/1.8/gems/speech2text-0.3.4/lib/speech/audio_to_text.rb:15:in `new' 
from /Library/Ruby/Gems/1.8/gems/speech2text-0.3.4/lib/speech/audio_to_text.rb:15:in `to_text' 
from script/test_s2t.rb:6 

试图使用从Java命令行二进制speech2text如在相同的错误消息的运行时处理结果被反馈。它抱怨的那一行的是:

def initialize(file) 
    self.duration = Duration.new(`ffmpeg -i #{file} 2>&1`.strip.scan(/Duration: (.*),/).first.first) 
end 

但实际上存在是一个问题的想法似乎不太可能对我来说,因为当在任一irb或通过终端上的二进制执行它完美。

这里真正的问题是我根本不了解Ruby - 我在Java中工作,而且我只需要这个API来运行。事实上,它运行在某些方法告诉我,我可能安装它正确,但除非我可以得到一个.rb脚本工作或让它执行外部,我看不到如何使用它。我有JRuby推荐给我的,但对我来说这可能太复杂了,因为它似乎需要手动安装JRuby的ruby gem,我不知道该怎么做(或者至少,我不会我不知道该怎么做!)

对核心错误消息的任何建议非常感谢,但如果你看到明确的问题,请让我知道。

编辑 - 这确实是一个路径问题 - 至少在表面上是这样。 Ruby在查找涉及的确切文件时遇到了困难,因此,speech2text/ffmpeg因此而失败。谢谢!

回答

1

这闻起来像一个路径问题。您应该始终指定文件的完整路径,因为其他进程可以在内部将其工作目录更改为其他位置。另一种可能性是更改$PATH,因此ffmpeg无法解析为绝对路径。

通常,您应该尝试将路径指定为尽可能绝对。如果你什么也得不到回

`ffmpeg -i #{file} 2>&1`.strip.scan(/Duration: (.*),/).first.first 

,或者你的结果不包含:

+0

哪个特别的东西被误操作?这是宝石speech2text吗?红宝石安装本身?或者speech2text本身使用的东西(如ffmpeg,如你所说)?我很抱歉,我对此非常明确,只是我很少知道Ruby是如何工作的,而且我现在太忙了,无法开始玩这个游戏! – mtrc 2012-03-26 16:55:29

+0

此外 - 感谢您花时间阅读和回复。 – mtrc 2012-03-26 16:55:55

+0

两件事:'我喜欢pickles.wav'和'ffmpeg'二进制。您应该首先尝试使用声音文件的绝对路径。 – 2012-03-26 16:58:00

0

你使用反引号可以掩盖问题“时间:”后面的东西,你会得到你看到的错误。

首先,确认你的路径是正确的。任何嵌入的空格都会破坏您的命令,因为ffmpeg将接收文件名作为多个参数,而不是完整的文件路径。您可以使用任何系统调用或popen来防止出现这种情况,也可以使用任何嵌入式空间和单/双引号。至少,尝试:

`ffmpeg -i "#{file}" 2>&1` 

`ffmpeg -i '#{file}' 2>&1` 

应考虑将您的来电ffmpeg成多个步骤,以防守编写,并得到一些可见性是怎么回事。这是未经测试的代码,但应该给你的想法:

ffmpeg_results = `ffmpeg -i #{ file } 2>&1` 
if (!ffmpeg_results.strip.empty?) 
    duration = ffmpeg_results.strip[/Duration: (.*),/, 1] 
    if (!duration.strip.empty? && duration.to_i > 0) 
    ... 
    end 
else 
    puts "ffmpeg_results are empty" 
end 

你想尝试每一步,继续之前,至少要等到你确信你的过程是防弹的,或者因为你需要防弹。

+0

问题的一部分是,这是全部来自别人的Ruby代码!所以我只是对这条线做了些什么模糊的概念。你的帖子很好地澄清了它,所以我现在对它进行编辑更有信心。 – mtrc 2012-03-26 17:22:09

+0

使用反引号在子shell中执行某些操作在语言中很常见,并且充满了许多不能立即显示的问题。 – 2012-03-26 17:25:30