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
Youtube Lofier - Chrome拡張開発
Search
Nini
April 13, 2025
Programming
4.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Youtube Lofier - Chrome拡張開発
https://github.com/NikoSanko/YoutubeLofier
Nini
April 13, 2025
Other Decks in Programming
See All in Programming
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
120
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
500
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
560
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.5k
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.9k
速習iPhone Duo対応
yuukiw00w
2
970
Simple Storage Service(S3) is not simple
iwatsukayura
0
220
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
320
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.1k
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
190
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
110
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
190
Featured
See All Featured
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
260
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
400
ラッコキーワード サービス紹介資料
rakko
1
5.2M
The Cult of Friendly URLs
andyhume
79
7k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
What's in a price? How to price your products and services
michaelherold
247
13k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
510
The Invisible Side of Design
smashingmag
301
52k
How to Ace a Technical Interview
jacobian
280
24k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
37k
Transcript
Youtube Lofier(Chrome 拡張) 開発合宿 2025/04/11~12
目次 1. 実装したいもの 2. 使用技術 3. 仕組み 4. 終わりに
1. 実装したいもの Youtube/Youtube Music で聴く音楽を Lo-Fi(※) に加工したいので、元音源を加工して出 力する Chrome 拡張を作りたい
※音を歪ませたり、割ったりするなどして、音質を意図的に劣化させた音楽ジャンル
2. 使用技術 - JavaScript - HTML / CSS - Web
Audio API
3. 仕組み (Chrome拡張について) ユーザーが操作するポップアップウィンドウから メッセージがコンテンツスクリプト (content.js)に送信され、 Webページ上でコンテンツスクリプトが実行される ┌ manifest.json ├
content/ | └ content.js ├ popup/ | ├ popup.html | ├ popup.css | └ popup.js └ images/ └ 各種画像ファイル ボタン押下等をトリガーに Webペー ジにメッセージ送信 参考: https://developer.chrome.com/docs/extensions/develop?hl=ja
3. 仕組み (音声処理について) 音声の加工には Web Audio API は用いる。 Web Audio
API は音源やエフェクトをノードとして繋ぎ合わせることで音声処理を行う。 参考: https://developer.mozilla.org/ja/docs/Web/API/Web_Audio_API 元音源 エフェクター ・・・ エフェクター システム出力
3. 仕組み (音声処理について) 音声プログラミングの前提知識 音は波であり、音声データは波形をサンプリングレート数で区切った非連続な波形デー タとして表現される サンプリングレート数を 44100 とした場合、 1/44100
秒ごとの振幅(※) を保存した配列で表現できる ※音の大きさ。short int 型で表されることが多く、その場合 -32768 〜 32767 の範囲で表される
3. 仕組み (音声処理について) 今回主に使用したエフェクトは次の3つ 1. EQ 2. Compressor 3. Saturator
3. 仕組み (音声処理について - EQ) EQ は音の帯域を操作するエフェクターであり、高い音、低い音などを増減させることが できる 本来、波形データを帯域ごとに分けるには高速フーリエ展開をして、周波数分布を算出 する必要があるが、Web
Audio API には帯域処理をするメソッドとして BiquadFilterNode が用意されているのでこれを利用する 参考: https://developer.mozilla.org/en-US/docs/Web/API/BiquadFilterNode
3. 仕組み (音声処理について - EQ) 写真は実際に楽曲制作等で使用されるEQの画面イメージであり、 丸で囲った部分が処理を施している帯域であり、これをコードで再現する
3. 仕組み (音声処理について - EQ) EQノードを追加するメソッドを下記のように定義 https://github.com/NikoSanko/YoutubeLofier/blob/f86d73a30338b3e1f1889477aabd2f65648269c7/content/content.js#L94-L103
3. 仕組み (音声処理について - EQ) 前述のメソッドに下記パラメータを渡せば、写真の丸で囲われた部分と同じ処理をする ノードを追加できる { type: EQ_TYPE.LOWPASS,
frequency: 18000, q: 48, gain: null, mixRatio: 1 }
3. 仕組み (音声処理について - Compressor) Compressor は音の大きさを操作するエフェクターであり、指定した閾値(スレッショルド) を入力音声が超えた場合に指定比率(レシオ)に基づいて超過した音を小さくする Web Audio
API には Compressor として DynamicsCompressorNode が用意されて いるのでこれを利用する 参考: https://developer.mozilla.org/en-US/docs/Web/API/DynamicsCompressorNode
3. 仕組み (音声処理について - Compressor) 写真は実際に楽曲制作等で使用されるCompressorの画面イメージであり、 標準的な Compressor で制御できる下記パラメータをコードで再現する ・Threshold:
閾値 ・Ratio: 圧縮率 ・knee: コンプのかかり具合 ・Attack: 閾値を超えてから圧縮を かけ切るまでにかける時間 ・Release: 閾値を下回ってから圧縮を 戻すまでにかける時間
3. 仕組み (音声処理について - Compressor) Compressorノードを追加するメソッドを下記のように定義 https://github.com/NikoSanko/YoutubeLofier/blob/f86d73a30338b3e1f1889477aabd2f65648269c7/content/content.js#L105-L115
3. 仕組み (音声処理について -Compressor) 前述のメソッドに下記パラメータを渡せば、写真と同じ処理をするノードを追加できる { threshold: -10, knee: 3,
ratio: 3, attack: 0.001, release: 0.1, mixRatio: 1 }
3. 仕組み (音声処理について - Saturator) Saturator は音を歪ませるエフェクターであり、倍音を付与して音に温かみを持たせた り、ヘッドルームを作り出すことができる。 Web Audio
API にはカーブを指定することで波形の整形をして音を歪ませることができ る WaveShaperNode があるのでこれを利用する。波形を整形するためのカーブは別 で生成する必要がある。 参考: https://developer.mozilla.org/en-US/docs/Web/API/WaveShaperNode
3. 仕組み (音声処理について - Saturator) Saturator の詳しい仕組みについては込み入った話になるので、割愛する 下記は分かりやすく説明しているので、もし興味があればそちらをご覧ください https://korilakkuma.github.io/Web-Music-Documentation/#section-effectors-distortion
3. 仕組み (音声処理について - Saturator) 波形の整形のためのカーブ生成関数は下記のように定義 https://github.com/NikoSanko/YoutubeLofier/blob/f86d73a30338b3e1f1889477aabd2f65648269c7/content/content.js#L253-L262
3. 仕組み (音声処理について - Saturator) 前述の関数の amount パラメータに 5 を指定した場合のカーブは写真のようになる
4. 終わりに Chrome 拡張なので Youtube/Youtube Music に限らず、<audio><video>タグで音声を 出力しているなら基本的に本拡張は機能するはずだが、Spotify や SoundCloud
など他 のストリーミングサービスで本拡張は機能しなかった。軽く調べただけなのだが、どうやら Spotify は Spotify の Web API を利用しなければ音声を取得できないようだったため、本 拡張のサポート範囲は Youtube/Youtube Music に絞ることにした。