2024.10.14 ~ 2024.11.19
μ¬μ©μκ° νΉμ λ¨μ΄(νΈμΆμ΄)λ₯Ό λ°ννμ λ μ΄λ₯Ό μΈμνκ³ , μ΄ν μμ± λͺ λ Ήμ λ°λΌ λ°μνλ μ€μκ° μμ± μΈμ μλλ‘μ΄λ μ΄ν리μΌμ΄μ μ λλ€.
μ¬μ©μκ° μμ± μΈμ AI λͺ¨λΈμ μμ½κ² ꡬμΆνκ³ μλλ‘μ΄λ κΈ°κΈ°μ ν¬ν ν μ μλλ‘ λ€μν μμ λ¬Έμμ λꡬλ₯Ό μ 곡ν©λλ€.
μ΄λ₯Ό ν΅ν΄ μ¬μ©μλ κ°λ¨νκ² μμ± μΈμ λͺ¨λΈμ λ§λ€κ³ , μλλ‘μ΄λ κΈ°λ°μ μ¨λλ°μ΄μ€ AI μμ λ₯Ό μ€νν μ μμ΅λλ€.
νλ‘μ νΈλ λ€μ μ€νμ μμ± λ°μ΄ν°λ₯Ό μ¬μ©ν©λλ€:
object AudioConstants {
const val THRESHOLD = 0.95 // νΈμΆμ΄ μ±κ³΅ μ¬λΆ νλ¨μ μν μκ³κ°
const val SAMPLE_RATE = 16000 // μν λ μ΄νΈ 16KHz (16000Hz)
const val RECORDING_TIME = 2 // λ
Ήμ μκ° (2μ΄)
const val WINDOW_SIZE = SAMPLE_RATE * RECORDING_TIME // μ 체 window size
const val STEP_SIZE = SAMPLE_RATE / 2 // sliding window μ¬μ΄μ¦ (κ²ΉμΉλ ꡬκ°)
}
λ³μλ€μ ν΅ν΄ λ€μν λ Ήμ κ΄λ ¨ μ€μ μ λ³κ²½ν μ μμ΅λλ€.
ν΄λΉ νλ‘μ νΈλ M4A νμμ μ€λμ€ νμΌμ WAV νμμΌλ‘ λ³ννκ³ , νμ€ν(κΈΈμ΄, μνλ μ΄νΈ) λ° λ°μ΄ν° μ¦κ°μ ν΅ν΄ λ€μν μ€λμ€ μνμ μμ±ν μ μλ Python μ€ν¬λ¦½νΈλ₯Ό μ 곡ν©λλ€.
μ΄λ₯Ό νμ©ν΄ λΆμ‘±ν μμ± λ°μ΄ν°λ₯Ό μ¦κ°μμΌ νμ΅ μ νλλ₯Ό λμΌ μ μμ΅λλ€.
1. νμ΄μ¬ λΌμ΄λΈλ¬λ¦¬
pydub
, librosa
, soundfile
, audiomentations
pip install pydub librosa soundfile audiomentations
2. FFmpeg μ€μΉ
π M4A β WAV λ³ν
π μ€λμ€ μ¦κ°
python augment_wav_files.py
project/
βββ m4a_files/
β βββ file1.m4a
β βββ file2.m4a
project/
βββ output/
β βββ converted_files/
β β βββ file1.wav
β βββ augmented_files/
β βββ aug_file1_1.wav
// λͺ¨λΈ νμ
enum class ModelType {
RESNET, CNN, GRU
}
var MODEL_TYPE: ModelType = ModelType.CNN
ModelType ν΅ν΄ μλ‘μ΄ AI λͺ¨λΈμ μ½κ² μΆκ°νκ³ λ³κ²½ν μ μμ΅λλ€.
λ³ν λ¬Έμ μμ λ₯Ό ν΅ν΄ μ¬μ μ μ€λΉλ μμ± λ°μ΄ν°λ₯Ό νμ΅μν€κ³ tflite / pytorch λͺ¨λΈλ‘ λ³ν ν μλλ‘μ΄λ κΈ°λ° μ»¨λ²μ Όμ ν μ μμ΅λλ€.
private static final String MODEL_FILE = "CNN_or_RNN_Model.tflite";
asset ν΄λμ tfliteλ‘ λ³νν CNN / RNN λͺ¨λΈ κ²½λ‘λ₯Ό λͺ μν΄μ€λλ€.
μλ μμ λ₯Ό ν΅ν΄ CNN λͺ¨λΈμ ν΅ν΄ AI λͺ¨λΈμ νμ΅μν€κ³ tfliteλ‘ λ³νν μ μμ΅λλ€.
CNN νμ΅ λ° tflite λ³ν μμ
private final String[] labels = {
"_silence_",
"_unknown_",
"down",
"go",
"left",
"no",
"off",
"on",
"right",
"stop",
"up",
"yes",
"hey_ssafy" // νΈμΆμ΄ μΈμμ μν λ¨μ΄ λ μ΄λΈ μΆκ°
};
labelμ 컀μ€ν νΈμΆμ΄ λ μ΄λΈμ μΆκ°ν©λλ€.
private static final String MEL_MODEL_PATH = "mel_spectogram_convert_model.ptl";
private static final String RESNET_MODEL_PATH = "trigger_word_detection_model_with_ResNet.ptl";
Asset ν΄λμ μ½μ ν AI λͺ¨λΈμ λ³νν PyTorch Script νμΌμ λΆλ¬μ΅λλ€.
μλ μμ λ₯Ό ν΅ν΄ RESNET λͺ¨λΈμ ν΅ν΄ AI λͺ¨λΈμ νμ΅μν€κ³ pytorchλ‘ λ³νν μ μμ΅λλ€.