Serveur d'impression

spotify / echoprint-server: serveur pour le système d'empreinte digitale audio Echoprint – Serveur d’impression

Le 8 octobre 2019 - 5 minutes de lecture

Statut de construction
Licence
Plates-formes prises en charge: Linux et OS X

Une bibliothèque C, avec un module d’extension Python et des liaisons Java, pour
indexation rapide et interrogation des données echoprint.

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

Votre commentaire sera révisé par les administrateurs si besoin.