SoundFingerprinting 11.1.0

dotnet add package SoundFingerprinting --version 11.1.0                
NuGet\Install-Package SoundFingerprinting -Version 11.1.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="11.1.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add SoundFingerprinting --version 11.1.0                
#r "nuget: SoundFingerprinting, 11.1.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=11.1.0

// Install SoundFingerprinting as a Cake Tool
#tool nuget:?package=SoundFingerprinting&version=11.1.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 Matrix

If you are using FFmpegAudioService as described in the wiki, follow the below version matrix. | SoundFingerprinting | SoundFingerprinting.Emy | FFmpeg | | ---- | ------ |-----| | 8.x | 8.x | 4.x | | 9.x | 9.x | 5.x | | 10.x | 10.x | 6.x |

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

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

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

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

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

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
11.1.0 248 10/29/2024
11.0.0 313 10/3/2024
10.7.0 687 8/8/2024
10.6.0 254 7/9/2024
10.4.0 323 6/5/2024
10.3.1 267 5/17/2024
10.3.0 135 5/16/2024
10.0.0 827 4/5/2024
9.5.0 212 3/27/2024
9.4.4 856 3/2/2024
9.4.2 398 2/27/2024
9.4.0 306 2/26/2024
9.4.0-beta1 111 2/23/2024
9.3.0 346 2/19/2024
9.2.0 373 2/6/2024
9.1.0 1,033 12/28/2023
9.0.0 1,024 11/30/2023
9.0.0-beta 578 11/22/2023
9.0.0-alpha 115 11/19/2023
8.33.0 444 12/28/2023
8.32.0 168 11/21/2023
8.30.0 1,117 10/25/2023
8.28.0 1,266 9/21/2023
8.27.2 640 9/18/2023
8.27.1 579 9/18/2023
8.27.0 480 9/14/2023
8.26.0 705 9/1/2023
8.25.0 789 8/28/2023
8.24.0 2,012 7/17/2023
8.23.0 3,783 5/15/2023
8.22.0 3,933 4/3/2023
8.21.0 3,609 1/22/2023
8.20.0 1,186 1/12/2023
8.19.0 2,907 12/12/2022
8.18.0 1,134 12/8/2022
8.17.0 1,164 11/30/2022
8.16.5 1,179 11/26/2022
8.16.3 1,099 11/22/2022
8.16.2 1,114 11/16/2022
8.16.1 1,195 11/14/2022
8.16.0 1,177 11/11/2022
8.15.0 2,661 9/20/2022
8.14.0 1,811 8/24/2022
8.13.0 6,069 8/16/2022
8.12.1-patch1 411 12/28/2023
8.12.0 4,344 6/6/2022
8.9.1 4,353 4/27/2022
8.9.0 1,322 4/27/2022
8.8.0 2,148 4/17/2022
8.7.0 2,434 4/6/2022
8.6.0 2,580 3/23/2022
8.5.1 1,874 2/23/2022
8.5.0 1,386 2/18/2022
8.4.0 1,433 2/8/2022
8.3.0 1,434 1/21/2022
8.2.0 1,624 1/6/2022
8.1.0 1,116 12/28/2021
8.0.0 2,697 12/22/2021
8.0.0-beta4 742 12/21/2021
8.0.0-beta3 816 12/8/2021
8.0.0-beta2 208 12/7/2021
8.0.0-beta 219 12/7/2021
8.0.0-alpha 218 12/6/2021
7.17.0 3,158 11/30/2021
7.16.0 2,244 11/26/2021
7.15.0 2,918 11/9/2021
7.14.0 1,197 11/9/2021
7.13.0 1,851 10/19/2021
7.12.0 1,266 10/13/2021
7.10.0 3,505 6/29/2021
7.9.9 2,853 5/10/2021
7.9.6 1,367 4/30/2021
7.9.4 1,298 4/27/2021
7.9.3 1,338 4/18/2021
7.9.0 24,331 4/5/2021
7.8.1 2,069 3/21/2021
7.8.0 1,213 3/19/2021
7.7.0 510 3/15/2021
7.5.5 2,051 1/25/2021
7.5.2 1,906 1/13/2021
7.4.24 2,987 11/30/2020
7.4.19 2,574 11/6/2020
7.4.13 5,007 8/25/2020
7.4.12 2,328 8/11/2020
7.4.11 1,394 8/4/2020
7.4.10 1,381 7/30/2020
7.4.7 3,055 7/22/2020
7.4.6 1,387 7/20/2020
7.4.1 3,691 6/25/2020
7.4.0 1,524 6/19/2020
7.3.3 3,208 5/12/2020
7.3.2 2,026 5/8/2020
7.3.1 1,400 5/4/2020
7.3.0 1,428 4/25/2020
7.2.0 2,597 3/31/2020
7.2.0-beta3 1,496 3/17/2020
7.2.0-beta2 1,052 3/12/2020
7.2.0-beta 1,210 2/27/2020
7.1.0 2,623 2/3/2020
7.1.0-beta4 1,108 12/11/2019
7.1.0-beta3 1,079 11/11/2019
7.1.0-beta2 502 11/5/2019
7.1.0-beta 1,120 10/23/2019
7.1.0-alpha 419 10/8/2019
7.0.0 4,239 7/1/2019
6.3.0 2,217 5/31/2019
6.2.2 4,399 5/1/2019
6.2.1 2,210 4/5/2019
6.2.1-beta4 526 3/27/2019
6.2.1-beta3 516 3/18/2019
6.2.1-beta2 526 3/17/2019
6.2.1-beta1 513 3/12/2019
6.2.0 2,601 3/4/2019
6.1.1 1,939 2/15/2019
6.1.0 870 2/1/2019
6.1.0-beta4 599 1/14/2019
6.1.0-beta3 623 1/10/2019
6.1.0-beta2 685 1/8/2019
6.1.0-beta 631 1/7/2019
6.0.0 2,715 11/6/2018
6.0.0-beta 663 10/30/2018
5.2.3 4,364 9/20/2018
5.2.2 10,372 7/4/2018
5.2.1 2,505 5/10/2018
5.2.0 1,239 4/29/2018
5.1.0 1,284 3/20/2018
5.0.0 1,207 3/13/2018
5.0.0-alpha 946 3/12/2018
4.2.1 1,915 3/5/2018
4.2.0 1,724 3/1/2018
4.1.0 2,145 12/5/2017
4.1.0-alpha 1,046 10/27/2017
4.0.0 1,601 10/23/2017
3.2.0 1,861 10/14/2017
3.1.2 1,851 9/16/2017
3.1.0 2,472 12/15/2016
3.0.0 1,925 12/6/2016
3.0.0-beta 1,205 11/29/2016
3.0.0-alpha 1,264 11/23/2016
2.3.3 1,772 11/10/2016
2.3.1 1,759 10/29/2016
2.3.0 1,377 10/28/2016
2.2.0 2,033 2/1/2016
2.1.0 1,237 1/16/2016
2.0.0 1,616 1/15/2016
2.0.0-alpha 1,213 5/16/2015
1.0.1.20018 2,106 6/1/2014
1.0.0.33376 2,150 4/26/2014
0.5.3 1,700 2/3/2014
0.5.2 1,293 1/26/2014
0.5.0.1 2,510 1/12/2014
0.4.2-alpha 1,233 6/16/2013
0.4.1-alpha 1,161 6/15/2013
0.4.0-alpha 1,194 6/14/2013

