SoundFingerprinting 10.0.0

dotnet add package SoundFingerprinting --version 10.0.0
NuGet\Install-Package SoundFingerprinting -Version 10.0.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="SoundFingerprinting" Version="10.0.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add SoundFingerprinting --version 10.0.0
#r "nuget: SoundFingerprinting, 10.0.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install SoundFingerprinting as a Cake Addin
#addin nuget:?package=SoundFingerprinting&version=10.0.0

// Install SoundFingerprinting as a Cake Tool
#tool nuget:?package=SoundFingerprinting&version=10.0.0

Audio/Video fingerprinting and recognition in .NET

Join the chat at https://gitter.im/soundfingerprinting/Lobby .NET Core MIT License NuGet

soundfingerprinting is a C# framework designed for companies, enthusiasts, researchers in the fields of digital signal processing, data mining and audio/video recognition. It implements an efficient algorithm which provides fast insert and retrieval of acoustic and video fingerprints with high precision and recall rate.

Documentation

Full documentation is available on the Wiki page.

Below code snippet shows how to extract acoustic fingerprints from an audio file and later use them as identifiers to recognize unknown audio query. These fingerprints will be stored in a configurable datastore.

private readonly IModelService modelService = new InMemoryModelService(); // store fingerprints in RAM
private readonly IAudioService audioService = new SoundFingerprintingAudioService(); // default audio library

public async Task StoreForLaterRetrieval(string file)
{
    var track = new TrackInfo("GBBKS1200164", "Skyfall", "Adele");

    // create fingerprints
    var avHashes = await FingerprintCommandBuilder.Instance
                                .BuildFingerprintCommand()
                                .From(file)
                                .UsingServices(audioService)
                                .Hash();
								
    // store hashes in the database for later retrieval
    modelService.Insert(track, avHashes);
}

Querying

Once you've inserted the fingerprints into the datastore, later you might want to query the storage in order to recognize the song those samples you have. The origin of query samples may vary: file, URL, microphone, radio tuner, etc. It's up to your application, where you get the samples from.


public async Task<TrackData> GetBestMatchForSong(string file)
{
    int secondsToAnalyze = 10; // number of seconds to analyze from query file
    int startAtSecond = 0; // start at the begining
	
    // query the underlying database for similar audio sub-fingerprints
    var queryResult = await QueryCommandBuilder.Instance.BuildQueryCommand()
                                         .From(file, secondsToAnalyze, startAtSecond)
                                         .UsingServices(modelService, audioService)
                                         .Query();
    
    return queryResult.BestMatch.Track;
}

Fingerprints Storage

The default storage, which comes bundled with soundfingerprinting NuGet package, is a plain in-memory storage, available via <code>InMemoryModelService</code> class. If you plan to use an external persistent storage for fingerprints Emy is the preferred choice. Emy provides a community version which is free for non-commercial use. More about Emy can be found on wiki page.

Supported audio/video formats

Read Supported Media Formats page for details about processing different file formats or realtime streams.

Video fingerprinting support since version 8.0.0

Since v8.0.0 video fingerprinting support has been added. Similarly to audio fingerprinting, video fingerprints are generated from video frames, and used to insert and later query the datastore for exact and similar matches. You can use SoundFingerprinting to fingerprint either audio or video content or both at the same time. More details about video fingerprinting are available here.

Version 9

Version 9 was released to accomodate SoundFingerprinting.Emy v9.0.0, which upgrades to FFmpeg v5.x (breaking change as v8.x is using FFmpeg v4.x). If you are not using SoundFingerprinting.Emy you can safely upgrade to v9. Version 9.4.0 provides dramatic improvement for long queries (over 1 hour), that match long tracks.

FAQ

  • Can I apply this algorithm for speech recognition purposes?

No. The granularity of one fingerprint is roughly ~1.46 seconds.

  • Can the algorithm detect exact query position in resulted track?

Yes.

  • Can I use SoundFingerprinting to detect ads in radio streams?

Yes. Actually this is the most frequent use-case where SoundFingerprinting was successfully used.

  • How many tracks can I store in InMemoryModelService?

100 hours of content with DefaultFingerprintingConfiguration will consume ~5GB of RAM.

Get it on NuGet

Install-Package SoundFingerprinting

How it works

Audio Fingerprinting.

Video Fingerprinting.

Demo

My description of the algorithm alogside with the demo project can be found on CodeProject. The article is from 2011, and may be outdated. The demo project is a Audio File Duplicates Detector. Its latest source code can be found here. Its a WPF MVVM project that uses the algorithm to detect what files are perceptually very similar.

Contribute

