3 ポイント 投稿者 GN⁺ 2024-08-02 | 1件のコメント | WhatsAppで共有
  • SeekTuneは、Shazamの楽曲認識アルゴリズムを実装したプロジェクトで、SpotifyとYouTube APIを統合して楽曲の検索とダウンロードを可能にする
  • 実行にはGolang、FFmpeg、NPM、YT-DLPが必要で、Docker Composeまたはネイティブ環境でサーバーとクライアントを起動できる
  • Spotify連携は、開発者アプリのClient IDClient Secretserver/.envに設定する方式で、アプリが必要なアクセストークンを自動取得してキャッシュする
  • デフォルトのデータベースはSQLiteで、環境変数にDB_TYPE=mongoを指定するとMongoDBを利用でき、ユーザー名・パスワードがない場合はmongodb://localhost:27017に接続する
  • CLIはSpotifyリンクのダウンロード、ローカル音声の保存、録音ファイルのマッチング、指紋と楽曲の削除をサポートし、YouTube IDのない保存項目はフロントエンドでマッチ結果として表示されない

プロジェクト概要

  • SeekTuneは、Shazamの楽曲認識アルゴリズムを実装したアプリケーション
  • 実装はREADMEのリソースセクションにある資料をもとにしている
  • SpotifyとYouTube APIを統合して楽曲を見つけてダウンロードできる
  • デモと制作過程のリンクが提供されている

インストールと実行方法

  • 必要なツールはGolang、FFmpeg、NPM、YT-DLP

  • リポジトリのクローンコマンドは次のとおり

    git clone https://github.com/cgzirim/seek-tune.git
    cd seek-tune
    
  • Spotify API設定

    • Spotifyアプリを作成し、Client IDClient Secretを取得する必要がある
    • serverディレクトリに.envファイルを作成し、次の値を設定する
    SPOTIFY_CLIENT_ID=your-client-id
    SPOTIFY_CLIENT_SECRET=your-client-secret
    
    • アプリは必要なアクセストークンを自動的に取得してキャッシュする
  • Dockerでの実行

    • DockerとDocker Composeが必要
    • ビルドと実行は次のコマンドで行う
    docker-compose up --build
    
    • 実行後、アプリにはhttp://localhost:8080でアクセスできる
    • 停止には次のコマンドを使用する
    docker-compose down
    
  • ネイティブ実行

    • バックエンド依存関係のインストール
    cd server
    go get ./...
    
    • クライアント依存関係のインストール
    cd client
    npm install
    

CLIの使い方

  • クライアントアプリはclientディレクトリで実行する
    npm start
    
  • バックエンドは別ターミナルで実行する
    cd server
    go run *.go serve [-proto <http|https> (default: http)] [-port <port number> (default: 5000)]
    
  • Spotifyリンクから楽曲をダウンロードできる
    go run *.go download <https://open.spotify.com/.../...>;
    
    • Spotifyモバイルアプリでコピーしたリンクは動作しない
    • デスクトップまたはWebアプリでコピーしたリンクを使用できる
  • ローカルの楽曲ファイルやディレクトリをデータベースに保存でき、すべての音声形式をサポートする
    go run *.go save [-f|--force] <path_to_song_file_or_dir_of_songs>
    
    • -fまたは--forceは、YouTube IDが見つからなくても楽曲を保存する
    • YouTube IDがないと、フロントエンドはマッチ結果を表示しない
  • 楽曲や録音ファイルのマッチを検索できる
    go run *.go find <path-to-wav-file>
    
  • 指紋と楽曲の削除をサポートする
    go run *.go erase
    go run *.go erase db
    go run *.go erase all
    
    • デフォルトではデータベースのみ削除する
    • erase allはデータベースと楽曲ファイルを一緒に削除する
  • *.goが動作しない場合は./...を使用できる

出力例

  • ダウンロード例では、Spotifyのトラック情報を取得した後、トラックをダウンロードして指紋を保存する
    $ go run *.go download https://open.spotify.com/track/4pqwGuGu34g8KtfN8LDGZm/…
    Getting track info...
    Now, downloading track...
    Fingerprints saved in MongoDB successfully
    'Voilà' by 'André Rieu' was downloaded
    Total tracks downloaded: 1
    
  • マッチング例では、Voilà - André Rieu.wavに対して上位20件のマッチと最終予測を出力する
    • 最上位の結果はVoilà by André Rieuで、スコアは5390686.00
    • 検索時間は856.386557msと表示される
    • 最終予測もVoilà by André Rieuと表示される

