GPT Dictation Toggle (Alt+S) - Stable Edition

Toggles voice dictation in ChatGPT using Alt+S (works even after browser restarts)

// ==UserScript==
// @name         GPT Dictation Toggle (Alt+S) - Stable Edition
// @namespace    http://tampermonkey.net/
// @version      4.0
// @description  Toggles voice dictation in ChatGPT using Alt+S (works even after browser restarts)
// @author       Kamil
// @match        https://chatgpt.com/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    function simulateClick(el) {
        const evt = new MouseEvent('click', {
            bubbles: true,
            cancelable: true,
            view: window
        });
        el.dispatchEvent(evt);
        console.log("Kliknięto:", el);
    }

    function findDictateButton() {
        const buttons = document.querySelectorAll('button');

        for (const button of buttons) {
            const aria = button.getAttribute('aria-label');
            if (!aria || !aria.toLowerCase().includes('dictate')) continue;

            const svg = button.querySelector('svg');
            if (!svg) continue;

            const paths = svg.querySelectorAll('path');
            if (paths.length === 2 &&
                paths[0].getAttribute('d')?.startsWith('M11.165 4.41699') &&
                paths[1].getAttribute('d')?.startsWith('M14.8058 9.11426')) {
                return button;
            }
        }

        return null;
    }

    function findSubmitDictationButton() {
        return document.querySelector('button[aria-label="Submit dictation"]');
    }

    document.addEventListener('keydown', function (e) {
        if (e.altKey && e.key.toLowerCase() === 's') {
            e.preventDefault();
            const stopBtn = findSubmitDictationButton();
            const startBtn = findDictateButton();

            if (stopBtn) {
                simulateClick(stopBtn);
            } else if (startBtn) {
                simulateClick(startBtn);
            } else {
                console.warn("Nie znaleziono mikrofonu ani przycisku zatwierdzenia dyktowania.");
            }
        }
    });
})();