Automatically cut audio books
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
4.1KB

  1. module Main (main) where
  2. import Lib
  3. import Parser
  4. import Driver
  5. import Types
  6. import qualified System.Console.GetOpt as Opt
  7. import qualified Algebra.RealRing as Real
  8. import qualified Data.StorableVector.Lazy as SVL
  9. import qualified Data.List.HT as ListHT
  10. import qualified Synthesizer.Basic.Binary as Bin
  11. import qualified Synthesizer.Causal.Process as Causal
  12. import Shell.Utility.Exit (exitFailureMsg)
  13. import System.Environment (getArgs, getProgName, )
  14. import Control.Monad (when, )
  15. import Text.Printf (printf, )
  16. import Data.Foldable (forM_, )
  17. import Control.Arrow (arr, (<<<), (^<<), )
  18. import System.Console.GetOpt
  19. (getOpt, usageInfo, ArgDescr(NoArg, ReqArg), )
  20. import qualified Sound.SoxLib as SoxLib
  21. import Data.Int (Int32, )
  22. --runDehum :: Flags -> FilePath -> FilePath -> IO ()
  23. --runDehum flags input output =
  24. -- withSound flags input $ \fmtIn params sig ->
  25. -- SoxLib.withWrite
  26. -- (writerInfoFromFormat fmtIn params)
  27. -- output $ \fmtOut ->
  28. -- SoxLib.writeStorableVectorLazy fmtOut $
  29. -- SVL.interleaveFirstPattern $
  30. -- map
  31. -- (Causal.apply
  32. -- (arr (Bin.fromCanonicalWith Real.roundSimple)
  33. -- <<<
  34. -- dehum params
  35. -- <<<
  36. -- arr Bin.toCanonical)) $
  37. -- SVL.deinterleave (numChannels params) sig
  38. --runEnvelope :: Flags -> FilePath -> FilePath -> IO ()
  39. --runEnvelope flags input output =
  40. -- withSound flags input $ \fmtIn params sig ->
  41. -- SoxLib.withWrite
  42. -- (monoInfoFromFormat fmtIn params)
  43. -- output $ \fmtOut ->
  44. -- SoxLib.writeStorableVectorLazy fmtOut $
  45. -- Causal.apply
  46. -- (arr (Bin.fromCanonicalWith Real.roundSimple)) $
  47. -- trackEnvelope params $
  48. -- map
  49. -- (Causal.apply
  50. -- (arr (^2)
  51. -- <<<
  52. -- dehum params
  53. -- <<<
  54. -- arr Bin.toCanonical)) $
  55. -- SVL.deinterleave (numChannels params) sig
  56. --runSizes :: Flags -> FilePath -> IO ()
  57. --runSizes flags input =
  58. -- withSound flags input $ \_fmt params sig ->
  59. -- mapM_ print $ pieceDurations params sig
  60. runLabels :: Flags -> FilePath -> IO ()
  61. runLabels flags input =
  62. withSound flags input $ \_fmt params sig ->
  63. mapM_ (\(n, (from,to)) -> printf "%s\t%s\t%d\n" from to n) $
  64. zip [(0::Int) ..] $
  65. ListHT.mapAdjacent (,) $
  66. map (\t ->
  67. case divMod (Real.roundSimple (fromIntegral t * 10^6 / sampleRate params)) (10^6) of
  68. -- FIXME: the comma is certainly only correct in German locale
  69. (seconds,micros) ->
  70. printf "%d,%06d" seconds (micros::Integer) :: String) $
  71. scanl (+) 0 $
  72. prefetch (preStart params) $
  73. pieceDurations params sig
  74. getChops :: Flags -> FilePath -> IO [SVL.Vector Int32]
  75. getChops flags input = withSound flags input $ \_ params sig -> do
  76. let ps = chopLazy params sig
  77. a = show ps
  78. putStrLn $ [last a]
  79. return $! ps
  80. {- |
  81. > runChop flags "in.wav" "%03d.wav"
  82. -}
  83. runChop :: Flags -> FilePath -> FilePath -> IO ()
  84. runChop flags input output =
  85. withSound flags input $ \fmtIn params sig ->
  86. forM_ (zip [(0::Int)..] $ chopLazy params sig) $ \(n,piece) ->
  87. print piece
  88. --SoxLib.withWrite
  89. -- (writerInfoFromFormat fmtIn params)
  90. -- (printf output n) $ \fmtOut ->
  91. -- SoxLib.writeStorableVectorLazy fmtOut piece
  92. main :: IO ()
  93. main = SoxLib.formatWith $ do
  94. argv <- getArgs
  95. let (opts, files, errors) =
  96. getOpt Opt.RequireOrder description argv
  97. when (not $ null errors) $
  98. exitFailureMsg (init (concat errors))
  99. flags <- foldl (>>=) (return defltFlags) opts
  100. --if flagComputeEnvelope flags
  101. -- then
  102. -- case files of
  103. -- [input,output] -> runEnvelope flags input output
  104. -- [] -> exitFailureMsg "need input and output file envelope computation"
  105. -- _ -> exitFailureMsg "more than two file names given"
  106. -- else
  107. case files of
  108. --[input,output] -> runChop flags input output
  109. [input] -> getChops flags input >>= print --runLabels flags input
  110. [] -> exitFailureMsg "no input or output given"
  111. _ -> exitFailureMsg "more than two file names given"