Intégration audio en Java
Le projet actuel tente de développer un encodeur audio Java pur qui peut être utilisé dans un programme Java ou Android pur. Un tel encodeur audio peut être utilisé pour la classification des genres musicaux, la recherche de musique ou la recommandation musicale.
Le projet actuel contient actuellement deux réseaux d'apprentissage profond adoptés à partir de :
La formation et la validation de ces deux modèles sont présentées ci-dessous :
Le package d'apprentissage automatique en Java est tensorflow, il charge un modèle de classificateur audio pré-entraîné (format .pb). Le modèle de classificateur audio a été initialement implémenté et formé à l'aide de Keras en Python. Ce modèle de classificateur entraîné (au format .h5) a ensuite été converti en fichier modèle .pb qui peut être directement chargé par tensorflow en Java.
La formation keras du modèle de classificateur audio peut être trouvée dans README_Training.md
Les exemples de codes ci-dessous montrent comment utiliser le classificateur audio cifar pour prédire les genres de musique :
import com . github . chen0040 . tensorflow . classifiers . models . cifar10 . Cifar10AudioClassifier ;
import com . github . chen0040 . tensorflow . classifiers . utils . ResourceUtils ;
import org . slf4j . Logger ;
import org . slf4j . LoggerFactory ;
import java . io . File ;
import java . io . IOException ;
import java . io . InputStream ;
import java . util . ArrayList ;
import java . util . Collections ;
import java . util . List ;
public class Demo {
public static void main ( String [] args ) {
InputStream inputStream = ResourceUtils . getInputStream ( "tf_models/cifar10.pb" );
Cifar10AudioClassifier classifier = new Cifar10AudioClassifier ();
classifier . load_model ( inputStream );
List < String > paths = getAudioFiles ();
Collections . shuffle ( paths );
for ( String path : paths ) {
System . out . println ( "Predicting " + path + " ..." );
File f = new File ( path );
String label = classifier . predict_audio ( f );
System . out . println ( "Predicted: " + label );
}
}
}
Les exemples de codes ci-dessous montrent comment utiliser le classificateur audio resnet v2 pour prédire les genres de musique :
import com . github . chen0040 . tensorflow . classifiers . resnet_v2 . ResNetV2AudioClassifier ;
import com . github . chen0040 . tensorflow . classifiers . utils . ResourceUtils ;
import org . slf4j . Logger ;
import org . slf4j . LoggerFactory ;
import java . io . File ;
import java . io . IOException ;
import java . io . InputStream ;
import java . util . ArrayList ;
import java . util . Collections ;
import java . util . List ;
public class Demo {
public static void main ( String [] args ) {
InputStream inputStream = ResourceUtils . getInputStream ( "tf_models/resnet-v2.pb" );
ResNetV2AudioClassifier classifier = new ResNetV2AudioClassifier ();
classifier . load_model ( inputStream );
List < String > paths = getAudioFiles ();
Collections . shuffle ( paths );
for ( String path : paths ) {
System . out . println ( "Predicting " + path + " ..." );
File f = new File ( path );
String label = classifier . predict_audio ( f );
System . out . println ( "Predicted: " + label );
}
}
}
Les exemples de codes ci-dessous montrent comment utiliser le classificateur audio cifar pour encoder un fichier audio dans un tableau flottant :
import com . github . chen0040 . tensorflow . classifiers . models . cifar10 . Cifar10AudioClassifier ;
import com . github . chen0040 . tensorflow . classifiers . utils . ResourceUtils ;
import org . slf4j . Logger ;
import org . slf4j . LoggerFactory ;
import java . io . File ;
import java . io . IOException ;
import java . io . InputStream ;
import java . util . ArrayList ;
import java . util . Collections ;
import java . util . List ;
public class Demo {
public static void main ( String [] args ){
InputStream inputStream = ResourceUtils . getInputStream ( "tf_models/cifar10.pb" );
Cifar10AudioClassifier classifier = new Cifar10AudioClassifier ();
classifier . load_model ( inputStream );
List < String > paths = getAudioFiles ();
Collections . shuffle ( paths );
for ( String path : paths ) {
System . out . println ( "Encoding " + path + " ..." );
File f = new File ( path );
float [] encoded_audio = classifier . encode_audio ( f );
System . out . println ( "Encoded: " + Arrays . toString ( encoded_audio ));
}
}
}
Les exemples de codes ci-dessous montrent comment utiliser le classificateur audio Resnet v2 pour encoder un fichier audio dans un tableau flottant :
import com . github . chen0040 . tensorflow . classifiers . resnet_v2 . ResNetV2AudioClassifier ;
import com . github . chen0040 . tensorflow . classifiers . utils . ResourceUtils ;
import org . slf4j . Logger ;
import org . slf4j . LoggerFactory ;
import java . io . File ;
import java . io . IOException ;
import java . io . InputStream ;
import java . util . ArrayList ;
import java . util . Collections ;
import java . util . List ;
public class Demo {
public static void main ( String [] args ) {
InputStream inputStream = ResourceUtils . getInputStream ( "tf_models/resnet-v2.pb" );
ResNetV2AudioClassifier classifier = new ResNetV2AudioClassifier ();
classifier . load_model ( inputStream );
List < String > paths = getAudioFiles ();
Collections . shuffle ( paths );
for ( String path : paths ) {
System . out . println ( "Encoding " + path + " ..." );
File f = new File ( path );
float [] encoded_audio = classifier . encode_audio ( f );
System . out . println ( "Encoded: " + Arrays . toString ( encoded_audio ));
}
}
}
Les exemples de codes ci-dessous montrent comment indexer et rechercher un fichier audio à l'aide de la classe AudioSearchEngine :
import com . github . chen0040 . tensorflow . search . models . AudioSearchEngine ;
import com . github . chen0040 . tensorflow . search . models . AudioSearchEntry ;
import java . io . File ;
import java . util . List ;
public class Demo {
public static void main ( String [] args ){
AudioSearchEngine searchEngine = new AudioSearchEngine ();
if (! searchEngine . loadIndexDbIfExists ()) {
searchEngine . indexAll ( FileUtils . getAudioFiles ());
searchEngine . saveIndexDb ();
}
int pageIndex = 0 ;
int pageSize = 20 ;
boolean skipPerfectMatch = true ;
File f = new File ( "mp3_samples/example.mp3" );
System . out . println ( "querying similar music to " + f . getName ());
List < AudioSearchEntry > result = searchEngine . query ( f , pageIndex , pageSize , skipPerfectMatch );
for ( int i = 0 ; i < result . size (); ++ i ){
System . out . println ( "# " + i + ": " + result . get ( i ). getPath () + " (distSq: " + result . get ( i ). getDistance () + ")" );
}
}
}
Les exemples de codes ci-dessous montrent comment recommander des musiques en fonction de l'historique musical de l'utilisateur à l'aide de la classe KnnAudioRecommender :
import com . github . chen0040 . tensorflow . classifiers . utils . FileUtils ;
import com . github . chen0040 . tensorflow . recommenders . models . AudioUserHistory ;
import com . github . chen0040 . tensorflow . recommenders . models . KnnAudioRecommender ;
import com . github . chen0040 . tensorflow . search . models . AudioSearchEntry ;
import java . io . File ;
import java . util . Collections ;
import java . util . List ;
public class Demo {
public static void main ( String [] args ){
AudioUserHistory userHistory = new AudioUserHistory ();
List < String > audioFiles = FileUtils . getAudioFilePaths ();
Collections . shuffle ( audioFiles );
for ( int i = 0 ; i < 40 ; ++ i ){
String filePath = audioFiles . get ( i );
userHistory . logAudio ( filePath );
try {
Thread . sleep ( 100L );
} catch ( InterruptedException e ) {
e . printStackTrace ();
}
}
KnnAudioRecommender recommender = new KnnAudioRecommender ();
if (! recommender . loadIndexDbIfExists ()) {
recommender . indexAll ( new File ( "music_samples" ). listFiles ( a -> a . getAbsolutePath (). toLowerCase (). endsWith ( ".au" )));
recommender . saveIndexDb ();
}
System . out . println ( userHistory . head ( 10 ));
int k = 10 ;
List < AudioSearchEntry > result = recommender . recommends ( userHistory . getHistory (), k );
for ( int i = 0 ; i < result . size (); ++ i ){
AudioSearchEntry entry = result . get ( i );
System . out . println ( "Search Result #" + ( i + 1 ) + ": " + entry . getPath ());
}
}
}