2012-11-28 2 views
2

나는 내 귀를 모스 부호를 읽는 훈련하고 생성, 명령 줄 sox (아래 참조)을 사용으로 사운드를 생성하는)루비 : 모스 부호으로 사운드

자신을 훈련하기 위해, 내가 쓴 조금 루비 스크립트를. 기본적으로 미리 만들어진 사운드 파일은 dit 초, dah 초, 복수 공백 (문자와 단어 사이, ditdah)이 붙어 있습니다. 그것은 작동하지만 대상 파일이 커질수록 점점 느려지고 있습니다.

wav 파일에 루비를 사용하여 소리를 생성하는 더 스마트 한 방법이 있습니까?


#!/usr/bin/ruby 

wordlength = 5 
blocklength = 12 
testlength = 5 
alphabet = [ "G", "A", "S", "5", "D", "0", "R", "/", "2", "L", "9", "T", "V", "I", "O", "Q", "C", "4", "F", "X", "E", "N", "U" ] 
playstring = "" 
block = "" 
page = "" 

MORSE = { 
     "!" => "---.", "\"" => ".-..-.", "$" => "...-..-", "'" => ".----.", 
     "(" => "-.--.", ")" => "-.--.-", "+" => ".-.-.", "," => "--..--", 
     "-" => "-....-", "." => ".-.-.-", "/" => "-..-.", "0" => "-----", 
     "1" => ".----", "2" => "..---", "3" => "...--", "4" => "....-", "5" => ".....", 
     "6" => "-....", "7" => "--...", "8" => "---..", "9" => "----.", ":" => "---...", 
     ";" => "-.-.-.", "=" => "-...-", "?" => "..--..", "@" => ".--.-.", "A" => ".-", 
     "B" => "-...", "C" => "-.-.", "D" => "-..", "E" => ".", "F" => "..-.", 
     "G" => "--.", "H" => "....", "I" => "..", "J" => ".---", "K" => "-.-", 
     "L" => ".-..", "M" => "--", "N" => "-.", "O" => "---", "P" => ".--.", 
     "Q" => "--.-", "R" => ".-.", "S" => "...", "T" => "-", "U" => "..-", 
     "V" => "...-", "W" => ".--", "X" => "-..-", "Y" => "-.--", "Z" => "--..", 
     "[" => "-.--.", "]" => "-.--.-", "_" => "..--.-", 
     "ka" => "-.-.-.", 
} 

startblock = "dit.wav ditspace.wav dit.wav ditspace.wav dit.wav ditspace.wav dah.wav wordspace.wav dit.wav ditspace.wav dit.wav ditspace.wav dit.wav ditspace.wav dah.wav wordspace.wav dit.wav ditspace.wav dit.wav ditspace.wav dit.wav ditspace.wav dah.wav wordspace.wav dah.wav ditspace.wav dit.wav ditspace.wav dah.wav ditspace.wav dit.wav ditspace.wav dah.wav wordspace.wav wordspace.wav wordspace.wav " 
endblock = "dit.wav ditspace.wav dah.wav ditspace.wav dit.wav ditspace.wav dah.wav ditspace.wav dit.wav blockspace.wav " 

playstring << "uebungsanfang.wav wordspace.wav " 
system ('/opt/local/bin/sox ' + playstring.to_s + ' tmp.wav 2>/dev/null') 
system ('mv tmp.wav tmp2.wav') 
playstring = "" 

