メインコンテンツへスキップ

話した内容をテキスト化しTextwellへ追記するショートカット

このエントリは生成AIで書いたものです

このテキストをClaudeでブログ用にリライトしてくださいと指示しました。

「月に数百件のメモが溜まる」「入力速度はキーボード入力と比較して約3倍に」など書いてないこともシレッと入れてくるので、書き手としても読み手としても注意が必要です😅

これとは別に、音声入力したテキストをClaudeに投げて構造化、Markdown化するショートカットも作っていますが、テキスト化に時間がかかり、気軽にメモをする感じではないので用途によって使い分けしています。

iPhoneの音声入力を劇的に効率化する自作ショートカット
#

スマートフォンでの文字入力に悩まされていませんか?

特に移動中や家事の合間に、ふと浮かんだアイデアをサッと記録したいとき、小さな画面でのキーボード入力は煩わしく感じるものです。

私はこの問題を音声入力で解決し、さらにiOSのショートカット機能を活用して効率化に成功しました。

音声入力の驚くべき進化
#

最近、特にiPhoneで文字を入力する場合、意識的に音声入力を使うようにしています。そして気づいたのは、現在の音声認識精度は完全に実用の域に達しているということです。数年前と比べると、その精度は格段に向上しました。

もちろん、誤字脱字が発生することはありますが、音声入力したテキストをそのままChatGPTなどの生成AIに突っ込めば、良い感じに修正してくれますし、さらには構造化までしてくれるのです。この組み合わせは特にブログ記事の下書き作成時に威力を発揮しています。

自作ショートカットの紹介
#

少し前にiOSで音声入力用のショートカットを作って使っているのですが、思いの外、使い勝手が良いので共有したいと思います。

このシンプルなショートカットが、私の日常のメモ取りや文章作成の流れを大きく変えました。出勤途中の電車内でふと浮かんだブログのアイデアや、料理中に思いついたタスクなど、手が離せない状況でも即座にテキスト化できるようになりました。

使い方
#

このショートカットをホーム画面へ登録しておけば、以下の簡単な流れで音声入力した内容をTextwellへキャプチャできます。

  1. ホーム画面の音声メモアイコンをタップ
  2. 自動的に音声入力が始まる
  3. 話し終わったら停止ボタンを押す
  4. テキストがTextwellに日付付きで自動追記される

特に便利なのは、日付が自動的に付与される点です。これにより、後から「いつ思いついたアイデアだったか」を簡単に追跡できます。私の場合、月に数百件のメモが貯まりますが、日付があることで整理が格段に楽になりました。

まとめ:小さな工夫が大きな変化を
#

このシンプルなショートカットの導入により、私のメモ取りと文章作成の効率は格段に向上しました。入力速度はキーボード入力と比較して約3倍になり、特に移動中や家事の合間など、これまでアイデアを取りこぼしていた状況でもしっかりとキャプチャできるようになりました。

みなさんはどんな便利なショートカットを使っていますか?また、音声入力を活用した効率化の工夫があれば、ぜひコメントで教えてください。小さな工夫の共有が、お互いの生産性向上につながると信じています。


オリジナルテキスト
#

最近、特にiPhoneで文字を入力する場合、意識的に音声入力を使うようにしていて感じるのは、認識精度は実用の域に達しているということだ。

もちろん、誤字脱字が発生することはあるが、音声入力したテキストをそのままChatGPTなどの生成AIに突っ込めば良い感じに修正し、構造化までしてくれる。

少し前にiOSで音声入力用のショートカットを作って使っているが、思いの外、使い勝手が良いので共有しときます。

このショートカットをホーム画面へ登録しておけば、以下の流れで音声入力した内容をTextwellへキャプチャできる。

  • 音声メモのアイコンをタップ
  • 音声入力が始まる
  • 停止ボタンを押すと、テキストがTextwellに日付付きで追記される

関連記事

Appleのヘルスケアデータから体重を抜き出してCSVファイルを作成する

