Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Henry - a DSP-driving SPARQL end-point Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Chris@0:

DBTune.org

Chris@0: Chris@0:
Henry - a DSP-driving SPARQL end-point
Chris@0: Chris@0:

1. Introduction

Chris@0: Chris@11:

Note: This service is not currently available. This page is Chris@11: retained for historical interest.

Chris@11: Chris@0:

Chris@0: This server hosts a SPARQL Chris@0: end-point able to perform audio processing tasks to answer a particular query. Chris@0: It builds on top of N3 and Chris@0: Transaction Logic. More details to come. Chris@0:

Chris@0: Chris@0:

Chris@0: Henry therefore implements a Music-related Semantic Web agent: Chris@0: an agent processing machine-readable web content and audio content Chris@0: to publish new data. Chris@0:

Chris@0: Chris@0:

2. Details

Chris@0:

Chris@0: Henry was initally intended to be a small application Chris@0: on top of a SWI-Prolog N3 parser, Chris@0: interpreting parsed N3 rules as entailment rules within the SWI-Prolog Chris@0: Semantic Web server. Chris@0:

Chris@0: Chris@0:

Chris@0: Now, Henry provides the ability to easily register new audio processing builtin predicates (which may be discovered at querying time). Chris@0: Henry works on top of a quad-store m and a binary store b. Chris@0:

Chris@0: Chris@0:

Chris@0: A simplistic version of the Chris@0: behavior of Henry is the following. Chris@0: When processing a SPARQL query q, Henry gets through the following steps: Chris@0:

    Chris@0:
  1. For every newly appearing web identifier i in q, dereference it, and then:
  2. Chris@0: Chris@0:
  3. For every triple pattern p in q, the possible solutions are:
  4. Chris@0: Chris@0:
Chris@0:

Chris@0: Chris@0:

Chris@0: This implementation is still in the early stages, and still a bit experimental, it may perfectly die horribly :-) A look at Chris@0: the issue tracker may give insights on what is still buggy. Chris@0: Also, the server running this service is quite.... slow :) Chris@0:

Chris@0: Chris@0: Chris@0: Chris@0:

3. Using this service

Chris@0:

Chris@0: There is a raw SPARQL end point at

http://dbtune.org/henry/sparql/
. Chris@0:

Chris@0:

Chris@0: A web interface is also available. Get in the Query database page, make sure you choose SPARQL Chris@0: as your query language, and check that the entailment is set to n3 (it should be the default, anyway). Chris@0:

Chris@0: Chris@0:

Chris@0: A query involving only builtins (no N3 rules) is the following. It computes MFCC models for two tracks and compute Chris@0: their Kullback-Leiber divergence: Chris@0:

Chris@0:
Chris@0: select ?d
Chris@0: where
Chris@0: {
Chris@0: <http://dbtune.org/audio/Den-Nostalia.ogg> <http://purl.org/ontology/dsp/cache> ?local.
Chris@0: ?local <http://purl.org/ontology/dsp/aspl_decode> ?sig.
Chris@0: ?sig <http://purl.org/ontology/vamp/qm-mfccparameters> (?means1 ?vars1).
Chris@0: 
Chris@0: <http://dbtune.org/audio/Both-Axel.ogg> <http://purl.org/ontology/dsp/cache> ?local2 .
Chris@0: ?local2 <http://purl.org/ontology/dsp/aspl_decode> ?sig2.
Chris@0: ?sig2 <http://purl.org/ontology/vamp/qm-mfccparameters> (?means2 ?vars2).
Chris@0: 
Chris@0: ((?means1 ?vars1) (?means2 ?vars2)) <http://purl.org/ontology/dsp/mfcc_kldiv> ?d
Chris@0: }
Chris@0: 
Chris@0: Chris@0:

Chris@0: This is a pretty huge query! Chris@0: But, using a simple N3 rule, we can reduce that to the following query: Chris@0:

Chris@0: Chris@0:
Chris@0: PREFIX sim: <http://purl.org/ontology/similarity/>
Chris@0: SELECT ?sim
Chris@0: WHERE
Chris@0: {
Chris@0: (<http://dbtune.org/audio/Den-Nostalia.ogg> <http://dbtune.org/audio/Both-Axel.ogg>) sim:div ?sim
Chris@0: }
Chris@0: 
Chris@0: Chris@0:

Chris@0: Another example is the following, computing key change events as specified by the Audio Features Chris@0: ontology. Chris@0: using the key Chris@0: detection Vamp plugin in the Queen Mary plugin set and this N3 Chris@0: rule: Chris@0:

Chris@0:
Chris@0: select ?start ?key where {
Chris@0: <http://dbtune.org/audio/Both-Axel.ogg> mo:encodes ?sig.
Chris@0: ?sig mo:time ?time.
Chris@0: ?time tl:timeline ?tl.
Chris@0: _:evt a af:KeyChange; 
Chris@0:         event:time [tl:at ?start; tl:timeline ?tl] ;
Chris@0:         af:new_key ?key }
Chris@0: 
Chris@0: Chris@0: Chris@0: Chris@0:

4. Code

Chris@0:

Chris@0: All the code is open source and available in our Google code project. Chris@0:

Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: Chris@0: