0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

音声認識してクリップボードにコピーするアプリ

0
Posted at

 PC で入力を補助するツールです。 音声認識したテキストをクリップボードにコピーします。 アプリのテキスト入力のところで Ctrl-V ペースト(貼り付け)できます。
音声認識入力機能が無いアプリでの PC 初心者やキーボード入力が苦手な方 向けに作りました。
PC の Chrome や Edge で動きます。

 ローカルだけで(スタンドアロンで)も動きますので、HTML ファイルをダウンロードしてPC のファイル エクスプローラでダブルクリックすれば、インターネットにつないでいなくても動きます。

 広告なし。 通信なし。 情報取集なし。 インストールなし。 もちろん無料。
 Windows10 , Windos11 で動作確認しています。


実行画面例

音声認識&クリップボードコピー.png


音声認識&クリップボードコピーアプリ ソースプログラム

音声認識&クリップボードコピー.htm (UTF-8 で保存)
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>音声認識&クリップボードコピー</title>
    <style>
        body {
            font-family: sans-serif;
            max-width: 600px;
            margin: 20px auto;
            padding: 0 10px;
        }
        textarea {
            width: 100%;
            height: 200px;
            margin-top: 10px;
            box-sizing: border-box;
            font-size: 16px;
        }
        .controls {
            margin-top: 10px;
            display: flex;
            gap: 10px;
        }
        button {
            color: white;
            background: #88e;
            padding: 10px 20px;
            font-size: 16px;
            cursor: pointer;
            border-radius: 6px;
        }
        button:hover {
            transform: translateY(-4px);
            color: #ccc;
            background: #77e;
        }
        button:active {
            transform: scale(0.9);
        }
        #status {
            margin-top: 4px;
            color: #555;
            font-size: 1rem;
        }
    </style>
</head>
<body>

    <h3>音声認識&クリップボードコピー</h3>

    <div id="status">停止中</div>

    <textarea id="resultText" placeholder="ここに認識されたテキストが表示されます..."></textarea>
    
    <div class="controls">
        <button id="startBtn">認識開始</button>
        <button id="stopBtn" disabled>停止&コピー</button>
    </div>

    <script>
        const startBtn = document.getElementById('startBtn');
        const stopBtn = document.getElementById('stopBtn');
        const resultText = document.getElementById('resultText');
        const status = document.getElementById('status');

        // Web Speech APIの初期化(ブラウザ互換性対応)
        const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;

        if (!SpeechRecognition) {
            alert('お使いのブラウザは音声認識(Web Speech API)に対応していません。ChromeやSafariでお試しください。');
        } else {
            const recognition = new SpeechRecognition();
            recognition.lang = 'ja-JP'; // 日本語設定
            recognition.continuous = true; // 連続認識を有効化
            recognition.interimResults = true; // 認識途中の結果も取得

            let finalTranscript = '';

            // リアルタイムでテキストを更新
            recognition.onresult = (event) => {
                let interimTranscript = '';
                for (let i = event.resultIndex; i < event.results.length; i++) {
                    const transcript = event.results[i][0].transcript;
                    if (event.results[i].isFinal) {
                        finalTranscript += transcript + '\n';
                    } else {
                        interimTranscript += transcript;
                    }
                }
                resultText.value = finalTranscript + interimTranscript;
            };

            recognition.onerror = (event) => {
                status.textContent = 'エラーが発生しました: ' + event.error;
            };

            recognition.onend = () => {
                // 停止ボタンを押していないのに勝手に終了した場合の表示更新
                if (!stopBtn.disabled) {
                    status.textContent = '認識が中断されました';
                    startBtn.disabled = false;
                    stopBtn.disabled = true;
                }
            };

            // 開始ボタンを押したとき
            startBtn.addEventListener('click', () => {
                finalTranscript = resultText.value; // 既存テキストがあれば引き継ぐ
                recognition.start();
                status.textContent = '音声認識中... マイクに向かって話してください';
                startBtn.disabled = true;
                stopBtn.disabled = false;
            });

            // 停止ボタンを押したとき
            stopBtn.addEventListener('click', async () => {
                recognition.stop();
                status.textContent = '停止しました。クリップボードにコピー中...';
                startBtn.disabled = false;
                stopBtn.disabled = true;

                // テキストボックスの内容をクリップボードにコピー
                try {
                    await navigator.clipboard.writeText(resultText.value);
                    status.textContent = '停止しました。テキストをクリップボードにコピーしました!';
                } catch (err) {
                    status.textContent = 'クリップボードへのコピーに失敗しました';
                    console.error('コピー失敗:', err);
                }
            });
        }
    </script>
</body>
</html>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?