diff options
Diffstat (limited to 'Omni/Agent')
| -rw-r--r-- | Omni/Agent/Telegram/Media.hs | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/Omni/Agent/Telegram/Media.hs b/Omni/Agent/Telegram/Media.hs index 47fbf91..0d62edd 100644 --- a/Omni/Agent/Telegram/Media.hs +++ b/Omni/Agent/Telegram/Media.hs @@ -54,9 +54,12 @@ import qualified Network.HTTP.Simple as HTTP import qualified Omni.Agent.Telegram.Types as Types import qualified Omni.Agent.Tools.Pdf as Pdf import qualified Omni.Test as Test +import qualified System.Directory as Directory import System.Environment (lookupEnv) +import qualified System.Exit as Exit import System.IO (hClose) import System.IO.Temp (withSystemTempFile) +import qualified System.Process as Process main :: IO () main = Test.run test @@ -274,8 +277,34 @@ transcribeVoice :: Text -> BL.ByteString -> IO (Either Text Text) transcribeVoice _unusedApiKey audioBytes = do maybeKey <- lookupEnv "OPENAI_API_KEY" case maybeKey of - Nothing -> pure (Left "OPENAI_API_KEY not set - required for voice transcription") - Just key -> transcribeWithWhisper (Text.pack key) audioBytes + Nothing -> transcribeWithWhisperLocal audioBytes + Just key -> do + result <- transcribeWithWhisper (Text.pack key) audioBytes + case result of + Left _ -> transcribeWithWhisperLocal audioBytes + Right text -> pure (Right text) + +transcribeWithWhisperLocal :: BL.ByteString -> IO (Either Text Text) +transcribeWithWhisperLocal audioBytes = do + tmpDir <- Directory.getTemporaryDirectory + let audioFile = tmpDir <> "/ava_voice_" <> show (BL.length audioBytes) <> ".ogg" + result <- + try <| do + BL.writeFile audioFile audioBytes + (exitCode, stdoutStr, stderrStr) <- + Process.readProcessWithExitCode + "whisper-cli" + ["--model", "/home/ava/models/ggml-base.en.bin", "--file", audioFile, "--no-timestamps"] + "" + Directory.removeFile audioFile + case exitCode of + Exit.ExitSuccess -> pure (Right (Text.strip (Text.pack stdoutStr))) + Exit.ExitFailure _ -> pure (Left (Text.pack stderrStr)) + case result of + Left (e :: SomeException) -> do + _ <- try @SomeException (Directory.removeFile audioFile) + pure (Left ("Local whisper failed: " <> tshow e)) + Right r -> pure r transcribeWithWhisper :: Text -> BL.ByteString -> IO (Either Text Text) transcribeWithWhisper apiKey audioBytes = do |
