Consider creating a dictation action

ya adding an option to both paste automatically and getting copied to clipboard would be nice :wink:

Is there any way to move the overlay to the bottom of the screen by default, like in the image? Or adding an option to change position and offset values

Yes I have added positioning options & the copy & paste option with 6.095 (uploading now). Updated preset:
dictation.bttpreset (4.2 KB)

wow, that’s so fast…

Dang unfortunately Apple's notary service does not work right now (which is required for signing BTT), so it will take a bit longer.

Cool… :raising_hands:t2:

the version is online now!

working perfectly…:raising_hands:t2:

When I first attempted to use it, I got a system popup requesting for the required permissions. I clicked on "Allow". After that, this popup was stuck until I restarted BTT:

After restarting BTT, the above window disappeared. Next, I pressed the FN key again and said "Hello world". The first couple of attempts at doing this produced a notification with this error message:

Now it's working perfectly!

The first time this is used macOS is downloading the local AI models for the used language, I'll check whether I can show some progress indicator to indicate when this is done

I had a feeling that was the reason.

Also, where is the "Live transcription" supposed to be shown? I don't see any live transcription on my screen.

i know it is in early stage..
do you have plans to remove fillers like - “er ah uhh err mm hmm mmm uh ahh ugh”
and able to add custom words replacement
and ai post processing like fixing the grammar and rewrite (using chatgpt api or apple intelligence)

@fortred2 I have also not fully understood when the live transcription works and when not (it seems to work for english only on my machine), I'll investigate that soon

@Sm_Naveen having that by default will probably require the use of external ai models, I think this will be needed but I have not looked into this yet. General post processing & word replacement would already be possible via a chatgpt transformer right now, I can post an example for that tomorrow.

I can now orally and quickly add reminders!

I now keypress FN, orally say my reminder, let go of FN, and then the following Apple Shortcut runs:


The Apple Shortcut prompts an LLM to produce structured output based on the following prompt:

<task>
Convert natural language reminder descriptions into valid JSON for the Reminders app.
</task>

<instructions>
1. Parse the user input in <user_input> tags
2. Extract reminder details: text, due date, priority, flags, tags, and notes
3. Generate JSON that validates against the schema in <json_schema>
4. Apply these defaults when information is missing or ambiguous:
   - reminder_text: Extract the core action from the input
   - due_date: Tomorrow at 09:00 if unspecified
   - priority: "None" if unspecified
   - flag: false if not explicitly requested
   - tags: Derive from context (e.g., "work", "personal", "health", "errands")
   - notes: MUST include the original <user_input> text verbatim. If there are additional details worth preserving (e.g., constraints, context, names, instructions), append them after a blank line.
5. Format dates as ISO 8601 (YYYY-MM-DDTHH:MM:SS)
6. Output ONLY valid JSON inside <json_output> tags—no explanation
</instructions>

<json_schema>
{
  "$schema": "https://json-schema.org/2020-12/schema",
  "type": "object",
  "properties": {
    "reminder_text": {
      "type": "string",
      "description": "The text of the reminder in the Reminders app."
    },
    "due_date": {
      "type": "string",
      "description": "The due date of the reminder.",
      "format": "date-time"
    },
    "priority": {
      "type": "string",
      "enum": ["Low", "Medium", "High", "None"]
    },
    "flag": {
      "type": "boolean"
    },
    "tags": {
      "type": "array",
      "minItems": 1,
      "items": { "type": "string" },
      "uniqueItems": true
    },
    "notes": {
      "type": "string"
    }
  },
  "required": [
    "reminder_text",
    "due_date",
    "priority",
    "flag",
    "tags",
    "notes"
  ]
}
</json_schema>

<examples>
<example>
<input>Remind me to call mom tomorrow at 3pm, it's important</input>
<output>
{
  "reminder_text": "Call mom",
  "due_date": "2026-01-23T15:00:00",
  "priority": "High",
  "flag": false,
  "tags": ["personal", "family"],
  "notes": "Remind me to call mom tomorrow at 3pm, it's important"
}
</output>
</example>

<example>
<input>Pick up dry cleaning next Monday, low priority</input>
<output>
{
  "reminder_text": "Pick up dry cleaning",
  "due_date": "2026-01-26T09:00:00",
  "priority": "Low",
  "flag": false,
  "tags": ["errands"],
  "notes": "Pick up dry cleaning next Monday, low priority"
}
</output>
</example>

<example>
<input>Submit quarterly report by Friday 5pm, high priority, flag it. Make sure to include the updated sales figures from Sarah.</input>
<output>
{
  "reminder_text": "Submit quarterly report",
  "due_date": "2026-01-23T17:00:00",
  "priority": "High",
  "flag": true,
  "tags": ["work", "reports"],
  "notes": "Submit quarterly report by Friday 5pm, high priority, flag it. Make sure to include the updated sales figures from Sarah.\n\nInclude the updated sales figures from Sarah."
}
</output>
</example>
</examples>

<context>
Current date/time: Formatted Date
</context>

<user_input>
Shortcut Input
</user_input>

Do you consider implementing a new one that can use whisper of open AI locally ?

This will add support for more languages (Greek)

once you are free, can you share an example of this General post processing and ChatGPT transformer

You can set it to save the transcription to a variable and then use the "Run Real Java Script" action like this:

//if you rename this, make sure to also rename it in the "function to call" field below.
async function cleanup() {
	let recognizedSpeech = await get_string_variable("speech");
	
	let chatgpt_response = await chat_gpt({
	    model: "gpt-4o-mini",
	    apiKey: "YOUR_API_KEY_HERE",
		user: `Please clean up the following text that is transcribed from a voice recording: ${recognizedSpeech}`,
	});

    await paste_text({text: chatgpt_response});
	return recognizedSpeech;
}


It would also be possible via a h@llo.ai assistant, but I'm currently reworking them quite a bit so let's better stick with JS for now.