summaryrefslogtreecommitdiff
path: root/src-3.0/GF/System/ATKSpeechInput.hs
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-05-21 09:26:44 +0000
committeraarne <aarne@cs.chalmers.se>2008-05-21 09:26:44 +0000
commit055c0d0d5a5bb0dc75904fe53df7f2e4f5732a8f (patch)
tree0e63fb68c69c8f6ad0f78893c63420f0a3600e1c /src-3.0/GF/System/ATKSpeechInput.hs
parent915a1de71783ab8446b1af9e72c7ba7dfbc12d3f (diff)
GF/src is now for 2.9, and the new sources are in src-3.0 - keep it this way until the release of GF 3
Diffstat (limited to 'src-3.0/GF/System/ATKSpeechInput.hs')
-rw-r--r--src-3.0/GF/System/ATKSpeechInput.hs137
1 files changed, 137 insertions, 0 deletions
diff --git a/src-3.0/GF/System/ATKSpeechInput.hs b/src-3.0/GF/System/ATKSpeechInput.hs
new file mode 100644
index 000000000..4b50293af
--- /dev/null
+++ b/src-3.0/GF/System/ATKSpeechInput.hs
@@ -0,0 +1,137 @@
+----------------------------------------------------------------------
+-- |
+-- Module : GF.System.ATKSpeechInput
+-- Maintainer : BB
+-- Stability : (stable)
+-- Portability : (non-portable)
+--
+-- > CVS $Date: 2005/05/10 15:04:01 $
+-- > CVS $Author: bringert $
+-- > CVS $Revision: 1.2 $
+--
+-- Use ATK and Speech.ATKRec for speech input.
+-----------------------------------------------------------------------------
+
+module GF.System.ATKSpeechInput (recognizeSpeech) where
+
+import GF.Infra.Ident (Ident, prIdent)
+import GF.Infra.Option
+import GF.Conversion.Types (CGrammar)
+import GF.Speech.PrSLF
+
+import Speech.ATKRec
+
+import Control.Monad
+import Data.Maybe
+import Data.IORef
+import System.Environment
+import System.IO
+import System.IO.Unsafe
+
+data ATKLang = ATKLang {
+ hmmlist :: FilePath,
+ mmf0 :: FilePath,
+ mmf1 :: FilePath,
+ dict :: FilePath,
+ opts :: [(String,String)]
+ }
+
+atk_home_error = "The environment variable ATK_HOME is not set. "
+ ++ "It should contain the path to your copy of ATK."
+
+gf_atk_cfg_error = "The environment variable GF_ATK_CFG is not set. "
+ ++ "It should contain the path to your GF ATK configuration"
+ ++ " file. A default version of this file can be found"
+ ++ " in GF/src/gf_atk.cfg"
+
+getLanguage :: String -> IO ATKLang
+getLanguage l =
+ case l of
+ "en_UK" -> do
+ atk_home <- getEnv_ "ATK_HOME" atk_home_error
+ let res = atk_home ++ "/Resources"
+ return $ ATKLang {
+ hmmlist = res ++ "/UK_SI_ZMFCC/hmmlistbg",
+ mmf0 = res ++ "/UK_SI_ZMFCC/WI4",
+ mmf1 = res ++ "/UK_SI_ZMFCC/BGHMM2",
+ dict = res ++ "/beep.dct",
+ opts = [("TARGETKIND", "MFCC_0_D_A_Z"),
+ ("HPARM:CMNDEFAULT", res ++ "/UK_SI_ZMFCC/cepmean")]
+ }
+ "sv_SE" -> do
+ let res = "/home/bjorn/projects/atkswe/numerals-swe/final"
+ return $ ATKLang {
+ hmmlist = res ++ "/hmm_tri/hmmlist",
+ mmf0 = res ++ "/hmm_tri/macros",
+ mmf1 = res ++ "/hmm_tri/hmmdefs",
+ dict = res ++ "/NumeralsSwe.dct",
+ opts = [("TARGETKIND", "MFCC_0_D_A")]
+ }
+ _ -> fail $ "ATKSpeechInput: language " ++ l ++ " not supported"
+
+-- | Current language for which we have loaded the HMM
+-- and dictionary.
+{-# NOINLINE currentLang #-}
+currentLang :: IORef (Maybe String)
+currentLang = unsafePerformIO $ newIORef Nothing
+
+-- | Initializes the ATK, loading the given language.
+-- ATK must not be initialized when calling this function.
+loadLang :: String -> IO ()
+loadLang lang =
+ do
+ l <- getLanguage lang
+ config <- getEnv_ "GF_ATK_CFG" gf_atk_cfg_error
+ hPutStrLn stderr $ "Initializing ATK..."
+ initialize (Just config) (opts l)
+ let hmmName = "hmm_" ++ lang
+ dictName = "dict_" ++ lang
+ hPutStrLn stderr $ "Initializing ATK (" ++ lang ++ ")..."
+ loadHMMSet hmmName (hmmlist l) (mmf0 l) (mmf1 l)
+ loadDict dictName (dict l)
+ writeIORef currentLang (Just lang)
+
+initATK :: String -> IO ()
+initATK lang =
+ do
+ ml <- readIORef currentLang
+ case ml of
+ Nothing -> loadLang lang
+ Just l | l == lang -> return ()
+ | otherwise -> do
+ deinitialize
+ loadLang lang
+
+recognizeSpeech :: Ident -- ^ Grammar name
+ -> String -- ^ Language, e.g. en_UK
+ -> CGrammar -- ^ Context-free grammar for input
+ -> String -- ^ Start category name
+ -> Int -- ^ Number of utterances
+ -> IO [String]
+recognizeSpeech name language cfg start number =
+ do
+ let slf = slfPrinter name start cfg
+ n = prIdent name
+ hmmName = "hmm_" ++ language
+ dictName = "dict_" ++ language
+ slfName = "gram_" ++ n
+ recName = "rec_" ++ language ++ "_" ++ n
+ writeFile "debug.net" slf
+ initATK language
+ hPutStrLn stderr $ "Loading grammar " ++ n ++ " ..."
+ loadGrammarString slfName slf
+ createRecognizer recName hmmName dictName slfName
+ hPutStrLn stderr $ "Listening in category " ++ start ++ "..."
+ s <- replicateM number (recognize recName)
+ return s
+
+
+getEnv_ :: String -- ^ Name of environment variable
+ -> String -- ^ Message to fail with if the variable is not set.
+ -> IO String
+getEnv_ e err =
+ do
+ env <- getEnvironment
+ case lookup e env of
+ Just v -> return v
+ Nothing -> fail err