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

Codexでサンプル音源を管理するMacアプリWaveCrateをつくった

image
サンプル音源を管理するアプリはいくつか持っていたはずだが、なぜか見当たらない。しかたがないので、Codexを使ってMacでサンプル音源管理アプリを開発した。

以下の基本機能は数時間でできた。

  • ディレクトリを指定すると、配下のサンプル音源を再帰的に検索して登録する
  • ファイル名からジャンル、楽器、BPM、キーなどを検出して自動タグ付け。手動でのタグ追加にも対応
  • サンプル音源の波形を見ながら試聴する
  • タグによる絞り込み検索
  • ワンショット、ループの判定(厳密ではない)
  • 聴いているサンプルと似た音を探す(ファイル名、タグ、オーディオ特徴量の距離計算、時間、波形エンベロープの形状)
  • 選択したファイルのコピー、パスの取得

目立ったバグもないため、さっそく実践投入するかと、Native InstrumentsのExpansionsのサンプル約9万ファイルを登録したところ、動きがもっさりして使い物にならない。

Codexと一緒に原因を調べたところ、リスト件数ぶんのSQLを無駄に発行していたり(つまり9万回!!)、その場面では不要なデータを取得していたりと、いろいろな問題が見つかった。

このようなAIと一緒に原因を調べて方針を決定する過程では、(現時点では)ソフトウェアの知見があったほうが、よりよい対応ができそうだ。

今回の開発での反省点としては、設計時に機能要件の定義にのみ注力し、性能要件を詰めなかったこと。大量のデータを扱うことを事前に伝えて、そのために性能をどう作り込むかを、実装の前に詰めておくべきだった。


ただ、きっとこれも「現時点」での反省になるんだろうな。


将来的には、実装に入る前に非機能要件をヒアリングしてきたり、勝手に性能要件を類推してコスパの良い設計をしてきたりするはず。

現在、自分がCodexで使っているのはGPT-5.5だが、そのコード生成能力はPoCを速攻で回すような用途においては、もはや人間の出番はなさそうなレベルに達している印象がある。


このアプリの開発をしながら、少し前に読んだ以下のポストを思い出した。生成AIの出現による「ソフトウェアエンジニアリングという仕事の変化」を認識・予測し将来に備えて準備しておかないと、途方に暮れることになりそうだよね、というお話。

Software engineering may no longer be a lifetime career

よく見られる悲劇的なケースは、スポーツ選手が「自分のキャリアは永遠に続く」と思い込み、引退後の生活に備えないことです。もしかすると、ソフトウェアエンジニアの世界でも、今がまさにその世代に当たるのかもしれません。

関連記事

Kokoro-82Mで日本語音声を生成する

軽量なテキスト読み上げ(TTS)モデルKokoro-82Mを試してみる。 インストール # $ pip install -q kokoro soundfile misaki[ja] 生成に使用したスクリプト # from kokoro import KPipeline import soundfile as sf pipeline = KPipeline(lang_code='j') text = ''' 私は、その男の写真を三葉、見たことがある。 一葉は、その男の、幼年時代、とでも言うべきであろうか、十歳前後かと推定される頃の写真であって、その子供が大勢の女のひとに取りかこまれ、(それは、その子供の姉たち、妹たち、それから、従姉妹たちかと想像される)庭園の池のほとりに、荒い縞の袴をはいて立ち、首を三十度ほど左に傾け、醜く笑っている写真である。醜く? けれども、鈍い人たち(つまり、美醜などに関心を持たぬ人たち)は、面白くも何とも無いような顔をして、 「可愛い坊ちゃんですね」 といい加減なお世辞を言っても、まんざら空お世辞に聞えないくらいの、謂わば通俗の「可愛らしさ」みたいな影もその子供の笑顔に無いわけではないのだが、しかし、いささかでも、美醜に就いての訓練を経て来たひとなら、ひとめ見てすぐ、 「なんて、いやな子供だ」 と頗る不快そうに呟き、毛虫でも払いのける時のような手つきで、その写真をほうり投げるかも知れない。 ''' generator = pipeline( text, voice='jf_alpha', speed=1, split_pattern=r'\n+' ) for i, (gs, ps, audio) in enumerate(generator): print(i) # i => index print(gs) # gs => graphemes/text print(ps) # ps => phonemes sf.write(f'{i}.wav', audio, 24000) 実行 # $ time python kokoro-sample.py (中略) python kokoro-sample.py 139.01s user 61.26s system 945% cpu 21.171 total Mac mini(M4 Pro)の実行速度。マルチスレッドで実行されている。