Version 11.1.0
- Adjusting `IRealtimeResultEntryFilter` implementation classes, making sure we adhere to the same principles across both configuration options `ResultEntryFilter` and `OngoingResultEntryFilter`.
- Adding `ChainedRealtimeEntryFilter` which replaces `OngoingRealtimeResultEntryFilter`.
- `TrackMatchLengthEntryFilter` can be used as `TrackCoverageLengthEntryFilter(waitTillCompletion: false)`
- `OngoingRealtimeResultEntryFilter(x, y)` can be chained as new ChainedRealtimeEntryFilter([new TrackRelativeCoverageEntryFilter(x, waitTillCompletion: false), new TrackCoverageLengthEntryFilter(y, waitTillCompletion: false)`])
- `TrackRelativeCoverageLengthEntryFilter` can be used as `TrackRelativeCoverageEntryFilter(waitTillCompletion: true)`.
Version 11.0.0
- Cleanup of the codebase, removing obsolete methods and classes.
- Removed IAdvancedModelService.
- Removed obsolete Query methods from IQueryService, leaving only QueryEfficient method.
- Removed MediaType from QueryConfiguration, as it was not used anymore.
Version 10.4.0
- Added new property MetaFields to AVQueryMatch, to be able to store additional metadata about the match.
Version 10.3.0
- Improved the ability to reconstruct coverage from tone signal matches (silence can be treated as a tone signal).
- Added a fingerprinting flag that allows including silence fingerprints in the generated result set.
Version 10
- Accomodating SoundFingerprinting.Emy upgrade to FFmpeg 6.x
Version 9.5.0
- Dependency upgrade to .NET 8
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).