If you want to contribute you are welcome to open issues or discuss on issues page. Feel free to contact me for any remarks, ideas, bug reports etc.

License

The framework is provided under MIT license agreement.

© Soundfingerprinting, 2010-2024, sergiu@emysound.com

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (7)

Showing the top 5 NuGet packages that depend on SoundFingerprinting:

Package Downloads
SoundFingerprinting.Emy The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

SoundFingerprinting.Emy is a native C# client for Emy fingerprints storage. It provides ways to insert, query, delete entries from Emy. To learn more about SoundFingerprinting visit github page https://github.com/AddictedCS/soundfingerprinting. To learn more about Emy visit https://www.emysound.com

SoundFingerprinting.Audio.Bass The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

Un4seen.Bass extension library for SoundFingerprinting framework. SoundFingerprinting default library is designed to read only raw wave files. This extension provides the ability to read all files supported by Bass (including .mp3, .flac, .ogg). Un4seen.Bass is free for non-comercial use. If you intend to use this extension for commercial purposes, please contact http://www.un4seen.com for licensing

SoundFingerprinting.Audio.NAudio The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

NAudio extension library for SoundFingerprinting framework. This extension provides the ability to read all files supported by NAudio media foundation framework. Since NAudio depends on Windows native calls, this extension can execute only in Windows environment.

SoundFingerprinting.Solr The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

SoundFingerprinting is a C# framework that implements an efficient algorithm of audio fingerprinting and identification. Designed for developers, enthusiasts, researchers in the fields of audio processing, data mining, digital signal processing.

SoundFingerprinting.SQL The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

SoundFingerprinting is a C# framework that implements an efficient algorithm of audio fingerprinting and identification. Designed for developers, enthusiasts, researchers in the fields of audio processing, data mining, digital signal processing.

GitHub repositories (2)

Showing the top 2 popular GitHub repositories that depend on SoundFingerprinting:

