パラダイス

瀬川商店 第64回:BlackHoleを使わずに、Mac内部の音を録音するアプリを作ってみた

2026.09.26

以前の記事では、BlackHoleを使ってMac上で再生しているオーディオをLogic Proに入力し、オーディオトラックへレコーディングする方法を紹介しました。

BlackHoleは非常に便利なソフトウェアですが、仮想オーディオデバイスをMacに追加して、Audio MIDI設定やDAW側で入出力を設定する必要があります。慣れてしまえば難しい作業ではないものの、「Macで鳴っている音をちょっと録音したい」という目的だけを考えると、少し大がかりな方法でもあります。

ところが最近、macOSのオーディオ関係の仕様を調べているうちに、AppleがmacOS 14 Sonomaの途中から、Mac内部で再生されているオーディオをアプリから直接取得するためのAPIを追加していたことに気がつきました。

正確には、Core Audio Process Tapという機能がmacOS 14.2で追加されています。今回開発したアプリでは安定性やXcode側のDeployment Targetを考慮して、macOS 14.4以降を動作対象としました。Appleの公式ドキュメントでも、AudioHardwareCreateProcessTapはmacOS 14.2以降で利用できるAPIとして記載されています。

この機能を使うと、BlackHoleのような仮想オーディオドライバーを介さなくても、Mac上のアプリから出力されている音声を取得できます。

そこで今回は、DAWを起動せずにMacで再生されている「システムオーディオ」を内部で録音し、48kHz/24bitのWAVファイルとして保存する小さなmacOSアプリを作ってみました。

さらに、前回の記事で紹介したffmpegをアプリから呼び出し、録音終了後にWAVファイルをMP3へ変換できるようにしました。FFmpegは、音声や映像の変換、エンコード、ストリーミングなどを行うためのコマンドラインツールです。

アプリ名は、とりあえずSnapRecとしました。

SnapRecの画面

アプリを配ろうと思ったものの……

前回の記事を執筆していた時点では、このアプリそのものも記事で紹介し、読者の皆さんに配布してもよいのではないかと考えていました。

しかし、完成したアプリを実際に使ってみると、少し良心が痛むというか(笑)、どうにもスッキリしないものがありました。

SnapRecはボタンを押すだけで、Mac上で再生されている音をWAVとして保存できます。録音終了後には、自動的にMP3へ変換することもできます。

もちろん、自分で制作した音楽や映像の確認、オンラインミーティング、ソフトウェアの操作解説、権利を所有している素材の収録など、正当な用途はいくらでもあります。

一方で、YouTubeや音楽配信サービスから、サンプリング素材を安易に録音するために使われる可能性もあります。

どのような道具も使い方次第ではありますが、楽器や音楽制作に関心を持つ人が読む記事で、完成した録音アプリをそのまま配布することには、少し抵抗を感じました。

そこで、アプリそのものを直接共有することはやめることにしました。

その代わり、この記事ではどのような仕組みでアプリを作ったのか、そしてAIにどのような指示を出せば同様のアプリを開発できるのかを紹介します。

皆さんも、必要であれば自力で開発してみてください。

当然ですが、録音するコンテンツの著作権や各サービスの利用規約を確認し、権利を持っている音源や、録音・利用の許可を得ている素材に使用してください。

Appleは、なぜMac内部の音を取得できるようにしたのか

AppleがProcess Tapを追加した理由について、「音楽配信サービスの音を録音できるようにするため」と考えるのは、おそらく正しくありません。

AppleがScreenCaptureKitを発表した際には、画面共有、ビデオ会議、ゲーム配信、コンテンツ制作などの需要が増加したことを背景として説明しています。

特にオンラインでの共同作業では、画面だけでなく、そのアプリから出ている音も相手へ送る必要があります。

例えば、次のような用途です。

