mmsyn6ukr 0.5.1.0 → 0.5.2.0
raw patch · 5 files changed
+87/−27 lines, 5 filesbinary-addedPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- -.wav binary
- ChangeLog.md +6/−1
- Map.txt +39/−0
- Melodics/Ukrainian.hs +39/−23
- mmsyn6ukr.cabal +3/−3
+ -.wav view
binary file changed (absent → 4542 bytes)
ChangeLog.md view
@@ -87,6 +87,11 @@ * Fifth version. Changed a behaviour of the Main.main function, added a possibility of more control on the program mmsyn6ukr. -## 0.5.0.0 -- 2019-12-09+## 0.5.1.0 -- 2019-12-09 * Fifth version revised A. Fixed the genControl function, added more documentation, make the exception message more exact.++## 0.5.2.0 -- 2019-12-16++* Fifth version revised B. Added support for better pauses and therefore additional file "-.wav". Fixed issues with the conversion in case of punctuation separated words. +Added additional information about sound files. Deprecated (===) operator in favour of `elem` function.
+ Map.txt view
@@ -0,0 +1,39 @@+Sound | Corresponding | File+representation | file | duration, s+-------------------------------------------------------------------+"-" -> "-.wav" -> 0.101995+"0" -> "0.wav" -> 0.051020+"1" -> "1.wav" -> 0.153016+"а" -> "A.wav" -> 0.138231+"б" -> "B.wav" -> 0.057098+"в" -> "C.wav" -> 0.082268+"г" -> "D.wav" -> 0.076825+"д" -> "E.wav" -> 0.072063+"дж" -> "F.wav" -> 0.048934+"дз" -> "G.wav" -> 0.055601+"е" -> "H.wav" -> 0.093605+"ж" -> "I.wav" -> 0.070612+"з" -> "J.wav" -> 0.056054+"и" -> "K.wav" -> 0.099955+"й" -> "L.wav" -> 0.057143+"к" -> "M.wav" -> 0.045397+"л" -> "N.wav" -> 0.064036+"м" -> "O.wav" -> 0.077370+"н" -> "P.wav" -> 0.074240+"о" -> "Q.wav" -> 0.116463+"п" -> "R.wav" -> 0.071837+"р" -> "S.wav" -> 0.049206+"с" -> "T.wav" -> 0.074603+"сь" -> "U.wav" -> 0.074558+"т" -> "V.wav" -> 0.110658+"у" -> "W.wav" -> 0.109070+"ф" -> "X.wav" -> 0.062268+"х" -> "Y.wav" -> 0.077188+"ц" -> "Z.wav" -> 0.053061+"ць" -> "a.wav" -> 0.089342+"ч" -> "b.wav" -> 0.057551+"ш" -> "c.wav" -> 0.066077+"ь" -> "d.wav" -> 0.020227+"і" -> "e.wav" -> 0.094150+"ґ" -> "f.wav" -> 0.062948+-------------------------------------------------------------------
Melodics/Ukrainian.hs view
@@ -34,12 +34,12 @@ data1 <- B.readFile file let dataN = B.drop 44 data1 in return dataN --- | The function that actually produces a .raw file.+-- | The function that actually produces a .raw file. The mapping table is given in the @Map.txt@ file. appendS16LEFile :: V.Vector String -> Handle -> IO () appendS16LEFile xs hdl | not (V.null xs) = do dataFileList <- mapM getDataFileName - ["0.wav", "1.wav", "A.wav", "B.wav", "C.wav", "D.wav", "E.wav", "F.wav", "G.wav", "H.wav", + ["-.wav", "0.wav", "1.wav", "A.wav", "B.wav", "C.wav", "D.wav", "E.wav", "F.wav", "G.wav", "H.wav", "I.wav", "J.wav", "K.wav", "L.wav", "M.wav", "N.wav", "O.wav", "P.wav", "Q.wav", "R.wav", "S.wav", "T.wav", "U.wav", "V.wav", "W.wav", "X.wav", "Y.wav", "Z.wav", "a.wav", "b.wav", "c.wav", "d.wav", "e.wav", "f.wav"]@@ -51,11 +51,11 @@ closedHdl <- hIsClosed hdl if closedHdl then do - B.appendFile rs $ dataList V.! (getBFst' (0, V.fromList [("0", 0), ("1", 1), ("а", 2), ("б", 3), - ("в", 4), ("г", 5), ("д", 6), ("дж", 7), ("дз", 8), ("е", 9), ("ж", 10), ("з", 11), ("и", 12), - ("й", 13), ("к", 14), ("л", 15), ("м", 16), ("н", 17), ("о", 18), ("п", 19), ("р", 20), - ("с", 21), ("сь", 22), ("т", 23), ("у", 24), ("ф", 25), ("х", 26), ("ц", 27), ("ць", 28), ("ч", 29), - ("ш", 30), ("ь", 31), ("і", 32), ("ґ", 33)]) u)+ B.appendFile rs $ dataList V.! (getBFst' (0, V.fromList [("-", 0), ("0", 1), ("1", 2), ("а", 3), ("б", 4), + ("в", 5), ("г", 6), ("д", 7), ("дж", 8), ("дз", 9), ("е", 10), ("ж", 11), ("з", 12), ("и", 13), + ("й", 14), ("к", 15), ("л", 16), ("м", 17), ("н", 18), ("о", 19), ("п", 20), ("р", 21), + ("с", 22), ("сь", 23), ("т", 24), ("у", 25), ("ф", 26), ("х", 27), ("ц", 28), ("ць", 29), ("ч", 30), + ("ш", 31), ("ь", 32), ("і", 33), ("ґ", 34)]) u) else error "File is not closed!" else error "Data sound file is not read!") xs hClose hdl@@ -66,8 +66,14 @@ convertToProperUkrainian :: String -> V.Vector String convertToProperUkrainian ys = toVector . correctA . applyChanges . createTuplesByAnalysis . changeJotted . secondConv . wasFstConverted . filterUkr $ ys +correctB :: [String] -> [String]+correctB ys@(xs:xss) | compare (length . filter (== "1") . takeFromFT2 6 $ ys) 1 == GT = + map (\t -> if t == "1" || isPunctuation (head t) then "-" else t) (takeFromFT2 6 ys) ++ correctB (dropFromFT2 6 ys)+ | otherwise = (if isPunctuation . head $ xs then "-" else xs):correctB xss+correctB [] = []+ filterUkr :: String -> String -filterUkr xs = concatMap (\x -> if isUkrainian x then [toLower x] else if isSpace x || isControl x then [x] else []) xs+filterUkr xs = concatMap (\x -> if isUkrainian x then [toLower x] else if isSpace x || isControl x || isPunctuation x then [x] else []) xs secondConv :: String -> String secondConv (y:ys) | if isSpace y then True else isControl y = '1':secondConv ys@@ -134,9 +140,6 @@ applyChanges [(xs, _)] = [(xs, Z)] applyChanges _ = [] -(===) :: Eq a => a -> [a] -> Bool-(===) x ys = any (\y -> x == y) ys- -- in the further ??T functions the last (, T) means that it must be afterwards be separated with the soft sign into two tuples (1 additional function in the composition) -- need further processing means that there should be additional checks and may be transformations. May be they can be omitted @@ -154,9 +157,9 @@ гT _ = ("г", Z) дT :: [(String, Triple)] -> (String, Triple)-дT t1@(_:_) | takeFromFT_ 1 t1 === ["\1078","\1095","\1096"] = ("\1076\1078", Z) -- need further processing д дж- | takeFromFT_ 2 t1 === ["\1089\1100","\1094\1100"] = ("\1076\1079\1100", T) -- need further processing д дзь- | takeFromFT_ 1 t1 === ["\1079","\1089","\1094"] = ("\1076\1079", Z) -- need further processing д дз +дT t1@(_:_) | takeFromFT_ 1 t1 `elem` ["\1078","\1095","\1096"] = ("\1076\1078", Z) -- need further processing д дж+ | takeFromFT_ 2 t1 `elem` ["\1089\1100","\1094\1100"] = ("\1076\1079\1100", T) -- need further processing д дзь+ | takeFromFT_ 1 t1 `elem` ["\1079","\1089","\1094"] = ("\1076\1079", Z) -- need further processing д дз | otherwise = ("\1076", Z) дT _ = ("д", Z) @@ -166,15 +169,15 @@ дзT _ = ("дз", Z) жT :: [(String, Triple)] -> (String, Triple)-жT t1@(_:_) | takeFromFT 2 t1 === ["\1089\1100","\1094\1100"] = ("\1079\1100", T)+жT t1@(_:_) | takeFromFT 2 t1 `elem` ["\1089\1100","\1094\1100"] = ("\1079\1100", T) | otherwise = ("\1078", Z) жT _ = ("ж", Z) зT :: [(String, Triple)] -> (String, Triple)-зT t1@(_:_) | takeFromFT_ 1 t1 === ["\1078","\1095","\1096"] || takeFromFT_ 2 t1 == "\1076\1078" = ("\1078", Z)+зT t1@(_:_) | takeFromFT_ 1 t1 `elem` ["\1078","\1095","\1096"] || takeFromFT_ 2 t1 == "\1076\1078" = ("\1078", Z) | isSoftDOrL t1 = ("\1079\1100", T)- | takeFromFT 1 t1 === ["\1095","\1096"] = ("\1096", Z) -- need further processing з ш- | takeFromFT 1 t1 === ["\1089","\1094"] || takeFromFT_ 1 t1 === ["\1082","\1087","\1090","\1092","\1093"] = ("\1089", Z) -- need further processing з с+ | takeFromFT 1 t1 `elem` ["\1095","\1096"] = ("\1096", Z) -- need further processing з ш+ | takeFromFT 1 t1 `elem` ["\1089","\1094"] || takeFromFT_ 1 t1 `elem` ["\1082","\1087","\1090","\1092","\1093"] = ("\1089", Z) -- need further processing з с | otherwise = ("\1079", Z) зT _ = ("з", Z) @@ -206,7 +209,7 @@ стT :: [(String, Triple)] -> (String, Triple) стT t1@(_:_) | isVoicedObstruent (takeFromFT_ 1 t1) || isVoicedObstruent (takeFromFT_ 2 t1) = ("\1079", Z) | takeFromFT_ 3 t1 == "\1089\1100\1082" || takeFromFT_ 2 t1 == "\1094\1100" = ("\1089\1100", Z)- | takeFromFT_ 1 t1 === ["\1089","\1085"] = ("\1089", Z)+ | takeFromFT_ 1 t1 `elem` ["\1089","\1085"] = ("\1089", Z) | takeFromFT_ 1 t1 == "\1095" = ("\1096", Z) | otherwise = ("\1089\1090", T) стT _ = ("ст", T)@@ -223,7 +226,7 @@ | takeFromFT_ 2 t1 == "\1094\1100" = ("\1094\1100", Z) | takeFromFT_ 1 t1 == "\1094" = ("\1094", Z) | isSoftDen t1 = ("\1090\1100", T)- | takeFromFT_ 1 t1 === ["\1095","\1096"] = ("\1095", Z)+ | takeFromFT_ 1 t1 `elem` ["\1095","\1096"] = ("\1095", Z) | otherwise = ("\1090", Z) тT _ = ("т", Z) @@ -264,13 +267,13 @@ цьT _ = ("ць", Z) чT :: [(String, Triple)] -> (String, Triple)-чT t1@(_:_) | takeFromFT_ 2 t1 === ["\1089\1100","\1094\110"] = ("\1094\1100", Z)+чT t1@(_:_) | takeFromFT_ 2 t1 `elem` ["\1089\1100","\1094\110"] = ("\1094\1100", Z) | isVoicedObstruent (takeFromFT_ 2 t1) || isVoicedObstruent (takeFromFT_ 1 t1) = ("\1076\1078", Z) | otherwise = ("\1095", Z) чT _ = ("ч", Z) шT :: [(String, Triple)] -> (String, Triple)-шT t1@(_:_) | takeFromFT_ 2 t1 === ["\1089\1100","\1094\110"] = ("\1089\1100", Z)+шT t1@(_:_) | takeFromFT_ 2 t1 `elem` ["\1089\1100","\1094\110"] = ("\1089\1100", Z) | isVoicedObstruent (takeFromFT_ 2 t1) || isVoicedObstruent (takeFromFT_ 1 t1) = ("\1078", Z) | otherwise = ("\1096", Z) шT _ = ("ш", Z)@@ -300,11 +303,24 @@ where ks = fst (head ts) k = length ks +takeFromFT2 :: Int -> [String] -> [String]+takeFromFT2 n ts | if compare 0 n /= LT then True else null ts = []+ | compare k n /= LT = [ks]+ | otherwise = ks:takeFromFT2 (n - k) (tail ts)+ where ks = head ts+ k = length ks++dropFromFT2 :: Int -> [String] -> [String]+dropFromFT2 n ts | if compare 0 n /= LT then True else null ts = []+ | compare k n /= LT = tail ts+ | otherwise = dropFromFT2 (n - k) (tail ts)+ where k = length (head ts)+ takeFromFT_ :: Int -> [(String, Triple)] -> String takeFromFT_ n ts = takeFromFT n (filter (\(xs, _) -> (xs /= "1" && xs /= "0")) ts) toVector :: [(String, Triple)] -> V.Vector String-toVector ts = V.fromList . mapI2 (\x -> not . null . fst $ x) fst (\_ -> []) $ ts+toVector ts = V.fromList . correctB . mapI2 (\x -> not . null . fst $ x) fst (\_ -> []) $ ts isUkrainian :: Char -> Bool isUkrainian y | (y >= '\1040' && y <= '\1065') || (y >= '\1070' && y <= '\1097') = True
mmsyn6ukr.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: mmsyn6ukr-version: 0.5.1.0+version: 0.5.2.0 synopsis: A musical instrument synthesizer or a tool for Ukrainian language listening description: A program can be used as a musical instrument synthesizer or for Ukrainian speech synthesis especially for poets and writers homepage: https://hackage.haskell.org/package/mmsyn6ukr@@ -13,8 +13,8 @@ copyright: (c) OleksandrZhabenko 2019 category: Language build-type: Simple-extra-source-files: ChangeLog.md, README.md-data-files: 0.wav, 1.wav, A.wav, B.wav, C.wav, D.wav, E.wav, F.wav, G.wav, H.wav, I.wav, J.wav, K.wav, L.wav, M.wav, N.wav, O.wav, P.wav, Q.wav, R.wav, S.wav, T.wav, U.wav, V.wav, W.wav, X.wav, Y.wav, Z.wav, a.wav, b.wav, c.wav, d.wav, e.wav, f.wav+extra-source-files: ChangeLog.md, README.md, Map.txt+data-files: -.wav, 0.wav, 1.wav, A.wav, B.wav, C.wav, D.wav, E.wav, F.wav, G.wav, H.wav, I.wav, J.wav, K.wav, L.wav, M.wav, N.wav, O.wav, P.wav, Q.wav, R.wav, S.wav, T.wav, U.wav, V.wav, W.wav, X.wav, Y.wav, Z.wav, a.wav, b.wav, c.wav, d.wav, e.wav, f.wav cabal-version: >=1.10 library