4 Commits
6 changed files with 77 additions and 16 deletions

No files matched your search

+11 -9
View File
@@ -29,13 +29,13 @@ Dictation is unavailable inside Steam menus and VR games.
## Choose transcription and language
| Transcription option | Speed | Internet needed | Requirements |
| --- | --- | --- | --- |
| **Groq · Cloud** | Fastest | Every dictation | [API key](https://console.groq.com/keys) |
| **Local · Fast** | Fast | Initial download only | ~142MiB |
| **Local · Balanced** | Slow | Initial download only | ~466MiB |
| Model | Runs on | Speed | Accuracy | Internet needed | Requirements |
| --- | --- | --- | --- | --- | --- |
| Whisper Base | Local | Medium | Iffy | Initial download only | ~142MiB |
| Whisper Small | Local | Slow | Good | Initial download only | ~466MiB |
| Whisper Large v3 Turbo | Groq | Fast | Best | Every dictation | [API key](https://console.groq.com/keys) |
The local options process speech on your Frame; the larger model favors accuracy.
Whisper models were created by [OpenAI](https://github.com/openai/whisper). Local transcription sends no audio to OpenAI or Groq; the models run on your Frame using [whisper.cpp](https://github.com/ggml-org/whisper.cpp).
Choose **Language** in the Transcription tab, or **Automatic detection** if you
use more than one language. Local setup downloads the appropriate English or
@@ -43,15 +43,17 @@ multilingual model. Groq needs no language-specific download.
## Try your first dictation
<img src="assets/icons/dictation-flow.svg" width="720" alt="Tap, hold, speak, release, processing, text appears" />
1. Open Firefox, start a new tab, and click its address bar.
2. Briefly touch either joystick cap, lift your thumb, then touch it again and hold.
3. Wait for the start tone and microphone badge, then speak.
4. Lift your thumb to finish. Wait for the transcription to appear.
Click the joystick during recording to cancel. After text appears, **A** submits
and releasing **X** clears; the left D-pad right/left do the same. These actions are
available briefly after dictation and stop when you change focus. Nothing submits
automatically.
and **X** clears. On the left hand, **D-pad Right** submits and **D-pad Left** clears.
These actions are available briefly after dictation and stop when you change
focus. Nothing submits automatically.
Open **Configure…** in the tray to customize Frame Voice. See the
[settings guide](docs/SETTINGS.md) for the General, Transcription, and Controllers tabs.
+18
View File
@@ -0,0 +1,18 @@
# Security policy
Frame Voice injects keystrokes into the focused application and, when Groq
transcription is selected, stores an API key in `~/.config/frame-voice/env`.
Reports about either of those paths are especially welcome.
## Reporting a vulnerability
Please do not open a public issue for security problems. Use GitHub's private
reporting at <https://github.com/techieyann/frame-voice/security/advisories/new>.
Include the Frame Voice version (`frame-voice --version`), the transcription
path in use, and steps to reproduce. You should hear back within a week.
## Supported versions
Only the latest stable release receives fixes. Experimental prereleases are
not supported once a newer build exists.
Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

+41
View File
@@ -0,0 +1,41 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 130" width="2100" height="390">
<defs>
<g id="stick" fill="#FFFFFF">
<rect x="-22" y="33" width="44" height="5" rx="2.5"/>
<rect x="-5" y="15" width="10" height="19"/>
<ellipse cx="0" cy="13" rx="16" ry="6"/><path d="M-9.5 12.2 Q0 8.3 9.5 12.2" fill="none" stroke="#161B22" stroke-width="1.5" stroke-linecap="round"/>
</g>
<!-- side-view thumb entering from the left; tip at origin -->
<g id="thumb">
<path fill="#FFFFFF" d="M-90.5 -37.5 L-24.8 -31.8 Q-18.8 -31.3 -12.4 -24.3 Q-9.5 -17.4 -4.5 -14.6 L-5.1 -13.3 L4.1 -4.1 Q4.9 4.9 -5.7 5.7 Q-19.0 -0.8 -26.3 -13.3 Q-56.9 -8.6 -92.5 -14.6 Z"/>
<path d="M-18.5 -28.0 L-20.4 -24.1 M-12.6 -24.2 L-15.4 -21.3 M-10.5 -20.6 L-13.1 -18.0" fill="none" stroke="#161B22" stroke-width="1.8" stroke-linecap="round"/>
<path d="M-5.1 -13.3 Q-3.8 -6.1 3.9 1.1" fill="none" stroke="#161B22" stroke-width="1.8" stroke-linecap="round"/>
</g>
<clipPath id="c"><rect x="17" y="17" width="83" height="83"/></clipPath>
</defs>
<rect width="700" height="130" rx="18" fill="#161B22"/>
<g transform="translate(20,15)">
<path d="M10 92V10H92" fill="none" stroke="#FFFFFF" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/>
<g clip-path="url(#c)"><g transform="translate(60,58)"><use href="#stick"/></g><g transform="translate(58,53)"><use href="#thumb"/></g><path d="M48 61 l-4 4 M60 63 v6 M72 61 l4 4" fill="none" stroke="#161B22" stroke-width="7" stroke-linecap="round"/><path d="M48 61 l-4 4 M60 63 v6 M72 61 l4 4" fill="none" stroke="#1A9FFF" stroke-width="3" stroke-linecap="round"/><path fill="none" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" d="M30 50 v16 M24 60 l6 6 6-6"/><path fill="none" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" d="M88 66 v-16 M82 56 l6-6 6 6"/></g>
</g>
<g transform="translate(130,15)">
<path d="M10 92V10H92" fill="none" stroke="#FFFFFF" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/>
<g clip-path="url(#c)"><g transform="translate(60,58)"><use href="#stick"/></g><g transform="translate(56,64)" stroke="#161B22" stroke-width="2.4" stroke-linejoin="round"><use href="#thumb"/></g><path fill="none" stroke="#1A9FFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" d="M60 46 A24 24 0 1 1 43 87"/></g>
</g>
<g transform="translate(240,15)">
<path d="M10 92V10H92" fill="none" stroke="#FFFFFF" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/>
<g clip-path="url(#c)"><g transform="translate(-8,-10) scale(1.35)"><path d="M8 76 V58 C2 48 2 30 12 22 C22 12 42 13 50 22 C55 28 56 36 54 44 L58 50 L53 53 C56 55 56 58 53 60 C55 63 51 67 46 67 L37 67 L37 76 Z" fill="#FFFFFF"/><path d="M6 37 C18 34 30 33 44 34" fill="none" stroke="#161B22" stroke-width="16"/><path d="M6 37 C18 34 30 33 44 34" fill="none" stroke="#FFFFFF" stroke-width="11"/><rect x="40" y="22" width="26" height="24" rx="5" fill="#FFFFFF" stroke="#161B22" stroke-width="2.2"/><g transform="translate(53,34) scale(0.55)"><rect x="-4" y="-11" width="8" height="13" rx="4" fill="#1A9FFF"/><path d="M-8 -2 a8 8 0 0 0 16 0 M0 6 v5 M-4 11 h8" fill="none" stroke="#1A9FFF" stroke-width="3.2" stroke-linecap="round" stroke-linejoin="round"/></g></g><path fill="none" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" d="M77 61 q5 6 0 12"/><path fill="none" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" d="M84 55 q10 12 0 24"/><path fill="none" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" d="M91 49 q14 18 0 36"/></g>
</g>
<g transform="translate(350,15)">
<path d="M10 92V10H92" fill="none" stroke="#FFFFFF" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/>
<g clip-path="url(#c)"><g transform="translate(60,58)"><use href="#stick"/></g><g transform="translate(58,45)"><use href="#thumb"/></g><path fill="none" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" d="M88 66 v-16 M82 56 l6-6 6 6"/></g>
</g>
<g transform="translate(460,15)">
<path d="M10 92V10H92" fill="none" stroke="#FFFFFF" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/>
<g clip-path="url(#c)"><g transform="translate(57,57) scale(0.9) rotate(22.5)"><g fill="#1A9FFF"><rect x="-5" y="-26" width="10" height="52" transform="rotate(0)"/><rect x="-5" y="-26" width="10" height="52" transform="rotate(45)"/><rect x="-5" y="-26" width="10" height="52" transform="rotate(90)"/><rect x="-5" y="-26" width="10" height="52" transform="rotate(135)"/><circle r="18"/></g><circle r="8" fill="#161B22"/></g><path fill="none" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" d="M24.4 41.8 A36 36 0 0 1 84.6 33.9 M78.0 31.5 L84.6 33.9 L83.4 27.0"/><path fill="none" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" d="M89.6 72.2 A36 36 0 0 1 29.4 80.1 M36.0 82.5 L29.4 80.1 L30.6 87.0"/></g>
</g>
<g transform="translate(570,15)">
<path d="M10 92V10H92" fill="none" stroke="#FFFFFF" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/>
<g clip-path="url(#c)"><rect x="22" y="32" width="64" height="40" rx="3" fill="none" stroke="#FFFFFF" stroke-width="4"/><rect x="32" y="43" width="22" height="7" fill="#FFFFFF"/><rect x="56" y="43" width="14" height="7" fill="#FFFFFF"/><rect x="32" y="55" width="16" height="7" fill="#FFFFFF"/><rect x="53" y="53" width="3" height="11" fill="#1A9FFF"/></g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

+6 -6
View File
@@ -53,13 +53,13 @@ installed voice tools and their models are left alone.
### Transcription path
| Transcription option | Speed | Internet needed | Requirements |
| --- | --- | --- | --- |
| **Groq · Cloud** | Fastest | Every dictation | [API key](https://console.groq.com/keys) |
| **Local · Fast** | Fast | Initial download only | ~142MiB |
| **Local · Balanced** | Slow | Initial download only | ~466MiB |
| Model | Runs on | Speed | Accuracy | Internet needed | Requirements |
| --- | --- | --- | --- | --- | --- |
| Whisper Base | Local | Medium | Iffy | Initial download only | ~142MiB |
| Whisper Small | Local | Slow | Good | Initial download only | ~466MiB |
| Whisper Large v3 Turbo | Groq | Fast | Best | Every dictation | [API key](https://console.groq.com/keys) |
The local options process speech on your Frame; the larger model favors accuracy.
Whisper models were created by [OpenAI](https://github.com/openai/whisper). Local transcription sends no audio to OpenAI or Groq; the models run on your Frame using [whisper.cpp](https://github.com/ggml-org/whisper.cpp).
Select a path, then **Save settings**. Local transcription works offline after
its initial download. Switching to local retains your saved Groq API key so you
+1 -1
View File
@@ -62,7 +62,7 @@ GROQ_API_KEY=
# VOICE_WARN_COOLDOWN_SEC=3600
#
# == Local ASR (VOICE_BACKEND=local) ==
# VOICE_MODEL=/home/steamos/.local/share/whisper/models/ggml-base.en.bin
# VOICE_MODEL=~/.local/share/whisper/models/ggml-base.en.bin
# WHISPER_BIN=whisper-cli
# VOICE_THREADS=4
'''