Appleのヘルスケアアプリのデータを使って、他のアプリでグラフを描こうと思ったが、エクスポートされるデータはXMLのため、そのままでは扱いにくい。 このため、XMLファイルから体重データを抜き出してCSVを出力するRubyスクリプトを書いた。 require 'nokogiri' require 'date' reader = Nokogiri::XML::Reader File.read('export.xml') data = [] reader.each do |node| if node.name == 'Record' && node.attributes['type'] == 'HKQuantityTypeIdentifierBodyMass' d = Date.parse(node.attributes['startDate']).strftime("%Y-%m-%d") data << [d, node.attributes['value']] end end data.sort.each {|d| puts d.join(',') } =begin <Record type="HKQuantityTypeIdentifierBodyMass" sourceName="1byone Health" sourceVersion="63" device="&lt;&lt;HKDevice: 0x3013e9b30&gt;, name:iPhone, manufacturer:Apple, model:iPhone, hardware:iPhone, firmware:iPhone, software:17.5.1, localIdentifier:ja_JP, UDIDeviceIdentifier:ja_JP, creation date:2024-06-02 22:17:36 +0000&gt;" unit="kg" creationDate="2024-06-17 07:17:17 +0900" startDate="2024-06-17 07:17:17 +0900" endDate="2024-06-17 07:17:17 +0900" value="71.9"/> =end 以下、ChatGPTにヘルスケアデータの構造を聞いた回答 Appleのヘルスケアアプリでエクスポートされるデータは、XML (Extensible Markup Language) フォーマットで提供されます。このフォーマットは、ヘルスデータを構造化して格納するための標準的な形式です。 データの構造と内容 # XMLヘッダー エクスポートされたファイルは、XMLヘッダーから始まります。 <?xml version="1.0" encoding="UTF-8"?> 全体のルート要素 データ全体は <HealthData> というルート要素でラップされています。 <HealthData locale="en_US"> ... </HealthData> データの各エントリー ヘルスケアのデータは、それぞれの記録を <Record> 要素として格納します。主な属性は以下の通りです: type: データの種類(例: 歩数、心拍数など)。 sourceName: データのソース名(iPhone、Apple Watchなど)。 sourceVersion: ソースのバージョン情報。 unit: データの単位(例: count, bpm, kcal など)。 creationDate: データが作成された日時。 startDate: データの開始日時(測定期間の開始)。 endDate: データの終了日時(測定期間の終了)。 value: データの値(例: 歩数の数値、体重の値など)。 例:

〰️ USB Type-Cの複雑さ

iPhone 15でLightningからUSB Type-Cへ変更される記念?で、なんとなくしか理解していないUSB Type-Cの仕様についてまとめてみた。 USB Type-Cとは # USB Type-Cは、物理的なコネクタの形状を指すものである。その背後にあるデータ転送や電力供給の仕様は、USB Type-Cの形状だけでは特定できない。 USBの仕様 # 仕様 データ転送速度 注意点 USB 2.0 最大480 Mbps 新しいデバイスとの互換性が必要な場合には注意が必要 USB 3.2 Gen 1 最大5 Gbps USB 3.2 Gen 2 最大10 Gbps USB 3.2 Gen 2x2 最大20 Gbps USB4 最大40 Gbps Thunderbolt 3との互換性があるが、すべてのUSB4デバイスやケーブルがThunderbolt 3と互換性があるわけではない USB Power Delivery (USB PD) # USB Type-Cコネクタを使用するデバイス間での高出力の電力供給を可能にするもので最大100W (20V@5A)の電力供給が可能。

Textwell

Textwell - The Modeless Textbox for iPhone, iPad, iPod touch, Mac, and Watch. メモ、メッセージ、ブログ、検索、投稿など、あらゆる文章作成タスクに使用できる多目的テキストエディタ ファイリングやスタイリングのための機能はないが、JavaScriptベースのカスタマイズ可能なアクション、自動履歴、クラウド同期などをサポートしており、シンプルで拡張性が高い Mac版、iOS版、AppleWatch版がある Textwell | URL Schemes 自作のアクションなど # ソートして重複行を削除するTextwellのアクション Obsidianのデイリーノートへ追記するTextwellのアクション Amazonから書誌情報をTextwellへ取り込むブックマークレット

todo.txtで始めるタスク管理