データベースの選択

  • デフォルトのデータベースはSQLite
  • MongoDBを使うには、MongoDBをインストールして接続用環境変数を設定する
    • DB_TYPE: MongoDBを使うため"mongo"に設定
    • DB_USER: MongoDBユーザー名
    • DB_PASS: MongoDBパスワード
    • DB_NAME: 使用するMongoDBデータベース名
    • DB_HOST: MongoDBサーバーのホスト名またはIPアドレス
    • DB_PORT: MongoDBサーバーのポート番号
  • データベース接続URIは環境変数から構成される
  • DB_USERまたはDB_PASSがない場合、デフォルトでmongodb://localhost:27017に接続する

参考資料とライセンス

1件のコメント

 
GN⁺ 2024-08-02
Hacker News のコメント
  • Shazam 技術の一部はスタンフォード大学キャンパスの CCRMA から生まれたもので、ここは初期のコンピューター史とも深く結びついた特別な場所だ。
    初期のコンピューター技術の応用に、オーディオ関連のものがやけに多いのは興味深い。John Bardeen のミュージックボックス、トランジスタ初の商用応用だった補聴器、Palo Alto の HP ガレージで作られていたオーディオ発振器、iPod から続く iPhone、アナログ電話回線を運んでいた銅線の上に築かれたインターネット、Bell Labs まで、例は次々に続く。
    もしかすると人間は、まず kHz 帯域の扱い方を覚えてから MHz/GHz 帯域へ進む、という仮説もかなり魅力的に聞こえる。

    • オーディオは電子的に扱うのが比較的簡単だからだと思う。
      オーディオ信号は比較的簡単に電気信号へ変換できるが、グラフィックスは画面に表示するところからずっと複雑だ。電気信号を音波に変えるスピーカーも、核となる構造だけ見れば非常に単純な装置だ。
      それにオーディオは人に強い印象を与えるので、電子工学やコンピューターの力を見せるなら、自分でもオーディオを選んだと思う。
    • かなり無理やり結びつけた解釈に見える。
  • これが Shazam の本当の再現なら、少なくとも 2025年3月までは Apple の特許下にある可能性がある: https://patents.google.com/patent/US7627477

    • Shazam がアルゴリズムを説明した論文 “An Industrial-Strength Audio Search Algorithm”(https://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf) には明確な出版日がないが、https://www.researchgate.net/publication/220723446_An_Industrial_Strength_Audio_Search_Algorithm を見ると 2003年の論文のようだ。
      その特許は米国で 2004-10-21 に出願されている。法律の専門家ではないが、米国ではこの特許に不利な根拠になり得るように見える。
    • 10年ほど前、HN で Shazam がアルゴリズム公開を法的に脅して、人気記事やソースが取り下げられたことがあったと記憶している。
      おそらく元記事にある Google Drive の PDF キャプチャがその資料だったのだと思う。
    • 核心は、オーディオ信号の高速フーリエ変換から簡単なフィンガープリントを作り、単純なインデックスと単純な類似度検索を行う構造だ。
      ただしこの方式が機能するには、地球上のあらゆる音楽の署名が必要になる ;)
    • つまり米国外では執行しにくいということだね。
    • つまり今のうちにリポジトリをクローンしておけ、ということか。
  • Shazam 共同創業者の Avery Wang が DAFx17 で行った発表が良かった。
    アルゴリズムの理論的背景を少し扱い、背景ノイズのような実際の問題も見ている: https://www.youtube.com/watch?v=YVTnj3OIhwI

    • これは視聴リストに追加した。この論文を読んだときは、コンピューティングのアルゴリズムで初めておおっと思った瞬間の一つだった。
  • 最近 Shazam の精度が落ちたように思うし、むしろ SoundHound のほうが良い結果を返す。
    Shazam ではアジア圏の音楽伝統に属する結果が多く出るが、それ自体は良いとして、問題は曲が間違っていることだ。選択対象の音楽範囲を広げたのならアルゴリズムも改善すべきだろうし、今はハッシュテーブルの衝突が増えている感じがする。
    参考: https://github.com/cgzirim/not-shazam/…

    • SoundHound はいつも Shazam より優れていた。人が歌っている曲や、かなり静かな曲も拾える。
    • 2021年8月に Shazam、SoundHound、BeatFind の音楽認識ライブラリを比較してみた。
      結論としては、BeatFind と Shazam が最も多くの曲を知っていたが、互いに補完的な面もあり、すべてのサービスがそれぞれ自分だけが認識した曲を少なくとも1曲は持っていた。
      テストには複数のジャンルと知名度のレベルの曲を混ぜたが、サンプル数がもっと大きければなお良かったと思う。また、人の話し声のようなノイズや、壁越しに聞こえるフィルタリングされた音楽はテストしていない。
      面白いことに “Night Driver” は “1 Shazams” と表示されたので、おそらく自分が最初に Shazam した人だったようで、“THEY'RE TAKING THE HOBBITS TO ISENGARD!” はホビットをどこへ連れていくのかは皆知っているのに、サービスはどれも認識できなかった。
  • プロジェクトは書いたり直したりしやすそうには見えるが、個人的にはまだ公開するには少し早いと思う
    実行方法の案内が不正確に見えるし、MongoDB が必要なのに接続・使い方の説明が抜けている。できれば DB を差し替え可能にし、sqlite のような負担の少ない選択肢を提供したほうがよい
    MongoDB を置き換えられないなら、Dockerfile と docker composeを用意して、簡単に実行・テストできるようにするべき。クライアント側の npm install で重大な脆弱性が 8 件出るのだが、実際には問題ではない可能性があるとしても、テストを続けるのをためらってしまう
    特許や著作権を気にしないとしても、名前は変えたほうがよい。GitHub 自体が米国にあるので、DMCA が来ればプロジェクトを下げられる可能性がある
    最後に、WAV ファイルから曲を追加する機能もあるとよい。テストしたい音声がすべて Spotify や YouTube にあるわけではない
    落ち込ませるつもりではなく、こうした細かな仕上げが足りないと、人々はプロジェクトを無視したり低く評価したりしがちだということ。時間があれば PR を送るかもしれないし、音楽以外の領域で音声マッチングを実験したいので、このプロジェクトがいちばん修正しやすそうに見える

    • プロジェクトに仕上げ作業がもっと必要だという点には同意する
      設定ガイドを改善し、柔軟性のためにファイルベースの DB を追加する案と、npm の脆弱性解消を優先するつもり。WAV ファイルを直接フィンガープリント化する機能も良いアイデアなので、優先的に見る
      プロジェクト名の法的リスクも理解しており、変更する予定。良い名前の提案があれば受け付けたい
    • こういう貴重なフィードバックを得るために HN に投稿している。よくまとまっている
  • リポジトリはまだ詳しく見ていないが、検索対象になるデータがどこから来るのかが気になる
    ライブラリをロードするのか、それともどこかで確保した大規模ライブラリを検索するのかが気になる

    • データはサーバーに接続されたフィンガープリントデータベースから来る。曲が追加されるたびに、このようなフィンガープリントが作られる
  • こういうものをぜひ作ってみたいというバケットリストがあったので、本当に素晴らしい

    • インスピレーションになったならうれしい。クローンしてさらに発展させてもよい
  • フィンガープリントをコミュニティベースで共有する方法があると、かなり良さそう

    • 音声だけでなく、画像や動画クリップにもそういう方式があるとよい
      記憶では BitTorrent は分散ハッシュテーブルを使うが、ハッシュはコンテンツ全体に基づくので、出典表記がめちゃくちゃな派生作品のオリジナルを探す用途にはあまり役に立たない
      画像のオリジナル探しには Tineye がたまに使える
    • MusicBrainz がこれをサポートしているようだ: https://musicbrainz.org/doc/AcoustID
  • Spotify の曲を入れるなら、結果も Spotify の曲として出すほうが自然ではないか?

    • 実際その通り。ただし Spotify は直接ダウンロードを許可していないので、YouTube で曲を探してダウンロードする必要があった
  • Google のスマートフォンには内蔵の音楽認識機能があり、この分野で最もよく実装されているものだと聞いた
    どのようなアプローチを使っているのか知っている人がいるか気になる。別件だが、SoundHound は Shazam より優れているといつも感じていた

    • 記憶では、音楽が再生中のときだけ起動させる小さなアルゴリズムかハードウェアの一部があったと思う
      そのためスマートフォンが常にアクティブである必要はなく、その後は何らかの既存の検出アルゴリズムを使えばよかったのだと思う。自分にはその超低消費電力の段階が魔法のように感じられたが、詳細を読んだことはない