ABOUT ME

-

  • 어플에서 동일한 코드지만 기기에 따라 음성인식이 안 되는 이유
    프로그래밍/기계학습 2025. 4. 1. 15:07
    반응형

     

     

     

    안드로이드 어플에서 녹음해서 음성인식 API로 보내고 있는데 빈 결과가 리턴되어서 검색을 하다보니 

    기기 별로 음성파일 인코딩 이슈가 있을 수 있다고 한다. 

     

     

     

    📱 어플에서 음성 재생: ✅ 잘 됨

    → 이건 그냥 오디오 플레이어가 PCM 데이터만 제대로 있으면 재생해주기 때문이에요.
    WAV 헤더가 조금 이상해도 재생은 "억지로" 해줍니다.

     

     


     

    참고로 음성파일 형식 설명 

     

     

     

     

     

     

     

     

     


     

     
     
     
     
     
     

     
     
     
    일단 음성인식이 안되는 원인은 확인했는데 그렇다면 왜 WAV 파일이 생성이 제대로 안된것일까..? 
     

     

    로컬 디바이스(=핸드폰 기기)에 따라 WAV 파일 생성 결과가 달라질 수 있습니다.

    이게 진짜 어이없지만 현실입니다.


    😤 왜 WAV 생성 결과가 기기 따라 다를 수 있나?

    1. flutter_sound 패키지가 네이티브 코드(Android/iOS)를 사용하는 구조라서

    • Codec.pcm16은 내부적으로 Android에서는 AudioRecord, iOS에선 AVAudioEngine 등을 이용해 플랫폼 네이티브 방식으로 raw PCM 데이터를 저장합니다.
    • 근데 플랫폼마다 마이크 장치, 드라이버, 샘플 정렬 방식, 비트 순서 등이 미세하게 다름.
    • 즉, 어떤 디바이스에서는 바이트 정렬이 다르거나 샘플링 간격이 미묘하게 틀어질 수도 있습니다.

    2. pcm16WAV도 마찬가지 — 기기에 따라 헤더 포함 여부가 달라질 수 있음

    • flutter_sound에서 Codec.pcm16WAV는 플랫폼별로 다르게 구현됨.
    • 어떤 Android 기기에서는 WAV 헤더 없이 PCM만 저장하는 버그가 발생한 전례 있음.
    • 특히 삼성 일부 기기, 저가형 기기, 특정 안드로이드 버전 조합에서 자주 보고됨.

    3. 샘플레이트, 채널 수, 비트뎁스 제한이 기기마다 다름

    • 예: 어떤 기기는 44100Hz만 지원하고 16000Hz 녹음을 강제로 업샘플링함.
    • 그러면 STT API에선 샘플레이트 mismatch 오류가 납니다.

    🔥 그래서 왜 문제냐?

    동일한 코드로 .wav를 생성했더라도, 🔸 어떤 기기는 STT API 통과,
    🔸 다른 기기는 "WAV 형식 아님" 오류가 날 수 있습니다.

    그리고 이게 디버깅이 어려운 최악의 문제 유형입니다.


    ✅ 막내 추천 전략

    전략설명
    📦 PCM만 저장 후 헤더 수동 생성 → 지금처럼 .raw 생성하고 WavHeader.createHeader()로 WAV 생성 (가장 안정적)
    🔍 헤더 검사 코드 포함 → debugWavHeader() 같은 함수로 생성 직후 헤더 검사
    ☁️ 서버에서 WAV 재검증 or 변환 → Firebase Storage 업로드 후, Cloud Function에서 ffmpeg로 검증 or 재인코딩
    🧪 다양한 기기 테스트 → 삼성, LG, 샤오미 등 다양한 디바이스에서 확인 필요

    🎯 요약

    질문답
    기기에 따라 WAV 파일 다르게 생성될 수 있어? ✅ 예
    그러면 어떤 기기에서만 STT 오류 날 수도 있어? ✅ 예
    해결 방법은? ✅ 수동 헤더 생성 + 자동 검사 + 서버 보정

    행님, “동일한 코드지만 기기에 따라 음성인식이 안 되는 이유”
    이제 확실히 감 잡히셨습니까?

    필요하시면 기기 자동 판별 후 보정 로직도 같이 만들어드릴 수 있습니다.
    또 도와드릴 일 있으면 언제든 불러주이소 😎🔥

    728x90
    반응형
Designed by Tistory.