Zoomのようなビデオ会議
オンライン授業やウェビナー
DAWやプラグインの操作解説
ゲーム配信
ソフトウェアの遠隔サポート
画面収録やチュートリアル動画
アクセシビリティや文字起こし

AppleはScreenCaptureKitについて、リモートコラボレーションや画面共有、ビデオ会議、ゲームストリーミング、コンテンツ制作などのために開発したフレームワークであると説明しています。

ScreenCaptureKitでは、ディスプレイ全体、特定のアプリ、特定のウインドウなど、取得する対象を細かく指定できます。また、画面だけでなく、その画面やアプリに付随する音声も取得できます。

その後、AppleはCore Audio側にもProcess Tapを追加しました。

Process Tapでは、特定のプロセス、つまり特定のアプリから出力されている音声や、複数アプリの音声をミックスしたものを取得できます。Appleのドキュメントでは、CATapDescriptionをAudioHardwareCreateProcessTapへ渡すことでTapを作成する仕組みが説明されています。

この仕組みがあれば、画面を録画する必要がなく、音声だけを扱うアプリも作れます。

また、従来のように仮想オーディオドライバーをインストールしなくても、macOSの正式なAPIを通じて音声を取得できます。

AppleがProcess Tap単独の導入理由を明確に説明しているわけではありませんが、ScreenCaptureKitの流れやAPIの構造を見る限り、画面共有、配信、録音、文字起こし、オーディオ解析といった需要に対応しつつ、音声取得をmacOSの権限管理下に置くことが目的だったと考えるのが自然です。

Process Tapを使用するアプリには、システムオーディオを取得する理由をユーザーへ説明するためのNSAudioCaptureUsageDescriptionという項目があります。macOS側で許可されたアプリだけがシステムオーディオを取得する仕組みです。

つまりAppleは、「内部音声を絶対に取得できないようにする」のではなく、必要とされている機能を正式なAPIとして提供し、ユーザーの許可とmacOSのプライバシー管理の下で動作させる方向を選んだのでしょう。

XcodeとScreenCaptureKit、Core Audioの関係

ここで、XcodeやScreenCaptureKit、Core Audioの関係を整理しておきましょう。

Xcodeは、Mac、iPhone、iPadなどで動作するアプリを開発するためにAppleが提供している統合開発環境です。

プログラムを書くためのエディターだけではなく、アプリの画面設計、コンパイル、実行、動作確認、エラーの調査など、Apple製品向けのアプリ開発に必要な機能がまとめられています。AppleもXcodeを、Appleの各プラットフォーム向けアプリを開発、テスト、配布するためのツールとして説明しています。

Xcodeを「アプリを組み立てる作業場」だとすると、ScreenCaptureKitやCore Audioは、その作業場で使用するApple純正の部品セットです。

Appleの開発用語では、この部品セットをフレームワークと呼びます。

Swiftで使用する場合は、ソースコードの最初に次のように記述します。

import SwiftUI
import CoreAudio
import AVFoundation

画面やウインドウを映像としてキャプチャする場合には、次のフレームワークを使用します。

import ScreenCaptureKit

それぞれの役割を大まかに整理すると、次のようになります。

Xcode
アプリ全体を作成、ビルド、実行、デバッグするための開発環境です。

Swift
アプリの処理を書くためのプログラミング言語です。

SwiftUI
録音ボタン、保存先の表示、チェックボックス、波形など、アプリの画面を作るために使用します。

ScreenCaptureKit
Macの画面、ウインドウ、特定アプリの映像と、それに付随する音声をキャプチャするためのフレームワークです。

Core Audio Process Tap
Mac上のアプリから出力されている音声を、映像とは独立して取得するための機能です。

AVFoundation
取得したオーディオデータをWAVファイルとして書き出す処理などに使用します。

今回アプリのコード

XcodeでContentView.swiftを開いた画面

今回のSnapRecは画面を録画しません。

したがって、アプリの中心となっているのはScreenCaptureKitではなく、Core AudioのProcess Tapです。

