2

pulse-simpleパッケージを使用して、次のコードを作成しました。

main=do
    s<-simpleNew Nothing "example" Record Nothing "this is an example application"
      (SampleSpec (F32 LittleEndian) 44100 1) Nothing Nothing
    xs<-simpleRead s $ 44100*10 :: IO [Float]
    simpleFree s
    play xs

play :: [Float] -> IO ()
play d = do
    s<-simpleNew Nothing "example" Play Nothing "this is an example application"
        (SampleSpec (F32 LittleEndian) 44100 1) Nothing Nothing
    simpleWrite s d
    simpleDrain s
    simpleFree s

これは機能し、10 秒間のオーディオを録音してから再生します。

別のプログラムで再生したり、変換したりできるように、オーディオ ファイルをエンコードして (.wav rr として) 保存したいと考えています。これはもっと音声に関する質問だと思うので、Haskell 以外の人のために、基本的に 44100*10 の長さの float の配列を持っています。他のライブラリが必要になると思います。

前もって感謝します。

4

1 に答える 1

3

WAVE パッケージData.WAVEのモジュールが機能するようです。

を変換[Float]し、レコードのフィールド[Int32]を構成します。の残りを入力し、を使用してファイルを書き込みます。waveSamplesWAVEWAVEHeaderputWAVEFile

import Data.WAVE

writeWaveFile :: String -> [Float] -> IO ()
writeWaveFile path floats = putWAVEFile path wave
  where wave = WAVE wHeader wSamples
        wHeader = WAVEHeader { waveNumChannels = 1
                             , waveFrameRate = 44100
                             , waveBitsPerSample = 32 -- or maybe 8?
                             , waveFrames = Nothing
                             }
        wSamples = [[ ... | x <- floats ]]

...適切な関数を入力しFloat -> Int32ます。

于 2015-07-14T05:35:27.410 に答える