Repository Stars
AddictedCS/soundfingerprinting
Open source audio fingerprinting in .NET. An efficient algorithm for acoustic fingerprinting written purely in C#.
cjmanca/plex-credits-detect
Augments plex's built in intro detection, additionally detecting credits.
Version Downloads Last updated
10.0.0 290 4/5/2024
9.5.0 155 3/27/2024
9.4.4 605 3/2/2024
9.4.2 338 2/27/2024
9.4.0 260 2/26/2024
9.4.0-beta1 85 2/23/2024
9.3.0 276 2/19/2024
9.2.0 330 2/6/2024
9.1.0 807 12/28/2023
9.0.0 946 11/30/2023
9.0.0-beta 540 11/22/2023
9.0.0-alpha 82 11/19/2023
8.33.0 398 12/28/2023
8.32.0 139 11/21/2023
8.30.0 1,051 10/25/2023
8.28.0 1,182 9/21/2023
8.27.2 601 9/18/2023
8.27.1 536 9/18/2023
8.27.0 433 9/14/2023
8.26.0 658 9/1/2023
8.25.0 754 8/28/2023
8.24.0 1,928 7/17/2023
8.23.0 3,543 5/15/2023
8.22.0 3,560 4/3/2023
8.21.0 3,522 1/22/2023
8.20.0 1,141 1/12/2023
8.19.0 2,831 12/12/2022
8.18.0 1,087 12/8/2022
8.17.0 1,112 11/30/2022
8.16.5 1,145 11/26/2022
8.16.3 1,055 11/22/2022
8.16.2 1,070 11/16/2022
8.16.1 1,139 11/14/2022
8.16.0 1,144 11/11/2022
8.15.0 2,598 9/20/2022
8.14.0 1,749 8/24/2022
8.13.0 4,567 8/16/2022
8.12.1-patch1 372 12/28/2023
8.12.0 4,189 6/6/2022
8.9.1 4,255 4/27/2022
8.9.0 1,275 4/27/2022
8.8.0 2,104 4/17/2022
8.7.0 2,355 4/6/2022
8.6.0 2,537 3/23/2022
8.5.1 1,809 2/23/2022
8.5.0 1,356 2/18/2022
8.4.0 1,393 2/8/2022
8.3.0 1,383 1/21/2022
8.2.0 1,550 1/6/2022
8.1.0 1,072 12/28/2021
8.0.0 2,303 12/22/2021
8.0.0-beta4 701 12/21/2021
8.0.0-beta3 761 12/8/2021
8.0.0-beta2 185 12/7/2021
8.0.0-beta 197 12/7/2021
8.0.0-alpha 195 12/6/2021
7.17.0 2,845 11/30/2021
7.16.0 2,215 11/26/2021
7.15.0 2,843 11/9/2021
7.14.0 1,156 11/9/2021
7.13.0 1,814 10/19/2021
7.12.0 1,213 10/13/2021
7.10.0 3,397 6/29/2021
7.9.9 2,788 5/10/2021
7.9.6 1,307 4/30/2021
7.9.4 1,254 4/27/2021
7.9.3 1,291 4/18/2021
7.9.0 22,464 4/5/2021
7.8.1 1,993 3/21/2021
7.8.0 1,177 3/19/2021
7.7.0 489 3/15/2021
7.5.5 1,977 1/25/2021
7.5.2 1,845 1/13/2021
7.4.24 2,912 11/30/2020
7.4.19 2,464 11/6/2020
7.4.13 4,470 8/25/2020
7.4.12 2,270 8/11/2020
7.4.11 1,340 8/4/2020
7.4.10 1,354 7/30/2020
7.4.7 2,981 7/22/2020
7.4.6 1,353 7/20/2020
7.4.1 3,595 6/25/2020
7.4.0 1,483 6/19/2020
7.3.3 3,147 5/12/2020
7.3.2 1,956 5/8/2020
7.3.1 1,364 5/4/2020
7.3.0 1,393 4/25/2020
7.2.0 2,560 3/31/2020
7.2.0-beta3 1,465 3/17/2020
7.2.0-beta2 1,022 3/12/2020
7.2.0-beta 1,179 2/27/2020
7.1.0 2,555 2/3/2020
7.1.0-beta4 1,080 12/11/2019
7.1.0-beta3 1,039 11/11/2019
7.1.0-beta2 466 11/5/2019
7.1.0-beta 1,090 10/23/2019
7.1.0-alpha 415 10/8/2019
7.0.0 4,119 7/1/2019
6.3.0 2,151 5/31/2019
6.2.2 4,312 5/1/2019
6.2.1 2,149 4/5/2019
6.2.1-beta4 505 3/27/2019
6.2.1-beta3 492 3/18/2019
6.2.1-beta2 502 3/17/2019
6.2.1-beta1 493 3/12/2019
6.2.0 2,538 3/4/2019
6.1.1 1,888 2/15/2019
6.1.0 843 2/1/2019
6.1.0-beta4 578 1/14/2019
6.1.0-beta3 601 1/10/2019
6.1.0-beta2 664 1/8/2019
6.1.0-beta 612 1/7/2019
6.0.0 2,635 11/6/2018
6.0.0-beta 641 10/30/2018
5.2.3 4,229 9/20/2018
5.2.2 9,553 7/4/2018
5.2.1 2,434 5/10/2018
5.2.0 1,208 4/29/2018
5.1.0 1,253 3/20/2018
5.0.0 1,161 3/13/2018
5.0.0-alpha 919 3/12/2018
4.2.1 1,837 3/5/2018
4.2.0 1,648 3/1/2018
4.1.0 2,080 12/5/2017
4.1.0-alpha 1,005 10/27/2017
4.0.0 1,503 10/23/2017
3.2.0 1,800 10/14/2017
3.1.2 1,790 9/16/2017
3.1.0 2,395 12/15/2016
3.0.0 1,860 12/6/2016
3.0.0-beta 1,161 11/29/2016
3.0.0-alpha 1,227 11/23/2016
2.3.3 1,711 11/10/2016
2.3.1 1,700 10/29/2016
2.3.0 1,337 10/28/2016
2.2.0 1,990 2/1/2016
2.1.0 1,198 1/16/2016
2.0.0 1,569 1/15/2016
2.0.0-alpha 1,187 5/16/2015
1.0.1.20018 2,007 6/1/2014
1.0.0.33376 2,103 4/26/2014
0.5.3 1,664 2/3/2014
0.5.2 1,263 1/26/2014
0.5.0.1 2,415 1/12/2014
0.4.2-alpha 1,218 6/16/2013
0.4.1-alpha 1,131 6/15/2013
0.4.0-alpha 1,166 6/14/2013

Version 10
- Accomodating SoundFingerprinting.Emy upgrade to FFmpeg 6.x
Version 9.5.0
- Dependency upgrade to .NET 8
Version 9.4.4
- Improving the design for ITagService, let's allow setting key/values in one method call.
Version 9.4.2
- Contains an important improvement to QueryCommand, allowing a much faster lookup for the use-cases when the track and the query are very long and almost identical.
- The improvement is rooted in the idea of returning Candidates from the IModelService instead of list of SubFingerprints. This provided knowledge on which hashed fingerprint matched with the query.
- To further improve the API design, methods related to the correct functioning of the QueryCommand were extracted into IQueryService interface (from which IModelService derives).