Remeber the Milk、Todoist、Appleのリマインダーなどを経て、ここ1〜2年はMicorosoft To Doを使ってタスク管理をしている。 私がタスク管理アプリに求めるものは、 期限管理できること 繰り返しタスク(毎週、毎月など)が使えること コンテキスト、プロジェクトなどでタスクをカテゴライズできること であり、有償のタスク管理サービスで提供される豊富な機能は、自分にとってオーバースペックで、機能的にはシンプルなMicrosoft To Doで必要十分だ。 しかし、データがサーバに保管されクローズドであり、かつエクスポートすらできない点がずっと気になっていた。 このため、テキストファイルを使ったタスク管理であるTodo.txtを使い始めることにした。 iOSではSwiftoDoを使うことにした。 標準でDropboxをサポートしており、ファイルアプリでアクセスできるようにしていれば、iCloudやGoodle Driveなどにもファイルを置けるが、私はDropboxへ置くことにした。 DropboxはGoogle DriveやiCloudなどと比較し同期が速く、この手の運用をするのであれば未だに優位性があると思う。 MacとWindowsではオープンソースのsleekを使いはじめた。 todo.txtの標準シンタクスには定義されていない、繰り返しタスクの記法(例 rec:1w)がSwiftoDoと共通なのが嬉しくUIも美しい。 ransome1/sleek: todo.txt manager for Linux, Windows and MacOS, free and open-source (FOSS) ただ、sleekには登録済みタスクのテキストを修正できない不具合があるっぽい。(2025/02/17現在 Macで再現) 2025/03/05追記 sleekは私の環境(Mac)では動作が不安定なため使用を止めた。

ソートして重複行を削除するTextwellのアクション

ファイルの内容を昇順にソートして重複した行を1行にするTextwellのアクションを書いた。 いわゆる$ sort foobar | uniqするアクションです。 https://gist.github.com/htakeuchi/fd9e36227ad1688b31e9b84eafbf17a9 const { text, range } = T; const selectionStart = range.len > 0 ? range.loc : 0; const selectionEnd = range.len > 0 ? selectionStart + range.len : text.length; const lines = text.split('\n'); let pointerStart = 0; let replacingRangeLoc = 0; const hitLines = []; for (const line of lines) { const pointerEnd = pointerStart + line.length; if (pointerStart > selectionEnd) break; if ( (pointerStart <= selectionStart && selectionStart <= pointerEnd) || (pointerStart <= selectionEnd && selectionEnd <= pointerEnd) || (selectionStart < pointerStart && pointerEnd < selectionEnd) ) { if (hitLines.length === 0) replacingRangeLoc = pointerStart; hitLines.push(line); } pointerStart = pointerEnd + 1; // 1 means a line break. } const blankLines = []; const numLines = []; const strLines = []; hitLines.forEach((content) => { const intContent = parseInt(content); if (!content.match(/\S/)) { blankLines.push(content); // Ignore blank line } else if (isNaN(intContent)) { strLines.push(content); } else { numLines.push({ num: intContent, str: content }); } }); numLines.sort((a, b) => a.num - b.num); const sortedNumLines = numLines.map(({ str }) => str); strLines.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())); const sortedLines = [...blankLines, ...sortedNumLines, ...strLines]; // Remove duplicates const uniqueLines = [...new Set(sortedLines)]; // Join lines into text const replacingText = uniqueLines.join('\n'); T('replaceRange', { text: replacingText, replacingRange: { loc: replacingRangeLoc, len: selectionEnd - replacingRangeLoc }, selectingRange: { loc: replacingRangeLoc + replacingText.length, len: 0 }, });

「写真」アプリで検索した写真の撮影日周辺の写真を確認する

[iPad Workers|https://podcasts.apple.com/jp/podcast/ipad-workers/id1567317147] の #113 で紹介されていた写真アプリの便利な小技が、まさに自分が欲していたものだった。 iPhoneの「写真」アプリで検索した写真の撮影日周辺の写真を参照したいことがあるが、その際、撮影日を確認してからカメラロールに戻り、その近辺の写真を探していたが、この手順がちょっと楽になる。 検索した写真の下のiアイコンをタップし、 すべての写真に表示をタップすれば… 撮影日時近辺のカメラロールが表示される。これは便利。 ただ、Podcastでも言及されていたが、なぜか Macの「写真」アプリにはすべての写真に表示がなく同じことをするための手段がわからない…と思っていたが、いま発見した。 検索した写真を右クリックすると表示されるメニューに"すべての写真”に表示があるので、それを選択すれば同じことができる。