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

Macの内部音声をwhisper.cppで文字起こしする

目次

whisper.cppとBlackHoleを使って、Macで流れている音声を文字起こしする環境を作る。

whisper.cppのインストール
#

git clone https://github.com/ggml-org/whisper.cpp.git
cd whisper.cpp
./models/download-ggml-model.sh large-v3
brew install cmake sdl2
cmake -B build -DWHISPER_SDL2=ON
cmake --build build --config Release

# サンプルのwavファイルでテスト
./build/bin/whisper-cli -m models/ggml-large-v3.bin -f samples/jfk.wav

仮想キャプチャデバイス BlackHoleのインストール
#

brew install blackhole-64ch

Macで再生されている音声を文字起こしするために必要な、仮想キャプチャデバイスBlackHoleをインストールする。

インストール後、Macを再起動して、Audio MIDI設定アプリを起動する。

複数出力装置を作成し、M4とBlackHole 64chをチェックする。

Audio MIDI設定

私の環境ではスピーカーを接続しているオーディオインタフェースM4BlackHole 64chを指定している。

その後、Macの音声出力先を複数出力装置に設定する。これで、スピーカーで音声を再生しながら、BlackHoleへも音声を流すことができる。

Macのサウンド設定
#

設定 > サウンド > 出力にさきほど作成した複数出力装置を指定し、入力BlackHole 64chを設定する。

whisper-streamで文字起こし
#

あとは、ターミナルから以下のコマンドでMacで再生されている音声を文字起こしできる。

build/bin/whisper-stream -m models/ggml-large-v3.bin -l ja -t 8 --step 5000 --length 5000 -kc --capture 2

--captureオプションで指定している数字は、オーディオキャプチャデバイスの番号だ。

これは、一度、whisper-streamを動かせば、SDL2が認識しているオーディオキャプチャデバイスと番号がリストされるので、Black Holeに割り当てられた番号を指定すればOK

関連記事

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

サンプル音源を管理するアプリはいくつか持っていたはずだが、なぜか見当たらない。しかたがないので、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)の実行速度。マルチスレッドで実行されている。

LAUNCHPAD Pro MK3

Launchpad Pro MK3は、Ableton LiveやLogic ProなどのDAWとシームレスに連携する、Novation社製のMIDIパッドコントローラー。64個のRGB感圧パッドを搭載し、トラックメイクからライブパフォーマンスまで幅広い用途に対応する。 主な特徴・機能 # 強力なスタンドアロンシーケンサー PCなしで外部のMIDI対応シンセサイザーやドラムマシンを直接コントロールできる、4トラック・32ステップシーケンサーを内蔵。 設定したキーに合わせてパッドの音階が配置されるため、楽器の演奏スキルがなくても音を外さずに美しいメロディやベースラインを弾くことができる。8282 Ableton Liveとの深い統合 クリップやシーンの再生、ミキサー、デバイス、トランスポートの操作がマウスを使わず本体から行える。「Capture MIDI」機能を使えば、思いつきで弾いたフレーズを逃さずクリップに記録できる。 自由なカスタマイズ性 専用ソフト「Novation Components」を使用することで、自分だけのカスタムモードを作成し、あらゆるMIDI機器やソフトウェアを自在に操作できる。 使い方のメモ # ノートモード # ノートモードの設定: Shift + Note クロマチック・スケールモード切り替え: Chro/Schale 作成したプリセット・スクリプト # YAMAHA SEQTRAK用のカスタムモード # 作成したSEQTRAK用カスタムモード(自分の環境ではカスタムモード5にアサイン) カスタムモードの切り替えは パッドの割り当て # No. トラック名 トラックグループ MIDIチャンネル 1 KICK Drum 1 2 SNARE Drum 2 3 CLAP Drum 3 4 HAT1 Drum 4 5 HAT2 Drum 5 6 PERC1 Drum 6 7 PERC2 Drum 7 SYNTH1 Synth 8 SYNTH2 Synth 9 DX DX 10 11-16 SAMPLER SAMPLER 11 SYNTH1, SYNTH2, DXを鳴らす場合はShift + Noteを押しMIDIチャンネルを8〜10に変更してから使う SEQTRAK Mode.syx

GGUF(GPT-Generated Unified Format)

GGUF(GPT-Generated Unified Format)は、大規模言語モデル(LLM)を効率的に実行するための新しいフォーマットである。GPTQ、GGML、GGJT などの従来の量子化フォーマットの後継として開発され、特に LLAMA(Metaの大規模言語モデル) などのモデルをローカル環境で高速に動作させるために設計されている。 GGUFの特徴 # 高い互換性 GGUFは GGML(GPT-Generated Model Loader)の後継であり、GGMLベースのツール(例:llama.cpp)と互換性がある。 llama.cpp や LM Studio などのソフトウェアで直接利用可能である。 高効率な量子化(Quantization) 量子化とは、モデルのサイズを小さくし、推論(実行)の速度を向上させる技術である。 GGUFは低ビット量子化(例:4ビット、8ビット)をサポートし、メモリ使用量を大幅に削減できる。 エコシステムの拡張 GGUFは、Hugging Faceなどのモデル配布プラットフォームで利用可能である。 llama.cpp、KoboldCpp、LM Studio など、ローカルでLLMを動作させる多くのツールで標準フォーマットとして採用されている。 ストレージとロードの最適化 GGUFフォーマットは従来のGGMLやGPTQよりもファイル構造が整理されており、モデルのロード速度が向上している。 CPU・GPUの両方での効率的な推論が可能である。 GGUFと他のフォーマットとの比較 # フォーマット 特徴 GGUF 最新の量子化フォーマット、高速ロード、低メモリ使用、llama.cpp互換 GGML 旧フォーマット、シンプルだが機能が限定的 GPTQ 高精度な量子化(4bit)、GPU推論向け ONNX 汎用AIフォーマット、多くのフレームワークで使用可能 FP16(Float16) 高精度だがメモリ使用量が大きい GGUFの使い方 # 1. GGUF対応のモデルをダウンロード # GGUF形式のモデルは、多くが Hugging Face(huggingface.co)で配布されている。

生成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