SoundFingerprinting 10.4.0

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

// Install SoundFingerprinting as a Cake Tool
#tool nuget:?package=SoundFingerprinting&version=10.4.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 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.4.0 145 6/5/2024
10.3.1 205 5/17/2024
10.3.0 101 5/16/2024
10.0.0 596 4/5/2024
9.5.0 163 3/27/2024
9.4.4 654 3/2/2024
9.4.2 345 2/27/2024
9.4.0 267 2/26/2024
9.4.0-beta1 86 2/23/2024
9.3.0 282 2/19/2024
9.2.0 336 2/6/2024
9.1.0 840 12/28/2023
9.0.0 957 11/30/2023
9.0.0-beta 541 11/22/2023
9.0.0-alpha 88 11/19/2023
8.33.0 408 12/28/2023
8.32.0 145 11/21/2023
8.30.0 1,055 10/25/2023
8.28.0 1,186 9/21/2023
8.27.2 605 9/18/2023
8.27.1 539 9/18/2023
8.27.0 448 9/14/2023
8.26.0 663 9/1/2023
8.25.0 758 8/28/2023
8.24.0 1,940 7/17/2023
8.23.0 3,561 5/15/2023
8.22.0 3,649 4/3/2023
8.21.0 3,529 1/22/2023
8.20.0 1,145 1/12/2023
8.19.0 2,836 12/12/2022
8.18.0 1,091 12/8/2022
8.17.0 1,116 11/30/2022
8.16.5 1,149 11/26/2022
8.16.3 1,058 11/22/2022
8.16.2 1,071 11/16/2022
8.16.1 1,140 11/14/2022
8.16.0 1,145 11/11/2022
8.15.0 2,600 9/20/2022
8.14.0 1,756 8/24/2022
8.13.0 4,947 8/16/2022
8.12.1-patch1 373 12/28/2023
8.12.0 4,197 6/6/2022
8.9.1 4,258 4/27/2022
8.9.0 1,276 4/27/2022
8.8.0 2,106 4/17/2022
8.7.0 2,362 4/6/2022
8.6.0 2,539 3/23/2022
8.5.1 1,818 2/23/2022
8.5.0 1,357 2/18/2022
8.4.0 1,395 2/8/2022
8.3.0 1,385 1/21/2022
8.2.0 1,552 1/6/2022
8.1.0 1,076 12/28/2021
8.0.0 2,402 12/22/2021
8.0.0-beta4 702 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,955 11/30/2021
7.16.0 2,217 11/26/2021
7.15.0 2,845 11/9/2021
7.14.0 1,158 11/9/2021
7.13.0 1,816 10/19/2021
7.12.0 1,215 10/13/2021
7.10.0 3,416 6/29/2021
7.9.9 2,792 5/10/2021
7.9.6 1,309 4/30/2021
7.9.4 1,255 4/27/2021
7.9.3 1,307 4/18/2021
7.9.0 23,779 4/5/2021
7.8.1 2,010 3/21/2021
7.8.0 1,178 3/19/2021
7.7.0 491 3/15/2021
7.5.5 1,987 1/25/2021
7.5.2 1,855 1/13/2021
7.4.24 2,914 11/30/2020
7.4.19 2,465 11/6/2020
7.4.13 4,478 8/25/2020
7.4.12 2,272 8/11/2020
7.4.11 1,342 8/4/2020
7.4.10 1,358 7/30/2020
7.4.7 2,985 7/22/2020
7.4.6 1,362 7/20/2020
7.4.1 3,599 6/25/2020
7.4.0 1,486 6/19/2020
7.3.3 3,155 5/12/2020
7.3.2 1,957 5/8/2020
7.3.1 1,365 5/4/2020
7.3.0 1,396 4/25/2020
7.2.0 2,562 3/31/2020
7.2.0-beta3 1,466 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,558 2/3/2020
7.1.0-beta4 1,081 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,133 7/1/2019
6.3.0 2,155 5/31/2019
6.2.2 4,316 5/1/2019
6.2.1 2,151 4/5/2019
6.2.1-beta4 506 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,541 3/4/2019
6.1.1 1,892 2/15/2019
6.1.0 846 2/1/2019
6.1.0-beta4 579 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,640 11/6/2018
6.0.0-beta 642 10/30/2018
5.2.3 4,235 9/20/2018
5.2.2 9,710 7/4/2018
5.2.1 2,438 5/10/2018
5.2.0 1,212 4/29/2018
5.1.0 1,257 3/20/2018
5.0.0 1,166 3/13/2018
5.0.0-alpha 920 3/12/2018
4.2.1 1,841 3/5/2018
4.2.0 1,652 3/1/2018
4.1.0 2,086 12/5/2017
4.1.0-alpha 1,006 10/27/2017
4.0.0 1,507 10/23/2017
3.2.0 1,804 10/14/2017
3.1.2 1,794 9/16/2017
3.1.0 2,405 12/15/2016
3.0.0 1,864 12/6/2016
3.0.0-beta 1,162 11/29/2016
3.0.0-alpha 1,227 11/23/2016
2.3.3 1,715 11/10/2016
2.3.1 1,703 10/29/2016
2.3.0 1,340 10/28/2016
2.2.0 1,997 2/1/2016
2.1.0 1,209 1/16/2016
2.0.0 1,574 1/15/2016
2.0.0-alpha 1,189 5/16/2015
1.0.1.20018 2,025 6/1/2014
1.0.0.33376 2,111 4/26/2014
0.5.3 1,672 2/3/2014
0.5.2 1,269 1/26/2014
0.5.0.1 2,424 1/12/2014
0.4.2-alpha 1,225 6/16/2013
0.4.1-alpha 1,134 6/15/2013
0.4.0-alpha 1,170 6/14/2013

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.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).