# java-tensorflow-music
**Repository Path**: evani/java-tensorflow-music
## Basic Information
- **Project Name**: java-tensorflow-music
- **Description**: Music classification, music search, music recommender and music encoder implemented in Tensorflow and Java
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2019-05-12
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# java-tensorflow-music
Music classification, music search, music recommender and music encoder implemented in Tensorflow and Java
The trained models were obtained from the [Keras audio deep learning project](https://github.com/chen0040/java-audio-embedding)
# Install
Add the following dependency to your POM file:
```xml
com.github.chen0040
java-tensorflow-music
1.0.1
```
# Usage
### Run audio classifier in Java
The [sample codes](java_audio_classifier/src/main/java/com/github/chen0040/tensorflow/classifiers/demo/Cifar10AudioClassifierDemo.java)
below shows how to use the cifar audio classifier to predict the genres of music:
```java
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) {
Cifar10AudioClassifier classifier = new Cifar10AudioClassifier();
classifier.load_model();
List 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);
}
}
}
```
The [sample codes](java_audio_classifier/src/main/java/com/github/chen0040/tensorflow/classifiers/demo/ResNetV2AudioClassifierDemo.java)
below shows how to use the resnet v2 audio classifier to predict the genres of music:
```java
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) {
ResNetV2AudioClassifier classifier = new ResNetV2AudioClassifier();
classifier.load_model();
List 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);
}
}
}
```
### Extract features from audio in Java
The [sample codes](java_audio_classifier/src/main/java/com/github/chen0040/tensorflow/classifiers/demo/Cifar10AudioEncoderDemo.java)
below shows how to use the cifar audio classifier to encode an audio file into an float array:
```java
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){
Cifar10AudioClassifier classifier = new Cifar10AudioClassifier();
classifier.load_model();
List 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));
}
}
}
```
The [sample codes](java_audio_classifier/src/main/java/com/github/chen0040/tensorflow/classifiers/demo/ResNetV2AudioEncoderDemo.java)
below shows how to the resnet v2 audio classifier to encode an audio file into an float array:
```java
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) {
ResNetV2AudioClassifier classifier = new ResNetV2AudioClassifier();
classifier.load_model();
List 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));
}
}
}
```
### Audio Search Engine
The [sample codes](java_audio_search/src/main/java/com/github/chen0040/tensorflow/search/AudioSearchEngineDemo.java)
below shows how to index and search for audio file using the [AudioSearchEngine](java_audio_search/src/main/java/com/github/chen0040/tensorflow/search/models/AudioSearchEngine.java) class:
```java
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 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() + ")");
}
}
}
```
### Music Recommend-er
The [sample codes](java_audio_recommender/src/main/java/com/github/chen0040/tensorflow/search/KnnAudioRecommenderDemo.java)
below shows how to recommend musics based on user's music history using the [KnnAudioRecommender](java_audio_recommender/src/main/java/com/github/chen0040/tensorflow/search/models/KnnAudioRecommender.java) class:
```java
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){
// create fake listening history of songs
AudioUserHistory userHistory = new AudioUserHistory();
List 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 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());
}
}
}
```