2012-03-26 1 views
0

저는 2 일 동안 특정 Google API를 사용하려고했습니다. 3 개의 다른 프로젝트가 시도되었는데, 하나는 Perl (매우 초기에 사망)에서 하나는 Python (마지막 장애물에서 부서지면서 태워졌습니다)이고 마지막 하나는 Ruby입니다. 표준 명령으로 명령 줄에서 호출 할 때 루비 하나는 실제로 작동 예 :Ruby Gem이 명령 행에서 작동하고 irb가 루비 스크립트 또는 Java 프로세스로 실행될 때 실패합니다.

require 'speech' 
audio = Speech::AudioToText.new("i-like-pickles.wav") 
puts audio.to_text.inspect 
: 당신이 irb를 열고 프로젝트 사이트에있는 샘플 코드에 넣어 경우에도 작동

speech2text somefile.wav 

그러나 위와 같은 Ruby .rb 파일은 ruby -rubygems somescript.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 

다시 공급되는 동일한 오류 메시지의 런타임 처리 결과 자바에서 명령 줄 이진 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는 정확한 파일을 찾는데 어려움을 겪고 있었고 speech2text/ffmpeg는 결과적으로 오히려 애매하게 실패했습니다. 감사!

답변

1

경로 문제와 같은 냄새가납니다. 다른 프로세스가 자신의 작업 디렉토리를 다른 위치로 내부적으로 변경할 수 있으므로 항상 파일의 전체 경로를 지정해야합니다. 또 다른 가능성은 $PATH으로 변경되어 ffmpeg을 절대 경로로 해석 할 수 없습니다.

일반적으로 가능한 한 절대 경로를 지정해야합니다. 다시 아무것도 얻지 않는 경우

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

, 또는 결과를 포함하지 않는 : 역 따옴표의

+0

어떤 특정 문제가 잘못 처리되고 있습니까? 그것은 보석 speech2text입니까? 루비 자체 설치? 또는 speech2text 자체가 사용하는 내용 (ffmpeg과 같이)은 무엇입니까? 미안해. 너무 노골적으로 생각하고있어 미안하다. 루비가 어떻게 작동하는지, 그리고 오늘 너무 놀랐어. – mtrc

+0

또한 - 시간을내어 읽고 응답 해 주셔서 감사합니다. – mtrc

+0

두 가지 :'i-like-pickles.wav'와'ffmpeg' 바이너리. 먼저 사운드 파일의 절대 경로를 사용해야합니다. –

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

문제의 일부는 이것이 다른 누군가의 루비 코드에서 온 것입니다! 그래서 나는 그 행이 무엇을했는지 막연한 생각 만했습니다. 게시물을 크게 정리 했으므로 지금 수정하는 것에 대해 조금 더 확신합니다. – mtrc

+0

서브 셸 내부에서 무언가를 실행하기 위해 백틱을 사용하는 것은 언어에서 매우 일반적이며 즉시 볼 수없는 많은 문제들이 있습니다. –