生成AIのオプトアウト設定

ChatGPT・Gemini・Claudeで会話データをモデル学習に使用されないようオプトアウトする方法のまとめ。 ChatGPT (OpenAI) # ChatGPTの設定からデータコントロールを選択し、すべての人のためにモデルを改善するをオフに切り替える。 将来的な会話のみ対象で、過去データは影響を受けない OpenAI Privacy Portalからオプトアウトの設定 右上のMake a Privacy Requestを選択 I have a cunsumer ChatGPT accountを選択 Do not train on my contentを選択 チェックボタンをチェックしJapanを選択してSubmit Request 1.は即日に適用される。2.はアカウントレベルのリクエストとして処理。念のため併用設定する。 また、一時チャットを使用すると履歴保存なしでトレーニング対象外になる。 Gemini (Google) # 設定とヘルプからアクティビティを選択。アクティビィティの保存をオフにする。 チャット履歴と学習 Geminiの場合、アクティビティの保存をオフにするとChatGPTとは異なり、チャット履歴を保存できなくなります。

架空のK-POPグループのアルバムを生成AIで制作

sunoで架空のK-POPガールズグループLuminaのアルバムを作ってみた。 アルバムジャケットはGeminiで作成。ちょっとハードで良い雰囲気かな? 楽曲の作成は以下の流れで行った。 曲の大まかなコンセプトを決めて歌詞のテーマを日本語で書く ChatGPTへテーマを入力し、K-Popのガールズグループ向けの歌詞として英語で書いてもらう。ラップパートが欲しい場合、その旨も書く sunoに歌詞とプロンプトを渡し作曲してもらう。この際、曲調を変えるため以下のように基本プロンプトのの使い分けをした この基本プロンプトに5人組のガールズグループであることや、それぞれの楽曲の追加イメージ(この楽器を使うなどもいける)を伝えるテキストを加える 求めるスタイル プロンプト例 イメージ ガールクラッシュ系 Girl Crush K-Pop, EDM hybrid, confident female vocals, powerful rap verse, heavy bass drop BLACKPINKや(G)I-DLEのような、強さのあるダンス曲。 キュート/バブルガム系 Bubblegum K-Pop, bright synth-pop, high-pitched vocal harmonies, cute and bouncy rhythm TWICEやRed Velvet (Red side)のような、明るく楽しい曲。 フューチャリスティック/クール系 Futuristic K-Pop, synthwave, dreamy atmosphere, sleek female vocals, deep pulsing bass aespaやLE SSERAFIMのような、未来的なコンセプトの曲。 R&B/グルーヴィー系 K-Pop R&B, groovy bassline, smooth female vocals, chill vibe, light hip-hop elements NewJeansやRed Velvet (Velvet side)のような、洗練されたR&B。 何曲か作っていると、似たような構成の曲が生成される確率が高くなってきたので、画面上部のCustomをクリックして、Advanced OptionのWeirdnessとStyle Infuluenceを調整しながら生成。1〜2曲を試しに作ってみるだけなら簡単だが、今回のように同じアーティストの複数楽曲を作るのは難しい。 ただ、アタマの中に明確に楽曲のイメージがあれば、それに合わせてプロンプトを個別に書けば良いのだろうが、今回は基本のプロンプト+αでsunoのランダム性に期待したため、そうなった可能性が高い。 一応、それなりにバリエーションに富んだ楽曲になったんじゃないだろうか。ここから聴けますので、よろしければ。 htakeuchi · Unbreakable

Ghostty

