はじめに:好きなことを形にしていたら、講師になっていた
現在、私は個人開発者として、熊本でClaude Codeの講師をしたり、クリエイターとして海外に行った経験を生かして、クリエイティブ系のハンズオン講師を務めたりしています。
とはいえ、もともとエンジニアとして専門教育を受けてきたわけではありません。
独学でプログラミングを学びながら、福岡のエンジニアカフェに半年ほど通ってPythonを勉強したり、通信教育でHTMLを学んだり。
ハッカソンに参加しては、新しい技術に触れたり、ほかの参加者からフィードバックをもらったり。
そんなことを繰り返しているうちに、参加していた勉強会で「講師をしてみませんか?」と声をかけていただきました。
自分が講師をするなんて、少し前までは想像もしていませんでした。
そして今も、私の個人開発の根っこにあるのは、技術を極めることよりも「自分のやりたいことを実現したい」という、ごく単純な動機です。
今回は、そんな私がAIとPythonを使って開発した、CDマスタリングツールについて書いてみようと思います。
Claude Codeを教える立場になって、気づいたこと
講師をする以上、教える内容はきちんと整理しておきたい。
Claude Codeの講座では、CLAUDE.mdに開発上の指示やルールをまとめたり、使用するスキルやツールを把握したり、受講者が再現できるように準備したりしています。
ところが、自分自身の個人開発を振り返ってみると、随分と自由なことをしてきたなと思います。
「こんなものを作りたい」
「この機能が欲しい」
「ここはもっと簡単にできないかな?」
思いついたことを、そのまま要件としてAIに伝える。
今から振り返ると、ずいぶん素朴な開発方法です。
しかも、最初の頃は要件の書き方すら分かりませんでした。
自分の頭の中にあるアイデアをChatGPTに投げかけて、要件として整理してもらうところから始めていたのです。
今では、それも一つの大切な過程だったと思っています。
プログラミング言語の文法だけでなく、自分が何を作りたいのかを言葉にすることも、個人開発には必要な技術なのだと感じています。
きっかけは「自分のキャラクターのCDを作りたい」
今回開発したのは、音楽のマスタリングツールです。
きっかけは、2027年2月のAIフェスに向けて、自分のオリジナルキャラクターたちによるAIボーイズラブバンド「Suger Tail」のCDを制作し、イベントで手売りしようと決めたことでした。
私は普段、イラストや動画、音楽など、さまざまなAIコンテンツを制作しています。
自分のキャラクターが歌い、演奏し、その音楽をCDという形にして誰かに届けられる。
考えるだけで楽しい企画です。
ただし、CDを作るとなると、音源をそのまま収録すればよいというわけではありません。
音量や音質を整え、曲ごとの聴こえ方を確認するマスタリングという工程が必要になります。
専門家に依頼する方法もありますが、当然ながら費用がかかります。
それなら、自分で使うためのツールを作ってみよう。
そう考えたのが、今回の開発の始まりでした。
もちろん、プロのマスタリングエンジニアの仕事を完全に再現できるとは思っていません。
それでも、自分の楽曲を少しでも良い音で届けたい。
将来的には音楽配信にも使えるようにしたい。
そんな思いから開発を始めました。
Pythonで作ったマスタリングツール
今回のツールは、Pythonを中心に構築しています。
現在実装している主な機能は、次のとおりです。
- ハイパスフィルター:不要な超低域を除去する
- トーン整理:低域・中域・高域のバランスを調整する
- グルー・コンプレッション:音のまとまりを調整する
- リリース用マスタリング:目標ラウドネスを設定し、ピークを管理する
- 出力形式の指定:CD向けの44.1kHz / 16bit形式などを選択する
- 波形の比較表示:処理前と処理後の音源を視覚的に確認する
- 複数曲の音量揃え:最大6曲の音量を同じ基準に調整する
画面には、それぞれの処理を有効・無効にするチェックボックスと、調整用のスライダーを設けています。
専門的な音響ソフトを使い慣れていなくても、処理の内容が分かるようにしたかったからです。
ツールの内部構成について
今回のマスタリングツールは、3つのファイルを中心に構成しています。
| ファイル | 主な技術 | 役割 |
|---|---|---|
dsp.py |
NumPy / SciPy / SoundFile | 音声解析と各種音声処理 |
server.py |
FastAPI / Uvicorn / Pydantic | ローカルサーバーと処理の進捗管理 |
index.html |
HTML / CSS / JavaScript | 操作画面・波形表示・試聴機能 |
処理の流れは次のようになっています。
ブラウザ(index.html)
↓ ファイルの読み込み・設定
ローカルサーバー(server.py)
↓ 音声処理を呼び出す
音声処理(dsp.py)
├─ サンプルレート変換
├─ ハイパスフィルター
├─ トーン整理
├─ グルー・コンプレッション
├─ ラウドネス調整
├─ リミッター
└─ WAVファイル出力
↓
ローカルサーバー(server.py)
↓
ブラウザで処理前後を比較・試聴
↓
完成したWAVファイルを保存
音声処理、サーバー、画面を分けることで、それぞれの役割を整理しています。
また、ブラウザはローカルサーバーの127.0.0.1:8765に接続し、音声ファイルもパソコン内の一時フォルダで処理します。
外部のクラウドサービスに音源を送信する仕組みにはしていません。
元のファイルを上書きせず、コピーを使って作業する設計にしているのも、自分の大切な音源を扱うために意識したところです。
音声処理は段階的に実行する
音声ファイルを読み込んだ後、設定に応じて必要な処理を順番に実行します。
実際のdsp.pyでは、次のようになっています。
if options.hpf:
y = high_pass(y, new_rate, options.hpf_freq)
if options.tone:
y = tone_shape(
y, new_rate,
options.low_db,
options.mid_db,
options.high_db
)
if options.glue:
y, glue_db = glue_compress(
y, new_rate, options.glue_db
)
if options.release:
y, reduction_db, _ = normalize_loudness(
y, new_rate, options.target_lufs
)
※進捗表示に関するコードは省略しています。
各処理を独立した関数にしているため、必要な機能だけを有効にできます。
例えば、低域の不要な成分を取り除きたいときはハイパスフィルターを使い、音のまとまりを整えたいときはコンプレッサーを使います。
すべての楽曲に同じ設定を強制するのではなく、楽曲に合わせて調整できるようにしました。
LUFSとTrue Peakで音量を管理する
マスタリングでは、単純に音量を大きくすればよいわけではありません。
音楽制作では、ピークを過剰に上げてしまうと音が歪んだり、音の強弱が失われたりする可能性があります。
そこで、今回のツールではLUFSとTrue Peakを測定する仕組みを実装しました。
LUFSは、聴感上の音量を評価するための指標です。
一方、True Peakはサンプル間に発生するピークも考慮した値です。
dsp.pyでは、ITU-R BS.1770-4をもとにしたラウドネス測定処理と、8倍のオーバーサンプリングによるTrue Peak推定を実装しています。
さらに、音圧調整後の音源を再測定し、目標LUFSとの差を確認しながら、最大4回の調整を試みる仕組みにしています。
リミッターの最大減衰量が6.0dBを超えた場合には、音が潰れていないか確認する警告も表示します。
if reduction_db > 6.0:
warnings.append(
f"リミッターが最大 {reduction_db:.1f} dB かかっています。"
"音が潰れていないか確認してください。"
)
この6.0dBという値は、音割れが必ず発生する境界値ではありません。
あくまで、強いリミッター処理が行われたことに気づき、自分の耳で確認するための警告条件です。
CD向けにWAV形式で書き出す
CD用の出力では、44.1kHz / 16bitのWAVファイルを生成します。
また、ビット深度を変換するときの量子化誤差を考慮して、TPDFディザを加えています。
24bitでのWAV出力にも対応しています。
現在は、次のような設定を試しています。
| 項目 | 設定例 |
|---|---|
| ハイパスフィルター | 30Hz |
| 低域・中域・高域 | 各0dB |
| グルー・コンプレッション | 2dB |
| 目標ラウドネス | -10 LUFS |
| True Peakの目標上限 | -1.0 dBTP |
| CD用出力 | 44.1kHz / 16bit |
これらは、すべての楽曲に適した推奨値ではありません。
ジャンルや元の音源によって、調整が必要になります。
なお、現時点での実装が意図した音響品質をすべて満たしているかについては、引き続き検証が必要だと考えています。
複数曲の音量を揃える機能も追加
CDを作るとなると、1曲だけをマスタリングすればよいわけではありません。
複数の曲を続けて再生したときに、突然音量が大きくなったり、小さくなったりするのも気になります。
そこで、最大6曲の音量を揃える機能を追加しました。
この機能では、読み込んだ曲のLUFSの平均値、または任意の指定値を基準にして音量を調整します。
EQやコンプレッサーによる音色調整は行わず、音量とピーク制御を中心に処理します。
処理後の音源は個別にダウンロードできるほか、ZIPファイルにまとめて保存することもできます。
数値だけでなく、自分の耳でも比較する
個人的に大切にしたかったのが、処理前後の音を比較する機能です。
ブラウザのWeb Audio APIを利用し、同じ再生位置で処理前と処理後の音源を切り替えられるようにしました。
さらに、音量差によって処理後の音が良く聴こえてしまうことを避けるため、LUFSの差をもとに大きい方の再生音量を下げ、比較する機能もあります。
マスタリングは、最終的に耳で判断するもの。
数値が整っていても、聴いていて心地よいとは限りません。
幸い、私の息子は音楽大学を卒業しています。
CDとして仕上げる段階では、息子にも聴いてもらい、客観的な耳でチェックしてもらおうと思っています。
こういうところは、家族を巻き込める個人制作のありがたさかもしれません。
趣味で始めた開発が、少しずつ仕事にもつながっている
最近、私の職場には教育実習生の大学生が来ることがあります。
そんなとき、自分で開発したツールの話をすることもあります。
例えば、ここ最近、動作を整えながら開発を続けているものに「いじめSOSツール」があります。
これは、生徒のアンケート回答をもとに、支援が必要と思われる内容や緊急性を分析することを目指したツールです。
もちろん、こうした仕組みはAIの判定だけに頼ってよいものではありません。
実際の運用では、個人情報の保護や誤判定への対応、教員などによる確認が欠かせません。
毎月APIの利用料金が発生しているので、誰かが使ってくださっているのかもしれませんが、それだけで実際の利用状況までは分かりません。
ただ、自分の発想から生まれたものが、誰かの役に立つ可能性があるというのは、やはり嬉しいことです。
とはいえ、最初から社会に役立つツールを作ろうという大きな目標があったわけではありません。
ハッカソンに参加するのも、自分の思いつきをどう形にしたらよいのか、ほかの人からフィードバックをもらいたかったからです。
どこまでも、趣味の延長なのです。
それでも今では、職場で業務時間を短縮するためにPythonのライブラリを活用したり、AI講座を開催したり、委託元への提案書を作成したりしています。
自分で学んできたことを、少しずつ実際の仕事にも生かせるようになりました。
個人開発に必要なのは、最初から完璧な技術力なのだろうか
独学で開発を続けていると、自分より技術力のある人はいくらでもいると感じます。
高度な設計ができる人もいれば、コードをきれいに書ける人もいます。
私自身、まだまだ学ぶことばかりです。
それでも、個人開発を続けてこられたのは、自分の中に「これを作りたい」という理由があったからだと思います。
AIが使えるようになってからは、以前よりもアイデアを形にするまでのハードルが下がりました。
分からないことを相談し、要件を整理し、試しに実装して、動かなければ修正する。
そうした試行錯誤を繰り返しているうちに、少しずつ自分で判断できることも増えてきました。
AIがコードを書いてくれるからといって、何も考えなくてよいわけではありません。
どんな機能が必要なのか。
その動作は正しいのか。
誰がどんな場面で使うのか。
そして、そのツールで本当に自分の目的を達成できるのか。
最終的に考えるのは、自分自身です。
11月。次は何を作ろうか
気がつけば11月。
2026年も、あと2か月で終わります。
ここからは、来年のAIイベントに向けて、自分のわがままを聞いてくれるツール開発にのめり込むのか。
それとも、最近覚えたゲーム開発の世界に、さらに足を踏み入れるのか。
今のところ、自分でも分かりません。
ただ、一つだけ確かなことがあります。
独学だからこそ、好きでなければ続かない。
必要に迫られて作ったものもあれば、単なる思いつきから生まれたものもあります。
今回のマスタリングツールも、突き詰めれば「自分のキャラクターのCDを作りたい」という気持ちから始まりました。
立派な開発計画があったわけではありません。
誰かに依頼されたわけでもありません。
ただ、やってみたかったのです。
そして、そんな小さな動機からでも、一つのツールは生まれます。
私は今年も、そしてたぶん来年も、好きなことをもっと手軽に、もっと自由に楽しむために開発を続けるのだと思います。
それが、私にとっての個人開発です。
おわりに
個人開発を始めたいけれど、何を作ればいいか分からないという人がいたら、私は「自分が欲しいものを作ってみる」ことをおすすめしたいです。
大きなサービスである必要も、最初から完成度の高いものである必要もありません。
自分が面倒だと思っている作業を簡単にする。
好きな趣味のために、小さな道具を作る。
そのくらいの動機でも、開発を始める理由としては十分なのだと思います。
私自身、これからも失敗したり、作り直したりしながら、好きなものを形にしていくつもりです。