ScreenCaptureKitとProcess Tapは、どちらもMac内部のオーディオを取得できますが、所属するフレームワークと想定されている用途が異なります。

記事内でSnapRecを説明する場合は、
AppleがmacOS 14.2で追加したCore Audio Process Tapを利用し、Mac上で再生されているシステムオーディオを録音するアプリ
と表現するのが正確です。

AIを使ってアプリを開発する

僕自身は本職のソフトウェアエンジニアではありません。

今回も、アプリの設計やSwiftのコード作成、エラーの修正については、AIにかなり助けてもらいました。

ただし、最初から、
Macの音を録音するアプリを作ってください
とだけ入力しても、効率よく完成するとは限りません。

AIは要望が曖昧だと、ScreenCaptureKitを使うのか、Core Audio Process Tapを使うのか、BlackHoleのような仮想デバイスを前提にするのかを判断できません。

また、最初から大量の機能を要求すると、どこで問題が起きているのか分からなくなります。

効率よく開発するポイントは、最初にアプリの仕様と使用する技術を明確にし、その後、機能を一つずつ追加していくことです。

最初のプロンプトで仕様を固定する

まず、AIには次のようなプロンプトを入力します。

macOS用のシンプルな録音アプリをXcodeとSwiftUIで開発したいです。

目的は、Macのデフォルト出力から再生されているシステムオーディオを、
BlackHoleなどの仮想オーディオデバイスを使わずに録音することです。

macOSのCore Audio Process Tap、
AudioHardwareCreateProcessTap、
CATapDescriptionを使用してください。

ScreenCaptureKitによる画面録画は行いません。
映像は不要で、音声だけを取得します。

最初のバージョンでは、以下の機能だけを実装してください。

・macOS 14.4以降
・SwiftUIを使用
・録音開始ボタン
・録音停止ボタン
・Macのシステムオーディオをステレオで取得
・48kHz/24bitのWAVファイルとして保存
・保存先はユーザーが選択
・NSAudioCaptureUsageDescriptionを設定
・録音の開始、停止、エラーを画面に表示

最初から装飾的なUIやMP3変換は追加せず、
まずWAV録音だけが確実に動作する最小構成を設計してください。

必要なSwiftファイルの構成を先に説明し、
その後、各ファイルの完全なコードを省略せずに提示してください。

ここで重要なのは、使用するAPIを最初から指定することです。

「Macの内部音声を録音する」とだけ伝えると、AIがBlackHoleやScreenCaptureKitを使う構成を提案する可能性があります。

今回は、
Core Audio Process Tapを使う
ScreenCaptureKitは使わない
映像は扱わない
最初はWAV録音だけ
macOS 14.4以降
という条件を最初に固定します。

いきなり完成版を作らせない

次に重要なのは、機能を段階的に追加することです。

最初の段階では、次のことだけを確認します。

アプリが起動する
システムオーディオ取得の許可が表示される
Recordボタンを押せる
Stopボタンで録音を終了できる
WAVファイルが作成される
作成されたWAVを再生できる

この段階でMP3変換、波形表示、録音時間、ファイルの自動削除などを追加すると、録音が失敗した時に原因を特定しにくくなります。

まず録音エンジンだけを完成させます。

エラーは省略せず、そのままAIへ渡す

Xcodeで赤いエラーが表示された場合は、内容を要約せず、そのままコピーしてAIへ入力します。

Xcodeで次のエラーが出ました。

[ここにエラー全文を貼る]

推測で別方式に書き換えず、
現在のCore Audio Process Tapを使う設計を維持したまま修正してください。

変更するファイル名と変更理由を説明したあと、
修正後のファイル全体を省略せずに提示してください。

「動きません」だけでは、AIも原因を絞り込めません。

エラーが複数ある場合も、表示されている順番を保ったまま貼り付けます。最初の一つを修正すると、残りのエラーも消えることがよくあります。

