DeEAR 오디오 이모션 분석 시스템 구현: 웹 대시보드 및 REST API 통합 실무

1. 기술 개요 및 작동 원리

DeEAR 는 음향 신호의 미세한 뉘앙스를 감지하여 인간과 기기의 상호작용을 더 정교하게 만드는 도구입니다. 이는 wav2vec2 기반의 딥러닝 모델을 적용하여 청각 데이터의 특성을 학습했습니다.

시스템이 추출하는 핵심 지표는 다음과 같습니다:

  • Arousal(각성도): 화자의 흥분 정도 또는 침착함 여부 평가
  • Nature(자연스러움): 구어의 자연스러운 발음 패턴 분석
  • Prosody(운율): 말하는 속도와 리듬 변화 측정

본 가이드에서는 배포 설정부터 인터페이스 사용, 프로그램화된 API 처리까지 전 과정을 다룹니다.

2. 시스템 구성 요건

안정적인 성능 관리를 위해 아래 하드웨어 및 소프트웨어 조건을 확인하십시오.

  • OS: Ubuntu 20.04 이상의 리눅스 배포판 권장
  • Runtime: Python 3.11 이상 환경
  • Memory: 최소 8GB RAM 확보 필요
  • Compute: CUDA 호환 GPU 설치 시 추론 속도 개선 가능

3. 서비스 시작 및 진입

3.1 실행 스크립트 호출

주요 로직을 수행하려면 메인 스크립트를 실행해야 합니다. 루트 디렉터리의 스크립트를 사용하는 것이 권장됩니다.

/root/DeEAR_Base/start.sh

대체 방법으로 직접 애플리케이션 파일을 실행할 수도 있습니다.

python /root/DeEAR_Base/app.py

구성이 완료되면 브라우저용 링크가 출력되는데, 예시는 다음과 같습니다:

Running on local URL: http://localhost:7860

4. 웹 인터페이스 활용법

4.1 접속 경로 설정

로컬 머신에서 테스트하거나 원격 서버에 접근할 수 있습니다:

  • Local: http://127.0.0.1:7860
  • Remote: http://{SERVER_IP}:7860

4.2 주요 기능 영역

메인 화면은 세 가지 핵심 모듈로 나뉩니다:

  1. 입력 섹션: 로컬 저장소로부터 오디오 데이터를 업로드합니다. .wav 또는 .mp3 포맷이 지원되며 길이는 최대 30 초까지 제한됩니다.
  2. 미세 조정 옵션: 마이크 아이콘을 눌러 실시간 녹음이 가능합니다. 종료 시 즉시 처리됩니다.
  3. 출력 패널: 분석된 파라미터는 표 형태로 정리되며, 각 항목별 점수 (Score) 와 라벨 (Label) 이 표시됩니다. 시각화를 위한 차트 또한 제공합니다.

4.3 실제 적용 사례

고객 센터 녹음 데이터를 분석해 보겠습니다. 파일을 선택하고 처리 대기 후 다음 결과를 확인할 수 있습니다:

속성판단
Arousal0.72High
Nature0.85Natural
Prosody0.68Rhythmic

이 수치들은 대응 직원의 긍정적 태도와 명료한 의사 전달 능력을 시사합니다.

5. 프로그래밍 인터페이스 (API)

대규모 배치 작업을 위해서는 클라이언트 라이브러리를 통한 HTTP 통신이 효율적입니다.

5.1 엔드포인트 정보

  • URI: http://{SERVER_URL}:7860/api/predict
  • Method: POST
  • Payload: Multipart Form Data

5.2 클라이언트 코드 작성

requests 라이브러리를 사용하여 요청을 전송하고 응답을 파싱합니다.

import requests
from pathlib import Path

def send_analysis_request(file_path: str) -> dict:
    url = "http://localhost:7860/api/predict"
    
    # 바이너리 파일 읽기
    with open(file_path, 'rb') as f:
        files = {"file": f}
        
        try:
            resp = requests.post(url, files=files, timeout=30)
            resp.raise_for_status()
            return resp.json()
        except Exception as e:
            print(f"Error occurred: {e}")
            return {}

# 호출 예시
result_data = send_analysis_request("test_audio.wav")
print(result_data)

5.3 응답 객체 해석

서버에서 반환되는 JSON 형식은 구조화된 데이터를 포함합니다:

{
    "arousal": {"score": 0.72, "label": "high"},
    "nature": {"score": 0.85, "label": "natural"},
    "prosody": {"score": 0.68, "label": "rhythmic"}
}

5.4 대량 처리 확장

여러 파일을 자동화하려면 디렉토리 내 모든 파일을 순회하며 제출하는 로직을 사용합니다.

import glob

directory_path = "./datasets/"
paths = glob.glob(f"{directory_path}*.wav")

for audio_file in paths:
    # 각 파일 분석 로직 호출
    output = send_analysis_request(audio_file)
    # 결과 저장은 별도 모듈 관리

6. 결과 데이터 관리 및 통계

분석된 값은 외부 시스템으로 가져와야 합니다. Gradio 상단 메뉴의 내보내기 기능을 통해 CSV 또는 JSON 포맷을 받을 수 있습니다.

6.1 Python 을 통한 데이터 가공

데이터프레임 생성 및 저장을 위해 pandas 를 활용하세요.

import pandas as pd

collected_records = []
# ... (API 호출 과정 생략) ...
collect_data.append(response_json)

analysis_df = pd.DataFrame(collected_records)
analysis_df.to_csv("analysis_log.csv", index=False)

6.2 분포 시각화

수집된 데이터셋에서 특정 변량의 빈도를 그래프로 확인합니다.

import matplotlib.pyplot as plt

chart_df = pd.read_csv("analysis_log.csv")
chart_df["arousal_label"].value_counts().plot.bar(color='steelblue')
plt.title("각성도 별 분류 개수")
plt.xlabel("Category")
plt.ylabel("Count")
plt.show()

7. 기술적 제약 사항 및 최적화

7.1 오디오 길이 제한

추론 정확도와 반응 속도의 균형을 위해 30 초 이상의 입력은 자동으로 단축되거나 거부될 수 있습니다. 긴 세그먼트를 처리할 때는 사전에 분할(pre-split) 하십시오.

7.2 처리 성능 향상

서버 부하가 높은 경우 다음 전략을 고려하십시오:

  1. 비디오 카드로 가속化处理 가능한 경우 CUDA 환경 활성화
  2. 처리할 오디오 구간을 10~15 초 범위로 축소
  3. 멀티 프로세스 병렬 처리 시 동시성 유지 (권장 4 스레드 이내)

7.3 데이터 품질 관리

오류율을 줄이기 위해 녹음 환경을 점검해야 합니다.

  • 배경 소음을 최소화한 무음 공간 사용
  • 마이크와 화자 간 거리 유지 (최적 범위 20~50cm)
  • 음악이나 추가 사운드 제거

태그: DeEAR Voice Emotion Recognition Gradio REST API wav2vec2

9월 8일 16:17에 게시됨