การฝังเสียงใน Java
โปรเจ็กต์ปัจจุบันพยายามพัฒนาตัวเข้ารหัสเสียง Java ล้วนๆ ที่สามารถใช้ในโปรแกรม Java หรือ Android ล้วนๆ ตัวเข้ารหัสเสียงดังกล่าวสามารถใช้สำหรับการจัดหมวดหมู่แนวเพลงหรือการค้นหาเพลงหรือผู้แนะนำเพลง
โครงการปัจจุบันประกอบด้วยเครือข่ายการเรียนรู้เชิงลึกสองเครือข่ายที่นำมาใช้จาก:
การฝึกอบรมและการตรวจสอบความถูกต้องของทั้งสองรุ่นนี้มีดังต่อไปนี้:
แพ็คเกจแมชชีนเลิร์นนิงใน Java เป็นแบบเทนเซอร์โฟลว์ ซึ่งจะโหลดโมเดลตัวแยกประเภทเสียงที่ได้รับการฝึกไว้ล่วงหน้า (รูปแบบ .pb) เดิมทีโมเดลตัวแยกประเภทเสียงถูกนำมาใช้และฝึกฝนโดยใช้ Keras ใน Python จากนั้นโมเดลลักษณนามที่ได้รับการฝึกอบรมนี้ (ในรูปแบบ .h5) จะถูกแปลงเป็นไฟล์โมเดล .pb ซึ่งสามารถโหลดได้โดยตรงโดย tensorflow ใน Java
คุณสามารถดูการฝึกอบรม keras ของโมเดลตัวแยกประเภทเสียงได้ใน README_Training.md
โค้ดตัวอย่างด้านล่างแสดงวิธีใช้ตัวแยกประเภทเสียงซิฟาร์เพื่อทำนายแนวเพลง:
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 );
}
}
}
โค้ดตัวอย่างด้านล่างแสดงวิธีใช้ตัวแยกประเภทเสียงซิฟาร์เพื่อเข้ารหัสไฟล์เสียงลงในอาร์เรย์ทศนิยม:
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 audio classifier เพื่อเข้ารหัสไฟล์เสียงลงในอาร์เรย์ float:
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 ());
}
}
}