From 2ee3feb76790b033443597a1a4336ad4c8c46a47 Mon Sep 17 00:00:00 2001 From: kpoxo6op Date: Sun, 24 May 2026 09:27:42 +1200 Subject: [PATCH] Add Picovoice Leopard Sapat guide Signed-off-by: kpoxo6op --- authors/assets/boris-github-avatar.jpg | Bin 0 -> 13851 bytes authors/boris.md | 13 + ...524_definition_on_device_speech_to_text.md | 22 ++ ...ard_transcription_with_sapat_in_daytona.md | 336 ++++++++++++++++++ ...rd_transcription_with_sapat_in_daytona.svg | 32 ++ 5 files changed, 403 insertions(+) create mode 100644 authors/assets/boris-github-avatar.jpg create mode 100644 authors/boris.md create mode 100644 definitions/20260524_definition_on_device_speech_to_text.md create mode 100644 guides/20260524_run_picovoice_leopard_transcription_with_sapat_in_daytona.md create mode 100644 guides/assets/20260524_run_picovoice_leopard_transcription_with_sapat_in_daytona.svg diff --git a/authors/assets/boris-github-avatar.jpg b/authors/assets/boris-github-avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dbd43deceba6379cd9f43972bf086789ab531cf1 GIT binary patch literal 13851 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 KQ8l!0i~kRY$R&>e literal 0 HcmV?d00001 diff --git a/authors/boris.md b/authors/boris.md new file mode 100644 index 00000000..6eb4495b --- /dev/null +++ b/authors/boris.md @@ -0,0 +1,13 @@ +Author: Boris +Title: Software Engineer +Description: Boris is a software engineer focused on practical developer +workflows, automation, and reliable local tooling. He writes guides that turn +small open-source utilities into reproducible workflows developers can run, +test, and adapt inside isolated development environments. +Author Image: /authors/assets/boris-github-avatar.jpg +Author LinkedIn: +Author Twitter: +Company Name: +Company Description: +Company Logo Dark: +Company Logo White: diff --git a/definitions/20260524_definition_on_device_speech_to_text.md b/definitions/20260524_definition_on_device_speech_to_text.md new file mode 100644 index 00000000..b6316e00 --- /dev/null +++ b/definitions/20260524_definition_on_device_speech_to_text.md @@ -0,0 +1,22 @@ +--- +title: 'On-device speech-to-text' +description: + 'On-device speech-to-text converts recorded or live audio into text on the + same machine that holds the audio, reducing network exposure and making + transcription workflows easier to test in isolated development environments.' +--- + +# On-device speech-to-text + +## Definition + +On-device speech-to-text is a transcription approach where the speech +recognition engine runs locally on the machine that stores the audio. Instead +of uploading recordings to a hosted transcription API, the workflow loads a +local model or SDK, processes the file in place, and writes the transcript back +to local storage. + +This pattern is useful for private recordings, regulated data, offline demos, +and reproducible development environments. It still may require a license key, +model file, or vendor SDK, but the audio payload itself does not need to leave +the workspace during transcription. diff --git a/guides/20260524_run_picovoice_leopard_transcription_with_sapat_in_daytona.md b/guides/20260524_run_picovoice_leopard_transcription_with_sapat_in_daytona.md new file mode 100644 index 00000000..a3b4d246 --- /dev/null +++ b/guides/20260524_run_picovoice_leopard_transcription_with_sapat_in_daytona.md @@ -0,0 +1,336 @@ +--- +title: 'Run Picovoice Leopard with Sapat in Daytona' +description: + 'Build a private, on-device transcription workflow with Sapat, Picovoice + Leopard, ffmpeg, and a reproducible Daytona sandbox.' +date: 2026-05-24 +author: 'Boris' +tags: ['daytona', 'python', 'speech-to-text', 'sapat'] +--- + +# Run Picovoice Leopard with Sapat in Daytona + +## Introduction + +Sapat is a small Python command-line tool that turns video files into text. It +already handles the boring parts of a transcription workflow: taking an input +file, converting the audio with `ffmpeg`, calling a selected transcription +backend, and writing a `.txt` file next to the source media. + +This guide shows how to run Sapat with Picovoice Leopard inside a Daytona +sandbox. Leopard is useful when you want +[on-device speech-to-text](../definitions/20260524_definition_on_device_speech_to_text.md): +the audio is processed locally in the workspace instead of being uploaded as +the request body of a hosted transcription API. Picovoice still requires an +AccessKey, but the recording stays inside the Daytona environment. + +The workflow is intentionally plain. You will create an isolated Daytona +sandbox, install Sapat with the optional Leopard provider, add your Picovoice +AccessKey as an environment variable, and run one transcription command against +a video or audio file. + +The main benefit is operational clarity. Hosted speech-to-text APIs are often +the right choice for large-scale production pipelines, but they make local +testing harder because the input audio leaves the development environment and +the request depends on provider-side limits. A local provider lets an engineer +debug the conversion step, transcript file handling, and prompt-independent +audio quality in one place. Daytona adds a clean boundary around that work: the +workspace can be created, rebuilt, and discarded without changing the host +machine. + +![Sapat Picovoice Leopard workflow](assets/20260524_run_picovoice_leopard_transcription_with_sapat_in_daytona.svg) + +## TL;DR + +- Create a Daytona sandbox so the transcription workflow is reproducible. +- Install Sapat with the optional `pvleopard` dependency. +- Keep `PICOVOICE_ACCESS_KEY` in your shell or `.env`; never commit it. +- Run `sapat --api leopard` to convert audio and write the transcript. +- Use the troubleshooting checklist when `ffmpeg`, Python, or the AccessKey is + the real blocker. + +## Prerequisites + +You need: + +- A Daytona account and a working `daytona` CLI. +- Python 3.9 or newer. Picovoice Leopard's Python SDK requires Python 3.9+. +- `ffmpeg` in the sandbox. +- A Picovoice AccessKey from the Picovoice Console. +- A short `.mp4`, `.mp3`, `.wav`, or `.flac` file for validation. + +The companion Sapat provider implementation for this guide is available in +`nibzard/sapat#44`. If you are testing before that PR is merged, fetch the +branch directly as shown below. + +## Step 1: Create a Daytona sandbox + +Create a new Daytona sandbox and open a shell in it. The exact command depends +on how you use Daytona, but the CLI supports creating a sandbox directly: + +```bash +daytona create +``` + +Once the sandbox is ready, open its terminal. A clean sandbox keeps the +transcription stack separate from your laptop and makes it easy to repeat the +steps later. + +Install system packages used by Sapat: + +```bash +sudo apt-get update +sudo apt-get install -y ffmpeg git python3 python3-venv +``` + +Confirm the tools are present: + +```bash +python3 --version +ffmpeg -version | head -n 1 +git --version +``` + +If Python is older than 3.9, create the sandbox from a newer Python image or +install a newer interpreter before continuing. + +## Step 2: Clone Sapat and install the Leopard extra + +Clone Sapat: + +```bash +git clone https://github.com/nibzard/sapat.git +cd sapat +``` + +If the Picovoice provider PR has not been merged yet, switch to the companion +branch: + +```bash +git fetch https://github.com/kpoxo6op/sapat.git \ + codex/leopard-transcription-provider +git checkout FETCH_HEAD +``` + +Create and activate a virtual environment: + +```bash +python3 -m venv .venv +. .venv/bin/activate +python -m pip install --upgrade pip +``` + +Install Sapat with Leopard support: + +```bash +pip install -e ".[leopard]" +``` + +This installs the normal Sapat dependencies plus `pvleopard`, the official +Picovoice Leopard Python SDK. The provider is lazy-loaded, so the rest of Sapat +can still run without `pvleopard` when you choose `--api openai`, `--api groq`, +or `--api azure`. + +Check that the command sees the new backend: + +```bash +sapat --help +``` + +The API option should include `leopard`: + +```text +--api [openai|groq|azure|leopard] +``` + +## Step 3: Configure Picovoice Leopard + +Set your Picovoice AccessKey in the shell: + +```bash +export PICOVOICE_ACCESS_KEY="paste-your-access-key-here" +``` + +For repeat runs inside the same repo, you can also create a local `.env` file. +Do not commit this file. + +```bash +cat > .env <<'EOF' +PICOVOICE_ACCESS_KEY=paste-your-access-key-here +PICOVOICE_LEOPARD_ENABLE_PUNCTUATION=true +PICOVOICE_LEOPARD_ENABLE_DIARIZATION=false +EOF +``` + +Optional settings: + +```bash +export PICOVOICE_LEOPARD_MODEL_PATH="/absolute/path/to/custom-model.pv" +export PICOVOICE_LEOPARD_DEVICE="best" +export PICOVOICE_LEOPARD_ENABLE_PUNCTUATION="true" +export PICOVOICE_LEOPARD_ENABLE_DIARIZATION="false" +``` + +Use `PICOVOICE_LEOPARD_MODEL_PATH` when you have a custom `.pv` model from +Picovoice Console. Use `PICOVOICE_LEOPARD_DEVICE=best` when your sandbox or +workstation has more than one possible execution device and you want the SDK to +select the best available target. + +Leopard supports several languages through model files. If your recording is +not in English, download or create the correct model in Picovoice Console and +point `PICOVOICE_LEOPARD_MODEL_PATH` at that `.pv` file. Keeping the model path +explicit is also useful in a team setting because every developer can see which +model was used for a transcript. + +## Step 4: Add a media file + +Copy a short test recording into the sandbox. For example: + +```bash +mkdir -p samples +cp ~/Downloads/standup-recording.mp4 samples/standup-recording.mp4 +``` + +If you only want to verify that the conversion path works, generate a tiny MP3 +file with `ffmpeg`: + +```bash +ffmpeg -f lavfi -i sine=frequency=880:duration=2 \ + -ar 44100 -ac 1 samples/tone.mp3 +``` + +The tone file will not produce a useful transcript, but it can confirm that +`ffmpeg`, paths, and the Leopard provider are wired correctly. For a real +transcript, use a file with spoken audio. + +## Step 5: Run Sapat with Leopard + +Run Sapat against a video file: + +```bash +sapat samples/standup-recording.mp4 --api leopard --quality M +``` + +Sapat will: + +1. Convert `samples/standup-recording.mp4` to + `samples/standup-recording.mp3`. +2. Initialize Picovoice Leopard with your AccessKey and optional settings. +3. Process the MP3 locally. +4. Write `samples/standup-recording.txt`. +5. Remove the temporary MP3 file. + +Review the transcript: + +```bash +sed -n '1,120p' samples/standup-recording.txt +``` + +For directories, Sapat processes each `.mp4` file: + +```bash +sapat samples --api leopard --quality M +``` + +That is useful when you have a folder of meeting recordings and want one text +file per video. + +For longer recordings, start with one short sample before batch processing the +whole directory. That confirms the AccessKey, model, and language settings +before you spend time on every file. It also gives you a quick quality check: +if the transcript misses names or product terms, create a custom Leopard model +or choose a clearer audio source before running the full set. + +## When to use this workflow + +Use the Leopard backend when privacy, offline behavior, or repeatable local +testing matters more than using a hosted transcription endpoint. Examples +include internal engineering standups, customer-call excerpts that cannot leave +your controlled workspace, and regression fixtures where a test should not +depend on a remote API being available. + +Use a hosted provider when you need a managed service, centralized billing, +very large batch throughput, or an API feature that Leopard does not provide +for your use case. Sapat keeps those choices behind the same `--api` flag, so +teams can use Leopard for local validation and switch to OpenAI, Groq, or Azure +for another environment without changing the rest of the workflow. + +## Step 6: Validate and capture evidence + +Before sharing the workflow with a teammate, capture a short validation log: + +```bash +python -m unittest discover -s tests -v +sapat --help +ls -lh samples/*.txt +``` + +For a content or code contribution, include: + +- The Sapat provider PR link. +- The exact Sapat command used. +- The Python version. +- Whether the input was a real speech sample or a generated smoke-test file. +- Confirmation that no `.env` file or AccessKey was committed. + +## Common Issues and Troubleshooting + +**Problem:** `RuntimeError: Picovoice Leopard support requires pvleopard.` + +**Solution:** Install the optional dependency in the active virtual environment: + +```bash +pip install -e ".[leopard]" +``` + +**Problem:** `PICOVOICE_ACCESS_KEY is required for --api leopard.` + +**Solution:** Export the key in the terminal or add it to an uncommitted `.env` +file: + +```bash +export PICOVOICE_ACCESS_KEY="paste-your-access-key-here" +``` + +**Problem:** `ffmpeg` is missing. + +**Solution:** Install it in the sandbox: + +```bash +sudo apt-get update +sudo apt-get install -y ffmpeg +``` + +**Problem:** The transcript is empty. + +**Solution:** Confirm that the sample contains spoken audio. A generated tone +file is useful for smoke testing, but it will not produce meaningful words. +Also check whether the selected Leopard model matches the language of the +recording. + +**Problem:** The custom model path fails. + +**Solution:** Use an absolute path for `PICOVOICE_LEOPARD_MODEL_PATH` and make +sure the `.pv` file is available inside the Daytona sandbox, not just on your +local machine. + +## Conclusion + +Sapat plus Picovoice Leopard gives you a small, repeatable transcription +workflow that keeps audio processing local to the Daytona sandbox. The command +surface stays the same as the hosted providers: install the backend, set the +environment variable, and choose `--api leopard`. + +This pattern works well for internal meetings, private demos, and test fixtures +where uploading recordings to a hosted transcription endpoint is unnecessary. +Because the setup lives in an isolated sandbox, you can rebuild it, hand it to a +teammate, or attach it to a pull request without depending on whatever happens +to be installed on your laptop. + +## References + +- [Sapat repository](https://github.com/nibzard/sapat) +- [Companion Sapat Picovoice provider PR](https://github.com/nibzard/sapat/pull/44) +- [Picovoice Leopard Python Quick Start](https://picovoice.ai/docs/quick-start/leopard-python/) +- [Picovoice Leopard Python API](https://picovoice.ai/docs/api/leopard-python/) +- [Daytona Getting Started](https://www.daytona.io/docs/getting-started) diff --git a/guides/assets/20260524_run_picovoice_leopard_transcription_with_sapat_in_daytona.svg b/guides/assets/20260524_run_picovoice_leopard_transcription_with_sapat_in_daytona.svg new file mode 100644 index 00000000..5a27e6b2 --- /dev/null +++ b/guides/assets/20260524_run_picovoice_leopard_transcription_with_sapat_in_daytona.svg @@ -0,0 +1,32 @@ + + Sapat Picovoice Leopard transcription workflow in Daytona + A workflow showing a Daytona sandbox running Sapat, converting video to MP3, transcribing locally with Picovoice Leopard, and writing a transcript file. + + + Daytona sandbox + Isolated Python workspace with ffmpeg, Sapat, and the optional pvleopard SDK + + + video file + meeting.mp4 + + + + ffmpeg + MP3 conversion + + + + Leopard + local STT engine + + + + text + .txt + + + sapat meeting.mp4 --api leopard + + PICOVOICE_ACCESS_KEY=... +