Ghosttyはクロスプラットフォームのターミナルエミュレーター。動作が軽くカスタマイズ性が高い。 Macへのインストールと設定 # brewでインストールした。 brew install --cask ghostty 各種の設定はGUIではなくconfigファイルで行う。 ~/Library/Application Support/com.mitchellh.ghostty/config 設定ファイルをターミナル内から再読み込みするのはcmd+shift+, ターミナルから以下のコマンドを入力すると、使用できる(インストールされている)フォントファミリのリストが表示される。 ghostty +list-fonts 以下のコマンドでインストールされているテーマのリストが表示される。 ghostty +list-themes このようにプレビューを表示しながらテーマを選ぶことができる。 現時点での設定ファイルは以下の通り。 theme = "Dracula" font-family = "UDEV Gothic" font-thicken font-size = 20 mouse-hide-while-typing window-theme = dark background-opacity = 0.8 background-blur = true macos-titlebar-style = transparent window-inherit-working-directory = true window-save-state = always 設定可能な項目の説明はConfigurationにある。かなりの数があるが、自分は必要最低限のものに絞った。 Alfred関連の設定 # デフォルトで使用するターミナルをGhosttyに変更するため、Alfredの設定変更とワークフローの修正を行った。 Teminalの設定変更 # 以下のGhosttyとの連携スクリプトを手順に従って設定する。 zeitlings/alfred-ghostty-script: AppleScript for Ghostty Alfred integration terminalfinderワークフローの修正 # ファインダとターミナルを行き来するのに使っているAlfredのtermmialfinderワークフローにGhostty用のトリガーとスクリプトを追加した。

ObsidianのVimモードでNORMALモードに移行したらIMEをOFFにする(Mac)

ObsidianのVimモードでNORMALモードに移行した際、デフォルの動作ではIMEのON/OFFが変わらないため、日本語のテキストを書いているときに不便なので、im-select + Karabiner-Elementsを使ってEsc押下でIME OFFにする設定を追加した。 自分の環境では既にターミナルやGhostty用にその設定を入れているので、対象とするアプリとしてObisidianを追加するだけだった。 具体的にはbundle_identifiersに"^md\\.obsidian$"を追加した。 Obsidianのbundle_identifierは以下のようにして調べた。 osascript -e 'id of app "Obsidian"' md.obsidian 以下はKarabiner-Elementsに表示で入っている「TerminalまたはMacVimでESCあるいは^[を押したときに日本語入力を英数に切り替える」にGhosttyとObsidianを追加したもの。 { "description": "指定したアプリでESCあるいは^[を押したときに日本語入力を英数に切り替える。", "manipulators": [ { "conditions": [ { "bundle_identifiers": [ "^com\\.apple\\.Terminal$", "^org\\.vim\\.", "^com\\.mitchellh\\.ghostty$", "^md\\.obsidian$" ], "type": "frontmost_application_if" } ], "from": { "key_code": "escape", "modifiers": { "optional": ["any"] } }, "to": [ { "key_code": "japanese_eisuu" }, { "key_code": "escape" } ], "type": "basic" }, { "conditions": [ { "bundle_identifiers": [ "^com\\.apple\\.Terminal$", "^org\\.vim\\." ], "type": "frontmost_application_if" } ], "from": { "key_code": "open_bracket", "modifiers": { "mandatory": ["left_control"] } }, "to": [ { "key_code": "japanese_eisuu" }, { "key_code": "escape" } ], "type": "basic" } ] }

日付キーワードからフォーマットされた日付テキストを生成するAlfred Workflow

azooKeyという高精度なニューラルかな漢字変換エンジンをサポートしたiOS用キーボードアプリのmacOS版を試している。 ライブ変換もサポートしていて、標準のIMEより変換精度が高くて素晴らしい。問題なく常用できそうな感じ。 ただ、いくつかのIMEでサポートしている「きょう」で本日の日付に変換する機能がないんですよね。これはXでも話題になっていて、以下のような改善策も見つけました。 azooKey-Desktop で日付を入力する - terfnoのScrapbox しかし、個人的には「昨日」や「明日」「先週の金曜日」などの日付を得たいケースが多く、ChatGPTでAlfred用のワークフローを作成した。 動作イメージ # ワークフローを起動して、キーワードを入力すると対応するものがサジェストされる。 キーワードを決定すると、複数の日付フォーマットを選択できる。 対応キーワード # today:今日 yesterday:昨日 tomorrow:明日 dayaftertomorrow(略:dat):明後日 daybeforeyesterday(略:dby):一昨日 mon / tue / wed / thu / fri / sat / sun:各曜日 曜日を入力した場合は 「直近の過去の同曜日」「次に来る同曜日」を候補に表示 出力フォーマット # ISO形式:YYYY-MM-DD ISO + 曜日:YYYY-MM-DD(Fri) 日本語形式:YYYY年M月D日(金) 和暦形式(令和):令和X年M月D日(金) ダウンロード # 作成したワークフローを置いておきます。Alfred 5.7で動作確認しました。