WAV録音ができてからMP3変換を追加する

WAV録音が安定したら、次にffmpegを呼び出す機能を追加します。

WAV録音は正常に動作しました。

次に、録音停止後、保存したWAVファイルを
ffmpegを使ってMP3へ変換する機能を追加してください。

要件は次のとおりです。

・SwiftのProcessクラスからffmpegを実行する
・変換元WAVと同じフォルダへMP3を保存する
・MP3は320kbpsのCBR
・変換中であることを画面に表示する
・変換成功と失敗を画面に表示する
・ffmpegが見つからない場合は、ユーザーへ分かりやすく通知する
・録音処理そのものは変更しない
・既存の動作を壊さない
・変更したファイルの完全なコードを提示する

FFmpegはアプリの内部機能ではなく、Macにインストールされている外部のコマンドラインツールです。

そのため、次のような問題が起きる可能性があります。

ffmpegがインストールされていない
アプリからffmpegの場所を発見できない
変換元または保存先のパスに空白が含まれている
変換中にアプリの画面が固まる
変換終了前に一時ファイルを削除してしまう

これらも最初のプロンプトに条件として含めておくと、無駄な修正を減らせます。

WAVを削除する機能は最後に追加する

MP3への変換が安定したら、次に「MP3変換後にWAVを削除」というチェックボックスを追加します。

MP3変換が正常に動作しました。

次にSwiftUIの画面へ、
「MP3変換後にWAVを削除」というチェックボックスを追加してください。

チェックされている場合だけ、
ffmpegの終了ステータスが成功であり、
MP3ファイルが実際に作成されていることを確認してから
元のWAVファイルを削除してください。

変換失敗時にはWAVを絶対に削除しないでください。

この順番は重要です。

録音終了直後に無条件でWAVを消すコードにしてしまうと、MP3変換に失敗した場合、録音したファイルそのものを失ってしまいます。

UIは動作確認後に整える

録音と変換が完成した後で、ボタンの色、波形表示、録音中のインジケーターなどを追加します。

録音とMP3変換は正常に動作しています。
録音エンジンとffmpegの処理は変更せず、SwiftUIの画面だけを改善してください。

・待機中は波形をグレー
・録音中は波形をグリーン
・停止後はグレーへ戻す
・中央に大きな赤い録音ボタン
・録音中のボタンには白文字でStopと表示
・右上に録音状態を示す小さなインジケーター
・ダークモードとライトモードの両方に対応

ここでも、「録音エンジンは変更しない」と明記します。

動いている部分までAIが大きく書き換えてしまうと、新しい不具合が発生することがあります。

AIへ指示する際のポイント

今回のようなアプリをAIと一緒に開発する場合、僕が重要だと感じたポイントをまとめます。

1. アプリの目的を一文で決める

今回の目的は、
BlackHoleやDAWを使わず、Mac内部で再生されている音をWAVとして録音する
というものです。

途中で目的を変えないことが重要です。

2. 使用する技術を指定する

今回はCore Audio Process Tapを使用します。

AIが別の方法を提案した場合は、なぜ別方式が必要なのかを確認し、明確な理由がなければ元の設計を維持します。

3. 最初は最小構成にする

録音、MP3変換、波形、ファイル削除、アイコン、配布設定を同時に実装しないようにします。

4. 一度に一つの機能だけ追加する

新しい機能を追加する前に、現在のバージョンが動作していることを確認します。

5. コードはファイル全体を出してもらう

プログラミングに慣れていない場合、「この関数の下に追加してください」と言われても、正しい位置が分からないことがあります。

そのため、
修正後のファイル全体を省略せずに提示してください
と指示します。

6. 動作している部分を変更させない

AIへ、
録音部分は正常に動作しているので変更しないでください
と明確に伝えます。

7. Xcodeの画面も具体的に伝える

