Ak-mong / HeSap

마λ₯΄μ‹œμŠ€ κΈ°μ—… 연계 ν”„λ‘œμ νŠΈ
0 stars 0 forks source link

πŸ“… κΈ°κ°„

2024.10.14 ~ 2024.11.19

β„Ή ν”„λ‘œμ νŠΈ μ†Œκ°œ

μ‚¬μš©μžκ°€ νŠΉμ • 단어(ν˜ΈμΆœμ–΄)λ₯Ό λ°œν™”ν–ˆμ„ λ•Œ 이λ₯Ό μΈμ‹ν•˜κ³ , 이후 μŒμ„± λͺ…령에 따라 λ°˜μ‘ν•˜λŠ” μ‹€μ‹œκ°„ μŒμ„± 인식 μ•ˆλ“œλ‘œμ΄λ“œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μž…λ‹ˆλ‹€.

μ‚¬μš©μžκ°€ μŒμ„± 인식 AI λͺ¨λΈμ„ μ†μ‰½κ²Œ κ΅¬μΆ•ν•˜κ³  μ•ˆλ“œλ‘œμ΄λ“œ 기기에 ν¬νŒ…ν•  수 μžˆλ„λ‘ λ‹€μ–‘ν•œ 예제 λ¬Έμ„œμ™€ 도ꡬλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

이λ₯Ό 톡해 μ‚¬μš©μžλŠ” κ°„λ‹¨ν•˜κ²Œ μŒμ„± 인식 λͺ¨λΈμ„ λ§Œλ“€κ³ , μ•ˆλ“œλ‘œμ΄λ“œ 기반의 μ˜¨λ””λ°”μ΄μŠ€ AI 예제λ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ£Όμš”κΈ°λŠ₯

1. μ‹€μ‹œκ°„ ν˜ΈμΆœμ–΄ 인식 (Keyword Spotting)

2. λͺ…λ Ήμ–΄ 인식 및 κΈ°λŠ₯ μ œμ–΄

3. μ•ˆλ“œλ‘œμ΄λ“œ μ˜¨λ””λ°”μ΄μŠ€ AI

mockup

πŸ›  μ‹œμž‘ν•˜κΈ°

1️⃣ μŒμ„± 데이터 μ€€λΉ„ν•˜κΈ°

ν”„λ‘œμ νŠΈλŠ” λ‹€μŒ μŠ€νŽ™μ˜ μŒμ„± 데이터λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€:

service/HotWordService.kt

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. 파이썬 라이브러리

2. FFmpeg μ„€μΉ˜

πŸ”„ M4A β†’ WAV λ³€ν™˜

πŸ”Š μ˜€λ””μ˜€ 증강

μ‚¬μš©λ²•

  1. 슀크립트 μ‹€ν–‰
    λ³€ν™˜ 및 증강 μž‘μ—… μˆ˜ν–‰:
    
    python augment_wav_files.py
  2. κ²°κ³Ό 확인 λ³€ν™˜λœ 파일: output/converted_files/ μ¦κ°•λœ 파일: output/augmented_files/

πŸ“‚ 폴더ꡬ쑰

μ‹€ν–‰μ „

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 λͺ¨λΈμ„ μ‰½κ²Œ μΆ”κ°€ν•˜κ³  λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μŒμ„± 데이터 AI ν•™μŠ΅

λ³€ν™˜ λ¬Έμ„œ 예제λ₯Ό 톡해 사전에 μ€€λΉ„λœ μŒμ„± 데이터λ₯Ό ν•™μŠ΅μ‹œν‚€κ³  tflite / pytorch λͺ¨λΈλ‘œ λ³€ν™˜ ν›„ μ•ˆλ“œλ‘œμ΄λ“œ 기반 컨버젼을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

CNN / RNN

AudioClassifier

   private static final String MODEL_FILE = "CNN_or_RNN_Model.tflite";

asset 폴더에 tflite둜 λ³€ν™˜ν•œ CNN / RNN λͺ¨λΈ 경둜λ₯Ό λͺ…μ‹œν•΄μ€λ‹ˆλ‹€.

μ•„λž˜ 예제λ₯Ό 톡해 CNN λͺ¨λΈμ„ 톡해 AI λͺ¨λΈμ„ ν•™μŠ΅μ‹œν‚€κ³  tflite둜 λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

CNN ν•™μŠ΅ 및 tflite λ³€ν™˜ 예제

Resnet

ResnetClassifier

 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둜 λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

RESNET ν•™μŠ΅ 및 PyTorch λ³€ν™˜ 예제