mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-23 03:32:51 -06:00
ATK: prepare for supporting multiple languages.
This commit is contained in:
@@ -31,25 +31,48 @@ import System.IO.Unsafe
|
|||||||
|
|
||||||
config = "/home/aarne/atk/atkrec/atkrec.cfg"
|
config = "/home/aarne/atk/atkrec/atkrec.cfg"
|
||||||
|
|
||||||
{-# NOINLINE initialized #-}
|
data ATKLang = ATKLang {
|
||||||
initialized :: IORef Bool
|
hmmlist :: FilePath,
|
||||||
initialized = unsafePerformIO $ newIORef False
|
mmf0 :: FilePath,
|
||||||
|
mmf1 :: FilePath,
|
||||||
|
dict :: FilePath
|
||||||
|
}
|
||||||
|
|
||||||
initATK :: IO ()
|
getLanguage :: String -> IO ATKLang
|
||||||
initATK = do
|
getLanguage l =
|
||||||
b <- readIORef initialized
|
case l of
|
||||||
when (not b) $ do
|
"en_UK" -> do
|
||||||
hPutStrLn stderr "Initializing..."
|
atk_home <- getEnv "ATK_HOME"
|
||||||
atk_home <- getEnv "ATK_HOME"
|
let res = atk_home ++ "/Resources"
|
||||||
let res = atk_home ++ "/Resources"
|
return $ ATKLang {
|
||||||
hmmlist = res ++ "/UK_SI_ZMFCC/hmmlistbg"
|
hmmlist = res ++ "/UK_SI_ZMFCC/hmmlistbg",
|
||||||
mmf0 = res ++ "/UK_SI_ZMFCC/WI4"
|
mmf0 = res ++ "/UK_SI_ZMFCC/WI4",
|
||||||
mmf1 = res ++ "/UK_SI_ZMFCC/BGHMM2"
|
mmf1 = res ++ "/UK_SI_ZMFCC/BGHMM2",
|
||||||
dict = res ++ "/beep.dct"
|
dict = res ++ "/beep.dct" }
|
||||||
initialize config
|
_ -> fail $ "AKTSpeechInput: language " ++ l ++ " not supported"
|
||||||
loadHMMSet "hmm_english" hmmlist mmf0 mmf1
|
|
||||||
loadDict "dict_english" dict
|
-- | List of the languages for which we have already loaded the HMM
|
||||||
writeIORef initialized True
|
-- and dictionary.
|
||||||
|
{-# NOINLINE languages #-}
|
||||||
|
languages :: IORef [String]
|
||||||
|
languages = unsafePerformIO $ newIORef []
|
||||||
|
|
||||||
|
initATK :: String -> IO ()
|
||||||
|
initATK language =
|
||||||
|
do
|
||||||
|
ls <- readIORef languages
|
||||||
|
when (null ls) $ do
|
||||||
|
hPutStrLn stderr $ "Initializing ATK..."
|
||||||
|
initialize config
|
||||||
|
when (language `notElem` ls) $
|
||||||
|
do
|
||||||
|
let hmmName = "hmm_" ++ language
|
||||||
|
dictName = "dict_" ++ language
|
||||||
|
hPutStrLn stderr $ "Initializing ATK (" ++ language ++ ")..."
|
||||||
|
l <- getLanguage language
|
||||||
|
loadHMMSet hmmName (hmmlist l) (mmf0 l) (mmf1 l)
|
||||||
|
loadDict dictName (dict l)
|
||||||
|
writeIORef languages (language:ls)
|
||||||
|
|
||||||
recognizeSpeech :: Ident -- ^ Grammar name
|
recognizeSpeech :: Ident -- ^ Grammar name
|
||||||
-> Options -> CGrammar -> IO String
|
-> Options -> CGrammar -> IO String
|
||||||
@@ -57,11 +80,14 @@ recognizeSpeech name opts cfg =
|
|||||||
do
|
do
|
||||||
let slf = slfPrinter name opts cfg
|
let slf = slfPrinter name opts cfg
|
||||||
n = prIdent name
|
n = prIdent name
|
||||||
|
language = "en_UK"
|
||||||
|
hmmName = "hmm_" ++ language
|
||||||
|
dictName = "dict_" ++ language
|
||||||
slfName = "gram_" ++ n
|
slfName = "gram_" ++ n
|
||||||
recName = "rec_english_" ++ n
|
recName = "rec_" ++ language ++ "_" ++ n
|
||||||
initATK
|
initATK language
|
||||||
loadGrammarString slfName slf
|
loadGrammarString slfName slf
|
||||||
createRecognizer recName "hmm_english" "dict_english" slfName
|
createRecognizer recName hmmName dictName slfName
|
||||||
hPutStrLn stderr "Listening..."
|
hPutStrLn stderr "Listening..."
|
||||||
s <- recognize recName
|
s <- recognize recName
|
||||||
return s
|
return s
|
||||||
|
|||||||
Reference in New Issue
Block a user