Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
AI駆動で「他アプリの音を加工できる」アプリを作った
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Masahiro
October 16, 2026
Technology
100
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
AI駆動で「他アプリの音を加工できる」アプリを作った
AI駆動開発勉強会 遠州支部 #2 LT 2026/10/16
EffectDeck
https://github.com/satomasahiro2005/EffectDeck
Masahiro
October 16, 2026
More Decks by Masahiro
See All by Masahiro
EffectDeck_KC3_2026.pdf
satomasahiro2005
0
290
part2_slides_public.pdf
satomasahiro2005
0
49
ws
satomasahiro2005
0
48
Other Decks in Technology
See All in Technology
⾮構造化データを価値に変える AI エージェント基盤とその組織
ivry_presentationmaterials
0
180
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
130
DGX Spark でどこまでハッキングができるのか?
kash1064
3
1.3k
継続的なAIコスト最適化
bgpat
1
320
Active Record Connection Adaptersにおける長年の課題に再び取り組む
yahonda
0
130
分析の民主化を支えるメタデータ整備の実践
kakehashi
PRO
4
1.4k
NDIでApple Vision Proにリアルタイム映像送信
jyouryuusui
0
120
パッチ更新でterraform initが落ちた日
grimoh
1
140
実践!Cloud Run ハンズオン!! / Cloud Run handson
y0hgi
2
270
PagerDuty Tech Hub-鳴らすけれど、人は動かない
ezaki
0
150
USB PDを使ってスマホを労わりたい
raspython3
0
170
DevelopersIO 2026 知識の地図を描く ─ オントロジーとは何か?
ishikawa_satoru
1
1.6k
Featured
See All Featured
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
260
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
540
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
560
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
730
Why Our Code Smells
bkeepers
PRO
340
58k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
360
Ethics towards AI in product and experience design
skipperchong
2
430
Color Theory Basics | Prateek | Gurzu
gurzu
1
490
Designing for humans not robots
tammielis
254
26k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Transcript
AI駆動で 「他アプリの音を加工できる」 アプリを作った iOS 27公開当日 EffectDeck nemut_ai AI駆動開発勉強会 遠州支部 #2
自己紹介 佐藤昌浩 nemut.ai Twitter @ainemut GitHub satomasahiro2005 2
加工再生を手軽にしたかった 他のアプリの音を通すには 仮想オーディオケーブルの 設定が必要 スマホのブラウザ版は 他のアプリの音を 処理できない PCのEffeTune Frieve-A作 MIT
3 EffeTuneのDSPを iPhoneで動かす
PCでEffeTuneを使い始めるまで 4 1 VB-CABLEを管理者で入れて再起動 2 既定の出力がCABLE Inputに変わったらスピーカーかDACに戻す 3 音量ミキサーでSpotify.exeの出力をCABLE Inputに
macOSはSoundSource 4 EffeTuneのAudio Configuration 入力CABLE Output 出力DAC 96kHz 5 Spotifyを鳴らしたままON/OFFを切り替えて音が変わるか確かめる 任意 折り返しノイズが出たらCABLEの形式とInternal Sample Rateを96000Hzに 出典: Frieve-A/effetune docs/faq.md 1 Initial Setup for Streaming
最初の設定と聞くときの手間 PC+EffeTune 最初の設定 VB-CABLEを入れる iPhone+EffectDeck 7 手順 最初の設定 EffectDeckを入れる 1
再起動 既定の出力をスピーカーかDACに戻す Spotify.exeの出力をCABLE Inputへ EffeTuneの入力をCABLE Outputへ EffeTuneの出力をDACへ 96kHzを選ぶ 聞くとき EffeTuneを開く 再生する 5 出典: Frieve-A/effetune docs/faq.md 1 / EffectDeck site/src/guide.js 聞くとき 再生する コントロールセンターでEffectDeckを選ぶ 手順
iOS 26以前は脱獄なしで他のアプリの音を 置き換えられない iPhone 他のアプリ 他のアプリ 内蔵スピーカー 内蔵スピーカー イヤホン イヤホン
画面収録で写す 画面収録で写す 元の再生を止めて受け取る 元の再生を止めて受け取る 元の音は止まらない 元の音は止まらない com.apple.coreaudio.app-tap entitlement 取れない entitlement 取れない E ectDeck E ectDeck 6
iOS 27で使える2つの方法を比べた ScreenCaptureKit Media Device Extension 本体アプリでは起動しない -3801 コントロールセンターで出力先に選ぶ entitlementの無い別アプリなら取り込める
元の再生が拡張へ移る 原音と加工した音が二重に鳴る 7 加工した音だけが鳴る
外の再生機器向けの拡張をiPhone自身の 出力先にした 本来の使い方 本来の使い方 iPhone 出力先に選 出力先に選 MediaDevice MediaDevice Extension
Extension 他のアプリ 他のアプリ TCP 127.0.0.1:47101 E ectDeck E ectDeck E eTuneのDSP E eTuneのDSP 8 外の再生機器 外の再生機器 内蔵スピーカー 内蔵スピーカー イヤホン イヤホン
コントロールセンターで選ぶだけ → 9
実装はClaude Codeに任せた 何を作るか決める 実機で確かめる 人 動いた 動いた 動かない 動かない 実装
Claude Code Macで フレームワークを逆アセン MediaExperience 10 ル ルド App Storeへ提出 実機ロ を読む
9/16にAltStore PALで配信を始めた 1日20時間 9/17 22:44 App Store 2026.09.17 9/15 02:00
iOS 27公開 9/15 20:57 e2e0e85 9/16 22:07 ddb6eba 最初のコミット 9/16 03:45 b6a15a8 アプリを1本に 9/15 11 12コミット 9/16 AltStore PAL 2.9.0 build 10 34コミット 9/17 App Storeの審査 App Storeの審査 73コミット
公式のコード例どおりでは拡張が起動しない 公式のコード例 <key>com.apple.developer. media-device-extension</key> <string>…</string> 拡張が起動しない 要素1個の配列 <key>com.apple.developer. media-device-extension</key> <array>
<string>…</string> </array> 拡張が起動する 12
動くようになったのに配信できない 9/16 04:00 App Store Connectから アップロードした ビルドの検証エラー ITMS-91183 Missing
entitlement 拡張を入れたアプリは 本体にも media-device-extension の権限が要る 13
逆アセンブルで1アプリ構成を実現 MediaExperience -[MXCoreSession hasMediaDeviceEntitlement] 見るのは本体アプリの署名entitlementただ1つ 2本 9/15 e2e0e85 拡張を運ぶ Bridge
鳴らす Live 1本 9/16 b6a15a8 受け取って鳴らす EffeTuneLive media-device-extension 拡張 media-device-extension '!pla' 14 TCP 拡張 media-device-extension TCP
レベルが567.9dBまで上がり続けた 15 正常 -0.5dB 異常 567.9dB
出力先の選択ボタンを置くだけで音が ループする 出力 9/16 02:14 3f1e56c RoutePicker.swift AVRoutePickerView -import AVKit
自分の入力 float32 のまま回る TCP 16 -struct RoutePicker: UIViewRepresentable { ドライバ - let v = AVRoutePickerView() +struct RoutePicker: View { + var body: some View { EmptyView() } AVRoutePickerViewを外して解決
31日で153億トークン 153 億 トークン 19 2,282 17 日 セッション cache読み込み97.8%
API従量課金に換算 31 回の指示 それ以外 8,423 ドル ≒ 133 3.4億 万円
人だけで作った場合との比較 工数 実際 1 × 31 会社で作る 289 1人+Claude Code
推定 18 費用 人だけで95,817行 人 日 ≒1人月 人月 21.5か月 平均13.4人 約 220 2.26 ドル 税込 ≒3.5万円 億円 78.4万円/人月
日ごとのコミット数とモデル main 662コミット Opus 5 全28 ランチとタ 739コミット Opus 5.5
73 73 72 72 Claudeのモデル名が 622 Opus系 分かるコミット 653 件のうち 95.3 % Opus が 系 622 ÷ 653 Sonnet系31 Codex系35 9/15 19 9/22 9/29 10/6 10/13 未記録51
大規模CIの構築 CI Linuxとmacの試験 ASan UBSan TSan Fuzz 生成物のずれ DSP 上流のDSPの試験
毎晩の長いFuzz CodeQL C/C++とActionsの Canary 静的解析 最新のXcodeベータで 毎日ビルド Release ASC ops TestFlight Badges 署名 出荷物の検査 App Storeへ提出 プロファイルの 作り直し TestFlight審査へ 既存ビルドを 内部グループへ ダウンロード数と評価 9/28〜10/16の実行 20 314 回 READMEの
AIが何度もやった失敗 不要なUI説明を増やし続けた ログを取り違えて件数を誤って報告した 配布用IPAだけ7種類のエフェクトが動かなかった 直したドロップが何度も再発した
今の設定画面 22
9/17の設定画面 23
AIが不要なUI説明を増やし続けた Sourcesの Sources の footer:の数 の数 説明文を減らす指示 説明文を減らす指示 15 15
13 13 02:46 → 02:46 → 02:54 02:54 10 10 3cb7da7 99 説明文を 52か所削除 44 66 088e891 Statusの説明を戻す 9/17 9/17 24 9/19 9/19 9/21 9/21 9/23 9/23 9/25 9/25 9/27 9/27 10/15 10/15
ログを読み違えて件数を誤った ビルドのエラー 9/20 確かめたもの 確かめたもの build-run.log 0 run.shが拾った最後の組 2 件
実際 2 試験の件数 9/28 xcodebuild build.log BandFIRPEQDesigner.magnitudeが無い 件 ExternalProcessorViewにnodeが無い 件 実際 682 Executed 682 tests, with 1 test skipped and … 件 4d0fa78 9/20 22:20 FiveBandFIRPEQView.swift fe0b3b9 9/28 12:39 Tests/Linux/run.sh - BandFIRPEQDesigner.magnitude(of: band, at: hz, - … with [0-9]+ failures?" + BandFIRPEQCore.magnitude(of: band, at: hz, + … with ([0-9]+ tests? skipped and )?[0-9]+ failures?" 25
配布用IPAで7種類のエフェクトが動かなかった dlsym(UnsafeMutableRawPointer(bitPattern: -2), "et_instance_asset_begin_ptr") strip 配布用IPA Debugと plain build App
Store シンボル消失 0件 Releaseで nmで シンボル表を消す asset_begin stripしない シンボルが残る 2026.09.17 9/17 22:44 2026.09.18 9/18 15:11 dlsym失敗 名前で探して NULLが返る 見つかる 2026.09.19 2026.09.20 9/18 22:01 9/20 02:43 5日 26 AssetUpload.swift 7 種類が動かない IR Reverb FIR Crossover 5Band FIR PEQ Group Delay EQ Group Delay PEQ Room EQ Crosstalk Cancellation 動く 直す前のコードでも TestFlight build 23 364f940 9/22 09:23 9/21
Releaseバイナリを自動で検査する Scripts/check_release_binary.sh 9/27 4216323 試験36件 strip lookup abiname plist entitle
debugonly test_364f940_replay_red_then_green 364f940の前 exit 1 FAIL 2 364f940の後 exit 0 FAIL 0 FAIL lookup Sources/EffeTuneLive/DSP/AssetUpload.swift:10 dlsym("et_instance_asset_begin_ptr") → EffectDeck: export されていない FAIL abiname EffectDeck: 自前の口の名前 "et_instance_asset_begin_ptr" が字として入っているのに export されていない PASS PASS lookup 名前で引く口はソースに無い(5 本を読んだ) abiname 自前の C の口の名前(3 個)はどの実行ファイルにも字として入っていない test_unstripped_binary_fails_unless_allowed stripしていない本体 exit 1 FAIL EffectDeck: ローカルシンボル 500 個 strip されていない(plain build か Debug) FAIL 1 配布用IPAにも掛ける release.yml 27 strip bd5a49d 10/3
修正済みのバグが何度も再発 帯を置く 帯を置く 入らない 入らない 当たりと高さ 当たりと高さ 空の鎖 空の鎖 入らない
入らない 脇と間 脇と間 消えた行 消えた行 2列の左 2列の左 07:19 07:19 23:29 23:29 00:49 00:49 11:11 11:11 22:49 22:49 23:41 23:41 23:51 23:51 01:49 01:49 9/17 9/17 9/20 9/20 42859d4 e7d7dfa 末尾の帯にドロップしても入らない 末尾の帯にドロップしても入らない Color.clearは当たりを取らない 帯が在ってもドロップを受けない e7d7dfa 9/21 00:49 Color.clear .frame(height: 96) + + 28 .frame(height: tailHeight) .contentShape(Rectangle()) 95966e4 9/21 9/21 カードを消すと末尾の帯 カードを消すと末尾の帯 消えた行の高さ 10/5 10/5 d253e5e 効かない 効かない 合計に残る 帯 = 器 − 行の高さの合計 帯が最小の96ptに縮む 5045ce0 10/5 23:51 } action: { measured(row.node.id, $0) } + .onDisappear { unmeasured(row.node.id) } 5045ce0 80c05b8 10/8 10/8
XCUITestでドロップを点ごとに自動で試す DropProbe Volume Tests/UI/DropProbe.swift Tone Control XCUITest 2列 iPad 12点
1列 iPhoneの幅 10点 10/5 d253e5e 10/8 80c05b8 長押し1.2秒 Volume Output Correction miniCorrection leftFar gap Tone Control leftPad card miniTail tail 2列の左の一覧 2列の左の一覧 鎖の列 鎖の列 点まで運ぶ rightFar 1.0秒留めて放す rightPad emptySide No e ects emptyText emptyBelow 鎖 鎖 空 空 電源の数が増えたか XCTAssertGreaterThan(after, before) 修正前のmain 10/5 2列 修正後 10/5 2列 DROPPROBE wide leftFar FAIL point=(294,380) before=2 after=2 DROPPROBE wide rightFar PASS point=(998,380) before=2 after=4 DROPPROBE wide leftPad FAIL point=(317,380) before=2 after=2 DROPPROBE wide rightPad FAIL point=(975,380) before=2 after=2 DROPPROBE wide rightFar FAIL point=(998,380) before=2 after=2 DROPPROBE wide gap FAIL point=(646,343) before=2 after=2 DROPPROBE wide tail PASS point=(646,1296) before=2 after=4 DROPPROBE wide card PASS point=(646,380) before=2 after=4 29 DROPPROBE wide leftPad PASS point=(317,380) before=2 after=4 DROPPROBE wide gap PASS point=(646,343) before=2 after=4 DROPPROBE wide tail PASS point=(646,1296) before=2 after=4 DROPPROBE wide card PASS point=(646,380) before=2 after=4 DROPPROBE wide emptyText PASS point=(646,239) before=0 after=2 ** TEST SUCCEEDED **
この発表資料もAI駆動で作った Claude セッションと コミットを調べる 30 → Workflows デザイナー役が 数枚ずつ作る →
ChatGPTと 本人 1ページずつ 見直す → この資料 marp-nemutai
まとめ・謝辞 AIは実装できても正しく検証できるとは限らない 繰り返す不具合は自動テストで検証できる形にする AIによって未経験の技術領域にも踏み込める EffeTuneの作者 Frieve-Aさん TestFlightとDiscordで試してくれた皆さん 31 EffectDeck