spotify / echoprint-server: serveur pour le système d'empreinte digitale audio Echoprint – Serveur d’impression
Une bibliothèque C, avec un module d’extension Python et des liaisons Java, pour
indexation rapide et interrogation des données echoprint.
Sommaire
Installation
La bibliothèque C autonome est construite avec CMake. Cette étape est obligatoire
pour utiliser les liaisons Java (mais pas pour le Python).
Pour construire le module d’extension Python, exécutez installation de python.py install
.
Usage
Le reste de ce fichier documente l'utilisation de serveur echoprint
via
le module d’extension Python, à travers un ensemble de scripts pratiques
le poubelle/
annuaire.
Pour les liaisons Java, veuillez vous référer à la UsageExample.java
fichier.
Le générateur de code echoprint, utilisé pour convertir des fichiers audio en
Les chaînes echoprint, peuvent être trouvées ici:
echoprint-codegen.
ATTENTION
La bibliothèque utilise un format binaire personnalisé pour la vitesse. À ce point,
L'ENVIRONNEMENT N'EST PAS CONTROLE donc déplacer des fichiers d'index entre les machines
avec différentes architectures pourrait causer des problèmes. Le code a été
testé sur petit endian Machines.
Le code Java permettant de créer des index suppose explicitement peu
Endian architecture.
echoprint-decode
Convertir une chaîne de code en sortie par echoprint-codegen
dans le
liste correspondante des codes représentés sous forme d'entiers séparés par des virgules.
Usage:
echoprint-codegen chanson.ogg> codegen_output.json
cat codegen_output.json | jq -r '.[0].code '| echoprint-decode> codes.txt
codes.txt
ressemblera:
150555,1035718,621673,794882,40662,955768,96899,166055, ...
Ce script affiche uniquement les codes echoprint, pas les
compensations. jq
est un outil de ligne de commande pour traiter les chaînes JSON, il peut
être trouvé ici.
echoprint-inverted-index
Prend une série de chaînes echoprint (une par ligne) et
un chemin de sortie. Écrit un index compact sur le disque.
Usage:
chat ... | ./echoprint-inverted-index index.bin
index.bin
le format est binaire, voir les détails d’implémentation ci-dessous.
Si plus de 65 535 chansons sont indexées, la sortie sera divisée en
blocs avec le schéma de nommage suivant:
index.bin_0000
index.bin_0001
...
Éventuellement le -je
switch commute le format d'entrée sur un
liste de codes entiers séparés par des virgules (une chanson par ligne).
echoprint-inverted-query
Prend une série de chaînes echoprint (une par ligne) et une liste d’index
des blocs. Pour chaque requête, les résultats en sortie sur stdout sont codés en json
objets.
Usage:
chat ... | ./echoprint-inverted-query index-file-1 [index-file-2 ...]
où l'entrée est une chaîne echoprint par ligne;
Chaque ligne de sortie ressemble à ceci:
{
"résultats":[
"index": 0,
"score": 0,69340412080287933,
,
"index": 8,
"score": 0.56301175890117883,
,
"index": 120,
"score": 0.3182627242477954626,
,
...
le indice
champ représente la position de la chanson correspondante dans le
indice.
Éventuellement le -je
switch commute le format d'entrée sur un
liste de codes entiers séparés par des virgules (une chanson par ligne).
Service REST
le echoprint-rest-service
Le script écoute les requêtes POST (par
par défaut sur le port 5678), avec une chaîne echoprint comme echoprint
paramètre. le test-rest.sh
montre comment interroger en utilisant boucle
.
La demande est faite à hôte: requête /
avec
un des
jaccard
set_int
set_int_norm_length_first
Usage:
echoprint-rest-service index-file-1 [index-file-2 ...]
L'option --ids-file
accepte un chemin vers un fichier texte où chaque
La ligne représente un identifiant pour la piste indexée en conséquence dans le répertoire.
indice. Si spécifié, les résultats retournés auront un identifiant
champ.
Exemple: interrogation audio
En supposant 0005dad86d4d4c6fb592d42d767e117f.ogg
est dans le courant
répertoire, coupons-le de 00h30 à 16h30 et ré-encodez-le en tant que 128
kbps mp3 (pour montrer que echoprint est robuste aux modifications du
fichier):
ffmpeg -i 0005dad86d4d4c6fb592d42d767e117f.ogg
-s 30 -t 240
0005dad86d4d4c6fb592d42d767e117f_cut_lowrate.mp3
Exécutez le codegen echoprint, extrayez la chaîne echoprint:
../echoprint-codegen/echoprint-codegen
0005dad86d4d4c6fb592d42d767e117f_cut_lowrate.mp3
| jq -r '.[0].code '
> 0005dad86d4d4c6fb592d42d767e117f_cut_lowrate.echoprint```
Interrogez le service:
curl -s --data
echoprint = `cat 0005dad86d4d4c6fb592d42d767e117f_cut_lowrate.echoprint`
: 5678 / requête
Les résultats devraient être similaires à
"résultats": [
"id": "0005dad86d4d4c6fb592d42d767e117f",
"index": 0,
"score": 0.34932565689086914
,
"id": "ee59c151d679413a80ac4e49ac92c662",
"index": 698096,
"score": 0.033668458461761475
,
"id": "026526e6a02648668ff9f410faab15be",
"index": 312466,
"score": 0.015930989757180214
,
...
]
Détails d'implémentation
Similarité
La similarité entre deux echoprints est calculée sur leur
sac de mots représentations. Cela signifie que les décalages des codes
ne sont pas pris en compte, pas plus que les multiplicités des codes.
Format binaire d'index inversé
L’index inversé est sérialisé en plusieurs des blocs, chacun étant un
vidage de la mémoire de la EchoprintInvertedIndexBlock
struct défini dans le
En tête de fichier.
Licence 📝
Le projet est disponible sous la licence Apache 2.0.
Contribuant 📬
Les contributions sont les bienvenues, consultez le document CONTRIBUTING.md pour plus d'informations.
Commentaires
Laisser un commentaire