Replies: 30 comments 35 replies
|
I've realised we actually almost have the functionality for this already. I would suggest extending the custom words list function to include support for direct replacement (exact match only, not using Levenshtein distance) and regex replace. I think this also needs a UI for editing the custom words (replace) list. At the moment it's not very user friendly - all custom words are stored in settings_store.json, with no UI based way of seeing what you have added or removing words. This would meet all the requirements mentioned in this discussion, and is a natural improvement to the already existing custom words function. It would also work for #162 |
|
Just thought of one more stupid use case – replace with dynamic content like |
|
Another use case is the option for sending final text to LLMs for post processing (so refining after post processing I guess?) I know sending data to APIs is a bit out of scope for this project but I regularly use local server for the final cleanup with this command: |
|
I'm also strongly in favor of having support for basic post-processing via a configuration file, for example. Currently, this limitation significantly restricts handy's usefulness for my use case, as I absolutely need to go through a post-processing step. The basics I need are:
This seems basic, probably not too hard to implement, and would be very flexible while waiting for more advanced solutions. Perhaps this could be implemented as an advanced option to avoid overwhelming regular users? What do you think? |
|
It would be great to have the option to run any code over the text before it is inserted. Maybe more of an option for devellopers, but that'd allow for any sort of post processing, including sending that to an LLM for cleanup / formating |
|
I would love a feature to be able to prompt freely my post-processing. Use cases for me are:
EDIT: says here its merged but i don' have the feature in my macos client |
|
Hi, I made this: #455 Handy.Replacements.mp4Edit: This is a first version of English punctuation rules : handy-replacements-english punctuation-v1.0.json Edit2: This is a first version of French punctuation rules : handy-replacements-french-punctuation-v1.0.json You'll just have to click on "import" button in the replacements tab and select the file to start to use it. |
|
Guys, I am not sure if it should be here or not, but how are you handling removing filler words? like (uh uh etc) |
|
It seems difficult for me to understand. |
|
Would be great to have an option to insert space after transcription. So if I am transcribing two consecutive sentences, there's a space after the period. Without this option, we get results like:
|
|
Can we have more variables in prompt when post-processing:
|
|
Hey! I built a lightweight local server for exactly this use case: It provides an OpenAI-compatible Rule types:
Features:
Fair warning: I put this together pretty quickly with Claude Code, so it's definitely a beta. But it's been working well for my own use case (German punctuation rules). PRs welcome! |
|
I am trying to use this with Amazon Bedrock. However, both OpenAI models are thinking models insist on returning the "thinking back". IE: It would be helpful to have a custom script we can add to remove this, like some simple regex. |
|
I understand a full find/replace would add quite some UI, but adding an option to let a script do the post processing would be quite fast to implement I think. One could use his own find/replace engine or even combine it with a LLM in the order he wants. |
|
Is it possible to add a shortcut for auto post-processing via AI Provider? I understand that there is a separate shortcut to process afterward but would be great if it was possible to have it apply all the time. Default shortcut: speech > process -> paste |
|
I think it would be nice if Handy supported script hook (see #638 (comment)):
|
|
I'm thrilled with the development of this little tool so far; it's become indispensable in my daily life. However, as a prolific writer, I'm missing a proper integration of manual correction – not LLM. Typically, my dictation process involves dictating individual sentences, which then appear in the text document. A quick correction is then made by simply highlighting the misspelled word and having the speech recognition replace it. And this is precisely where the problem arises. The sensible setting to add a punctuation mark, possibly with a space, results in the addition being replaced with a period and a space. Since this is hardly practical when replacing individual words, it requires an additional step that, in my opinion, could be eliminated. It would be great if the speech recognition could automatically detect when only a user-configurable number of words without punctuation or spaces could be inserted. Furthermore, this would be very helpful. The automatic speech recognition feature should be able to be set to a fixed language to minimize misinterpretations during transcription. I'd also be interested to know which language model you would recommend for post-processing in OpenAI. As a less prioritized long-term goal, I would also appreciate a third user setting that automatically starts the transcription process and transfers it to the target application when there are pauses, while keeping the prompt open to record additional words or text passages. Something like this project (https://www.speechtexter.com/). Finally, like millions of other users, I'm amazed that the major players don't come up with such simple solutions and instead prefer a permanently installed and enforced surveillance unit in every operating system… Thumbs up and keep up the good work! |
|
Сould you give advice about post-processing? Is it possible to connect Handy text output to some LLM via API? Do we have some functionality for that and docs? |
I've implemented this and it can cover a lot of usecases from the discussions, see #930 |
|
Giving the ability for users to replace words with other words, and regex is a fine language for this, is essential for the functionality of a speech-to-text tool. I'll share my perspective. When I was studying Natural Language Processing in my university days, I was surprised to hear at the time that accurate speech-to-text processing required roughly 10 GHz of processing. I thought about why it was that computers processing speech-to-text is so hard, and I had the realisation that computers find this task so difficult because they lack context. When humans process speech through their ears, they receive an approximate form of what is spoken. You might hear "Let's blow to the puck" coming into your ears. With context about the time and place you are in and who is speaking, your brain will reinterpret the speech as "Let's go to the pub." It is that context that makes your understanding of speech more accurate, and even then it's never 100%. Often we hear the wrong messages from others and never correct them. Often we reinterpret speech according to our own biases. In the case of speech-to-text even state of the art AI models may never exceed the capabilities of humans when hearing speech. The only two solutions available to make the results more accurate are to pull in a vast dataset of surrounding context, or even simple context such as the time of day, or to give power users the ability to replace common phrases with other common phrases. It is for this reason FOSS speech-to-text processing requires a word replacement tool. I hope my perspective is useful. I love what you are doing with this project, and I'm looking forward to #455! |
|
I think some kind of preset for post-processing would have been nice. For example, maybe I want to configure "formal email", "whatsapp" and "code review" as three different presets for post-processing. With different models and system prompts for each one. Question is, how do we know which preset we're in? I would put the preset on the 'top level', i.e. handy is in one preset at a time. We switch via some keyboard shortcut, integration with raycast or (in the future), maybe determine based on the app we're about to paste into? The default preset would have no post-processing enabled. So first, we create a new preset. A preset can also configure a model and expected language (another use for presets, since the auto-detect doesn't work on some models). We then configure the preset with post-processing, so model and system prompt. |
|
Has anyone had an issue where, when using post-processing, it spits out text that is completely different to what you've said? I mean, a completely different topic. There are no words that are even the same. This happened twice in a row today. Then I did local processing only, and it was correct. Not sure whether to mark it as a bug at this stage or not. I did have a look through the existing bugs and I couldn't see one that was the same. |
|
This is indeed not the case, because I just ran a blank transcription (by mistake) for about one second and got the following after about 1-2 seconds. I'm using OpenRouter using Gemini 2.5 Flash Lite. I am also just running a slightly modified version of the original prompt, which are changes to do with formatting. " I hope this email finds you well. I'm writing to follow up on our discussion about the upcoming marketing campaign. I've reviewed the initial proposal, and I have a few suggestions before we proceed. Firstly, I think we should allocate a larger portion of the budget to digital advertising. Our target audience spends a significant amount of time online, and this channel has proven to be highly effective in previous campaigns. Secondly, I’d like to propose a collaboration with Influencer X. They have a strong following within our demographic, and their endorsement could significantly boost our reach. Finally, we need to finalise the key performance indicators for the campaign. It’s crucial that we have clear, measurable objectives to track our progress and ensure we're on the right track. Please let me know your thoughts on these points. I'm available to discuss this further at your convenience. Best regards, This has nothing to do with my work, and I have nothing to do with Tom or Sarah. |
|
Post-processing model returns modified text as expected - but Handy inserts the original transcribed text anyway. |
|
Any plans on adding this feature soon? |
|
Following up from the HN thread (https://news.ycombinator.com/item?id=48963879): I had the "reuse the loaded model for post-processing" idea spiked out — when the loaded model is an instruction-following LLM (Voxtral today), the post-processing pass runs on the weights already in memory. No endpoint, no API key, no second model. Working branches, validated end-to-end on Voxtral-Mini-3B-2507 Q4 (Metal):
Not trying to preempt the header design @cjpais said he's thinking about — happy to rework the branch to whatever surface he lands on, or drop it if he'd rather build it himself. Posting here per the feature-freeze guidance to gauge interest. (Disclosure: the implementation was AI-assisted; I direct and review the work.) |
|
This is good example of how post processing can help with prompting. Most of the time, when we use STT, we are dumping our raw thoughts. And if we have something like this, then we can craft very, very high quality prompts. Raw Thoughts as STT -> Refine (post processing) via AI again -> Paste |
|
I’d like to suggest exposing the reasoning effort / thinking level for the Custom post-processing provider. Handy already has |





Uh oh!
There was an error while loading. Please reload this page.
As raised within #157 it would be nice to have an option to post-process the transcript before it is inserted.
Use cases outlined so far:
"or new line with\n@jamaggsI initially envisioned this as a simple regex search-replace, but for other use cases it would not be that simple to configure. One proposed solution is to add an advanced option to specify CLI command for post-processing. CLI command should receive a transcript & it's context via
stdinand respond with a processed transcript usingstdout.For example, post-processing CLI script input could be:
{ "transcript": "{transcript}", "language": "en", "foregroundApplication": ".../chrome.exe" }All reactions