testlength.times do |line| 
    printf line.to_s + " " 
    playstring << "gruppe" + (line+1).to_s + ".wav wordspace.wav " 
    playstring << startblock 
    system ('/opt/local/bin/sox tmp2.wav ' + playstring.to_s + ' tmp.wav 2>/dev/null') 
    system ('mv tmp.wav tmp2.wav') 
    playstring = "" 
    blocklength.times do |count| 
     word = alphabet.sample.to_s + alphabet.sample.to_s + alphabet.sample.to_s + alphabet.sample.to_s + alphabet.sample.to_s 
     word.each_char do |char| 
      MORSE[char].each_char do |dahdit| 
       case dahdit 
        when '.' then playstring << "dit.wav " 
        when '-' then playstring << "dah.wav " 
       end 
       playstring << "ditspace.wav " 
      end 
      playstring << "letterspace.wav " 
      system ('/opt/local/bin/sox tmp2.wav ' + playstring.to_s + ' tmp.wav 2>/dev/null') 
      system ('mv tmp.wav tmp2.wav') 
      playstring = "" 
     end 
     playstring << "wordspace.wav " 
     block << word.to_s + " " 
    end 
    playstring << endblock 
    playstring << "blockspace.wav " 
    system ('/opt/local/bin/sox tmp2.wav ' + playstring.to_s + ' tmp.wav') #2>/dev/null 
    system ('mv tmp.wav tmp2.wav') 
    playstring = "" 
    page << "%02d" %(line+1).to_s + ": VVV <ak> " + block + "+" + "\n" 
    block = "" 
end 
playstring << "uebungsende.wav" 
system ('/opt/local/bin/sox tmp2.wav ' + playstring.to_s + ' tmp.wav 2>/dev/null') # & 
system ('rm tmp2.wav') 
system ('mv tmp.wav cw.wav') 
system ('lame --cbr -b 128 cw.wav cw.mp3') 
system ('rm cw.wav') 
puts 
puts page 

으로 사운드 사용 미리 생성 삭스 : 함유

sox -e floating-point -r 22500 -n -t wav - synth 0.3 sin 0 > letterspace.wav 

파일 Übungsende 등 (테스트, 테스트 종료, 그룹 하나, 둘의 시작, ...) 나는 (파일 업로드에 "GRUP까지 한

say -v Steffi --file-format=WAVE [email protected] -o uebungsanfang.wav "Anfang der Übung." 

: 맥 OS X의 명령 say을 사용하여 생성된다 pe 5 ", 즉. "group 5") 여기에 : https://docs.google.com/open?id=0B4QwMfBGRCjVbE5iZHpHMHBKT3c

답변

2

나는 루비를 모른다. 그래서 나는 네가하고있는 것을 잘 모르겠다. 그러나 점, 대쉬, 스페이스 등을 나타내는 오디오 파일을 생성하고있는 것처럼 보인다. 그런 다음 sox를 ​​사용하여 해당 파일의 원시 데이터를 새로운 파일로 연결 한 다음 절름발이를 사용하여 mp3로 변환합니다.

전체적으로 이것은 비효율적인데, 그 이유는 비행 중에 생성 될 수있는 원시 파일을 너무 많이 사용하기 때문입니다. 즉, 가장 효율적인 방법으로 다시 작성할 필요는 없습니다. 파일 IO를 사용하면 코드가 간단 해집니다. 그래서 파일 IO가 가능한 한 빨리되도록 코드를 다시 작성합니다. 이 경우 WAV 파일을 반복해서 열고 파싱해야하는 경우 특히 32 비트 부동 소수점 WAV 파일을 사용하면 속도가 느려질 수 있습니다. 당신이하는 일에 절대적으로 필요하지 않습니다. 16 비트 정수 WAV 파일을 사용하여 시작할 것입니다.

au과 같은 더 간단한 형식을 사용해보십시오 (충분하다면 u-law를 사용하고 그렇지 않은 경우 16 비트 선형을 사용하십시오). "raw", 일명 "헤더없는"파일을 시도해 볼 수도 있습니다. 사용하고자하는 샘플의 샘플 레이트, 비트 심도, 엔디안 니스 및 샘플 수를 sox 및 절름발이에게 알려줍니다. 그런 다음 원시 데이터를 연결하기 위해 sox를 ​​사용할 필요가 없으며 조금 더 빨라야하는 "cat"유닉스 도구를 사용할 수 있습니다.

+0

감사합니다. IO가 문제가 될 것으로 생각했습니다. 나는 당신의 제안을 최대한 빨리 시도 할 것입니다 (일명 사무실에있는 한 빨리). – Christian