Automatically cut audio books
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

90 řádky
3.0KB

  1. module Diffs where
  2. import Data.Int (Int32, )
  3. import Control.Arrow (arr, (<<<), (^<<), )
  4. import qualified Synthesizer.Causal.Process as Causal
  5. import qualified Sound.SoxLib as SoxLib
  6. import qualified Data.StorableVector.Lazy as SVL
  7. import qualified Synthesizer.Storable.Signal as SigSt
  8. import qualified Synthesizer.Generic.Signal as Sig
  9. import qualified Synthesizer.Basic.Binary as Bin
  10. import qualified Synthesizer.Generic.Analysis as Ana
  11. import qualified Synthesizer.Generic.Cut as Cut
  12. import qualified Synthesizer.Generic.Fourier as Four
  13. import qualified Foreign.Storable as Stor
  14. import qualified Number.Complex as C
  15. import qualified Algebra.Additive as A
  16. import qualified Algebra.Transcendental as T
  17. import Graphics.Matplotlib
  18. import Driver
  19. import Types
  20. calcDiff :: IO ()
  21. calcDiff = withAudio "out002.wav" $ \a' -> withAudio "out004.wav" $ \b' -> do
  22. let a = prepare a'
  23. b = prepare b'
  24. maxLen = min (Cut.length a) (Cut.length b)
  25. l = maxLen `div` 5 -- take first 20%
  26. sa = Cut.take l a
  27. sb = Cut.take l b
  28. fsa = fourTrafo $ padWithZeros sa
  29. fsb = fourTrafo $ padWithZeros sb
  30. --negb = Causal.apply (arr (*(-1))) sb
  31. --conjb = Causal.apply (arr conjugate) sb
  32. let corr = Four.transformBackward
  33. (Sig.zipWith (*) (Four.transformForward fsa) (Causal.apply (arr C.conjugate) $ Four.transformForward fsb))
  34. print $ Cut.length sa
  35. print $ Cut.length sb
  36. print $ Cut.length corr
  37. let reals = (Causal.apply (arr $ C.real) corr) :: SVL.Vector Float
  38. imgs = (Causal.apply (arr $ C.imag) corr) :: SVL.Vector Float
  39. ys = SVL.unpack reals :: [Float]
  40. --zs = SVL.unpack imgs :: [Float]
  41. xs = [1..length ys]
  42. onscreen $ line xs ys
  43. --onscreen $ line xs zs
  44. prepare :: SVL.Vector Int32 -> SVL.Vector (C.T Float)
  45. prepare sig =
  46. head .
  47. map (Causal.apply (arr Bin.toCanonical)) .
  48. SVL.deinterleave 2 $ sig
  49. readFirst :: IO (SVL.Vector Int32)
  50. readFirst = withAudio "out003.wav" $ \sig -> do
  51. let s = Cut.take 100 sig
  52. return s
  53. --padWithZeros :: SVL.Vector (C.T Float) -> SVL.Vector (C.T Float)
  54. padWithZeros x = pad <> x <> pad
  55. where zeros = SVL.repeat SVL.defaultChunkSize 0
  56. l = SVL.length x
  57. pad = SVL.take (l `div` 2) zeros
  58. sine :: SVL.Vector Float
  59. sine = SVL.pack SVL.defaultChunkSize $ map sin [0::Float,0.1..]
  60. plotVec :: SVL.Vector Float -> IO ()
  61. plotVec v = let ys = SVL.unpack v
  62. xs = [1..length ys]
  63. in onscreen $ line xs ys
  64. fourTrafo :: (A.C a, T.C a, Stor.Storable a) => SVL.Vector a -> SVL.Vector a
  65. fourTrafo = Causal.apply (arr $ C.real) .
  66. Four.transformForward .
  67. Causal.apply (arr C.fromReal)
  68. four :: FilePath -> IO ()
  69. four input = withAudio input $ \a' -> do
  70. let a = prepare a'
  71. sa = a
  72. r = Four.transformForward sa
  73. reals = (Causal.apply (arr $ C.real) r) :: SVL.Vector Float
  74. ys = SVL.unpack reals :: [Float]
  75. xs = [1..length ys]
  76. print $ SVL.length r
  77. onscreen $ line xs ys