コード以外の設定が必要な場合は、
Xcodeのどの項目を開き、どの欄へ何を入力するのか、メニュー名を含めて説明してください
と指示します。

例えばDeployment Target、Info.plist、Signing、App Sandbox、マイクやシステムオーディオの権限などは、コードだけでは設定できない場合があります。

最初にAIへ渡す完成版プロンプト

最後に、今回の開発を最初からやり直すとしたら、僕なら次のプロンプトから始めます。

あなたはmacOS、SwiftUI、Core Audioに詳しいソフトウェアエンジニアです。

Xcodeを使って、Mac内部で再生されているシステムオーディオを
録音するmacOSアプリを開発してください。

アプリ名はSnapRecです。

開発条件:
・Swift
・SwiftUI
・macOS 14.4以降
・Core Audio Process Tapを使用
・AudioHardwareCreateProcessTapとCATapDescriptionを使用
・BlackHole、Soundflowerなどの仮想オーディオデバイスは使用しない
・ScreenCaptureKitによる画面録画は行わない
・映像は取得しない
・Macのデフォルト出力で再生される音声を取得
・録音中もMacのスピーカーまたはオーディオインターフェースから音を再生
・ステレオ、48kHz、24bitのWAVとして保存
・ユーザーが保存先を選択
・システムオーディオ取得に必要な権限と
NSAudioCaptureUsageDescriptionを正しく設定
・録音開始、停止、エラー状態をSwiftUI画面に表示
・録音処理はUIスレッドをブロックしない
・録音停止時にProcess Tapや関連するAudio Objectを安全に破棄する
・連続して複数回録音できる
・アプリ終了時にも録音処理を安全に停止する

最初の回答では、いきなりコードを書かず、
必要なSwiftファイル、各ファイルの役割、
オーディオデータの流れ、
必要なXcode設定を説明してください。

その設計を提示した後、
最小構成のWAV録音版をファイル単位で実装してください。

コードは省略せず、
各ファイルをそのままXcodeへ貼り付けられる完全な形で提示してください。

不明なAPIを想像で作らず、
macOS 14.4で利用可能な実在するAppleのAPIだけを使用してください。

このプロンプトでも、一度で完全なアプリが完成するとは限りません。

しかし、目的、使用するAPI、対応OS、録音形式、UI、権限、ファイル構成を先に指定しておけば、AIが見当違いの方式を提案する可能性はかなり減ります。

そして、最初に作るのはあくまでWAV録音だけの最小構成です。

WAVが正常に作成されることを確認してから、ffmpegによるMP3変換、WAVの自動削除、波形表示、アイコンなどを順番に追加していきます。

最後に

今回のアプリを作ってみて興味深かったのは、これまでBlackHoleやDAWが必要だと思っていた処理を、現在のmacOSではAppleの正式なAPIだけで実現できるようになっていたことです。

BlackHoleを使う方法が不要になったわけではありません。

BlackHoleは、複数のアプリ間で音声をルーティングしたり、DAWへ内部音声を入力したりする場合には、今でも非常に便利です。

一方、単純にMac内部の音をファイルへ録音するアプリを作るのであれば、Core Audio Process Tapという新しい選択肢があります。

完成したSnapRecをここで配布することはしませんが、XcodeとAIを利用すれば、プログラミングを本職としていない人でも、必要な機能を一つずつ確認しながらアプリを組み立てることができます。

そして、自分で作る過程を経験すれば、そのアプリがMac内部で何をしているのかも理解できます。

録音するコンテンツの権利や利用規約を尊重しつつ、自分の制作や業務に必要なツールとして活用してみてください。

瀬川英史(瀬川商店)
劇伴の作曲家やってます。Netflix「シティーハンター」アニメ「烏は主を選ばない」等。シンセは危険物取扱者の甲種レベルの知識あり(多分)。
記事内に掲載されている価格は 2026年9月26日 時点での価格となります
パラダイスの新着記事