2

モールス信号を耳で読む訓練をしています ;)

自分自身を訓練するために、コマンドラインを使用してサウンドファイルを生成する小さな Ruby スクリプトを作成しましたsox(以下を参照)。基本的には、dits、dahs、および複数のスペース ( dits とdahs の間、文字の間、単語の間) の事前に作成されたサウンドファイルを取得し、それらを接着するだけです。動作しますが、ターゲット ファイルが大きくなるほど遅くなります。

ruby を使用してサウンドを 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 を使用して事前に生成されています。

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

などを含むファイルÜbungsende(テストの開始、テストの終了、グループ 1、2、...) は、MAc OS X コマンドを使用して生成されますsay

say -v Steffi --file-format=WAVE --data-format=LEF32@22500 -o uebungsanfang.wav "Anfang der Übung."

ここにファイルをアップロードしました(「グループ5」、つまり「グループ5」まで): https://docs.google.com/open?id=0B4QwMfBGRCjVbE5iZHpHMHBKT3c

4

1 に答える 1

2

私はルビーを知らないので、あなたが何をしているのか完全にはわかりませんが、ドット、ダッシュ、スペースなどを表すオーディオファイルを生成し、sox を使用してそれらのファイルから生データを連結しているようですlame を使用して mp3 に変換する新しいファイルに変換します。

全体として、これは非常に非効率的です。その主な理由は、オンザフライで生成できる未加工のファイルで多くのことを行っているためです。とはいえ、可能な限り最も効率的な方法で書き直す価値はおそらくありません。結局のところ、ファイル IO をすべて実行すると、コードが単純になります。そのため、ファイル IO ができるだけ高速になるようにコードを書き直します。この場合、WAV ファイル、特に 32 ビット浮動小数点の WAV ファイルを何度も開いて解析する必要があるため、速度が低下している可能性があります。あなたがしていることのために、あなたは絶対にそれを必要としません。まず、16 ビット整数の WAV ファイルを使用します。

さらに高速化するには、中間体としてauなどの単純な形式を試してください(十分な場合は u-law を使用し、そうでない場合は 16 ビット リニアを使用します)。また、「生」、別名「ヘッダーレス」ファイルを試すこともできます。使用するサンプルレート、ビット深度、エンディアン、およびサンプル数を sox と lame に指示するだけです。次に、生データを連結するために sox を使用する必要はありません。「cat」UNIX ツールを使用するだけで、少し高速になります。

于 2012-11-28T22:38:57.577 に答える