Встраивание аудио в Java
Текущий проект пытается разработать аудиокодер на чистом Java, который можно использовать в программах на чистом Java или Android. Такой аудиокодер можно использовать для классификации музыкальных жанров, поиска музыки или рекомендации музыки.
Текущий проект в настоящее время содержит две сети глубокого обучения, заимствованные из:
Обучение и проверка этих двух моделей показаны ниже:
Пакет машинного обучения в Java — это тензорный поток, он загружает предварительно обученную модель аудиоклассификатора (формат .pb). Модель аудиоклассификатора изначально была реализована и обучена с использованием Keras на Python. Эта обученная модель классификатора (в формате .h5) была затем преобразована в файл модели .pb, который можно напрямую загрузить с помощью тензорного потока в Java.
Обучение keras модели аудиоклассификатора можно найти в README_Training.md.
В приведенных ниже примерах кода показано, как использовать аудиоклассификатор cifar для прогнозирования жанров музыки:
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 );
}
}
}
В приведенных ниже примерах кода показано, как использовать аудиоклассификатор Resnet v2 для прогнозирования жанров музыки:
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 );
}
}
}
В приведенных ниже примерах кода показано, как использовать аудиоклассификатор cifar для кодирования аудиофайла в массив с плавающей запятой:
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 ));
}
}
}
В приведенных ниже примерах кода показано, как с помощью аудиоклассификатора resnet v2 кодировать аудиофайл в массив с плавающей запятой:
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 ));
}
}
}
В примерах кода ниже показано, как индексировать и искать аудиофайл с помощью класса 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 () + ")" );
}
}
}
В приведенных ниже примерах кода показано, как рекомендовать музыку на основе музыкальной истории пользователя с помощью класса 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 ());
}
}
}