본문 바로가기
AI Project/Edge AI Agent - 음성처리(연구,분석,검증))

[개발문서-1] #9. Edge Agent AI 음성처리 : 대규모 배치 자동화 및 태스크 기반 데이터 관리 아키텍처 구현 - 테스트자동화 Tool 구현

by 으노으뇨 2026. 5. 10.
728x90
반응형
SMALL

1. 개요

본 포스팅에서는 지난 포스팅에서 구축한 Vosk + Whisper.cpp 하이브리드 파이프라인을 실무 환경에 적용하기 위한 운영 고도화 과정을 다룹니다.

[비교/검증-6] #8. Edge Agent AI 음성처리 : Vosk + Whisper.cpp 하이브리드 파이프라인 구축 및 X-Vector 기반 화자 식별 알고리즘 검증

 

[비교/검증-6] #8. Edge Agent AI 음성처리 : Vosk + Whisper.cpp 하이브리드 파이프라인 구축 및 X-Vector 기반

제 포스팅은 AI가 작성한게 아닌 한글자 한글자 타자를 쳐서 작성한 포스팅입니다. 구독 좋아요 댓글은 힘이됩니다. 안녕하세요~~~!!! 지난 포스팅에서는 조금 알려진 STT +화자분리 되는 무료 엔

uno-kim.tistory.com

이젠 단순히 엔진의 구동 여부를 확인하는 단계를 넘어, 대량의 오디오 데이터를 체계적으로 처리하고 결과물의 무결성을 유지하기 위한 태스크 기반 데이터 관리 아키텍처를 구현하였습니다.

이번 프로젝트 깃 주소 : uno-km/AMEVA-STT-Agent
 

GitHub - uno-km/AMEVA-STT-Agent

Contribute to uno-km/AMEVA-STT-Agent development by creating an account on GitHub.

github.com

 

2. 주요 아키텍처 설계 변경 사항

단순한 엔진 구동을 넘어, 이번 업데이트의 핵심은 CLI에서 GUI로의 진화와 지능형 배치 프로세싱의 도입입니다.

이전의 연구 단계가 엔진의 가능성을 확인한 과정이었다면, 이제는 누구나 현업에서 즉시 사용할 수 있는 완성형 솔루션으로 탈바꿈하였습니다.

2.1. 사용자 중심의 Fine-grained GUI Control

기존에는 소스코드를 직접 수정하거나 복잡한 인자값을 터미널에 입력해야 했습니다. 

이제는 모든 핵심 파라미터를 직관적인 GUI Dashboard에서 제어할 수 있습니다.

  • 세부 조절의 자유도: max_offset(매핑 오차), speakers(화자 수), whisper_max_len(문장 분할 길이) 등 하이브리드 엔진의 핵심 변수들을 슬라이더와 스핀박스로 실시간 튜닝할 수 있습니다

  • 시각적 피드백: 파이프라인이 돌아가는 동안 실시간 시스템 로그와 화자 분리 클러스터링 차트가 눈앞에서 펼쳐집니다. 이는 단순한 툴을 넘어 데이터의 흐름을 지배하는 에이전트로서의 면모를 보여줍니다.

 

2.2. 압도적인 생산성

수많은 음성 녹음 파일이나 장시간 회의록을 일일이 하나씩 분석하던 시대는 끝났습니다. 

우리가 구현한 배치 자동화 시스템은 그야말로 압도적인 퍼포먼스를 자랑합니다.

  • 태스크 기반 자동 캡슐화: 사용자가 작업명만 입력하면, 에이전트가 수십 개의 파일을 알아서 스캔하고 최적의 경로에 태스크별 폴더를 생성하여 격리 저장합니다.

  • 무한 확장성: 1개의 파일이든 100개의 파일이든, 사용자는 버튼 한 번만 누르면 됩니다. 배치가 완료되는 순간, 모든 분석 결과가 통합된 full_result_set.csv가 생성되어 결과 보고가 훨씬 간편해졌습니다.

  • 중복작업 제외: 폴더내에 이미 처리된 파일이 있는경우 중복작업을 배제하기위해 완료테스크와 파일을 매핑하여 중복처리를 원천 차단합니다.

  • 동작로그 : 로그가 세세하게 찍히고 각 시간초의 음성들 보여줍니다. 시스템로그, 파이프라인 로그 모두 보여집니다.

2.3. 엔터프라이즈급 Centralized Data Management

단순히 파일을 생성하고 끝나는 것이 아닙니다. 에이전트의 모든 활동은 중앙 집중식 DB 아키텍처로 관리됩니다.

  • 중앙 DB 폴더링: db 폴더 하나에 실행 이력, 에러 로그, 화자 지문 매핑 정보가 체계적으로 쌓입니다. 이는 단순한 스크립트가 아니라 지속 가능한 데이터 자산 관리 시스템입니다.

csv 를 테이블처럼 이용하고있습니다.

  • 구조적 데이터화: 분석된 전사 텍스트가 태스크 ID와 매핑되어 CSV로 관리되는 구조는, 추후 빅데이터 분석이나 LLM 연동을 위한 완벽한 정제 데이터 공급원이 됩니다.

2.4 기술적 시너지와 파이프라인 오케스트레이션 (Technical Synergy & Orchestration)

본 시스템의 진정한 가치는 서로 다른 성격의 두 엔진인 Vosk와 Whisper.cpp를 하나의 유기적인 파이프라인으로 통합하여 각각의 장점을 극대화한 데 있습니다.

  • 이기종 엔진의 하이브리드 통합: 텍스트 변환 정확도는 높지만 화자 분리 기능이 부재한 Whisper.cpp와, 음성 인식 능력은 다소 부족하나 화자의 음향적 특징(X-Vector) 추출에 탁월한 Vosk를 정교하게 결합하였습니다. C++ 기반의 Whisper와 Python/C 기반의 Vosk가 협력하여 고정밀 전사와 화자 식별을 동시에 수행합니다.
  • X-Vector 기반 화자 지문 추출 및 클러스터링: Vosk 엔진을 활용하여 음성 데이터에서 화자별 고유 임베딩인 X-Vector를 추출합니다. 추출된 벡터 데이터는 코사인 유사도 연산과 K-Means 클러스터링 알고리즘을 거쳐 화자별 군집으로 나뉩니다.
    이를 통해 사전 등록되지 않은 화자라도 음성 톤과 특징만으로 완벽하게 구분해낼 수 있습니다.
    시계열 데이터 동기화 및 최단 거리 매핑: 두 엔진은 서로 다른 타임스탬프 오프셋을 가질 수 있습니다. 이를 해결하기 위해 절대 오차가 가장 작은 인접 데이터를 연결하는 최단 거리 매핑(Shortest Distance Mapping) 알고리즘을 자체 구현하였습니다. 
    Whisper가 작성한 텍스트 세그먼트와 Vosk가 감지한 화자 아이디를 시간 축 위에서 정밀하게 매칭하여 데이터 유실 없는 최종 스크립트를 생성합니다.
  • 자원 효율적 순차 실행 구조: 엣지 환경과 일반 PC 환경 모두에서 안정적인 구동을 위해 메모리 점유율을 최적화하였습니다. 두 엔진을 동시에 메모리에 적재하는 대신, 순차적으로 실행하여 RAM 부하를 최소화하고 중간 데이터를 구조화된 버퍼를 통해 전달함으로써 시스템 다운(OOM) 현상을 원천 차단하였습니다.

먼저 스위퍼 cpp를 통해 문장추출후 X-Vector 기반 화자 지문 추출 및 클러스터링을 시작합니다. 조금 걸립니다. 약 2분정도소요

클러스터링된 결과입니다.

화자분리가 된모습이며 이 한 배치 실행의 로그들은 아래처럼 저장됩니다.

3. 기술적 최적화 및 안정성 개선

이번 고도화 과정에서는 엔진의 성능만큼이나 사용자의 편의성과 시스템의 안정적인 상태 유지에 깊은 공을 들였습니다. 

실제 윈도우 환경에서 발생할 수 있는 여러 예외 상황을 해결함과 동시에, 에이전트 내부에서 모든 작업이 완결될 수 있도록 통합 환경을 구축하였습니다.

3.1 내장 익스플로러 통합 및 실시간 파일 브라우징

앱 내부에서 윈도우 탐색기를 별도로 열지 않고도 모든 결과물을 즉시 확인하고 관리할 수 있는 EXPLORER 패널을 통합하였습니다.

  • 지능형 파일 필터링: 프로젝트 경로 내의 수많은 파일 중 STT 분석과 관련된 오디오, JSON, CSV, TXT 파일만을 선별하여 보여줌으로써 작업의 집중도를 높였습니다.
  • 실시간 동기화: 파이프라인에서 생성되는 배치 폴더와 결과물들이 별도의 새로고침 없이 익스플로러 상에 실시간으로 반영되도록 QFileSystemModel 기반의 비동기 스캔 로직을 적용하였습니다.

3.2 모델 관리 최적화 및 세팅 영속성 구현

다양한 Whisper 모델과 커스텀 GGML 모델을 유연하게 제어하고, 사용자의 설정값이 앱 재시작 후에도 그대로 유지되도록 상태 관리 엔진을 고도화하였습니다.

Whisper의 기본모델글과 기타 모델선택을 눌러서(슈카월드를 학습시킨 tiny모델) 추가한 모습

  • 스마트 설정 보존(Persistence): 테마 설정, 모델 종류, 스레드 수, 배치 간격 등 사용자가 튜닝한 모든 파라미터는 앱 종료 시 settings.json에 정밀하게 기록됩니다. 다음 실행 시 에이전트는 이 파일을 분석하여 사용자가 마지막으로 작업했던 그 상태 그대로를 완벽하게 복원합니다.

  • 모델 선택의 유연성: 기본 제공 모델 외에 사용자가 직접 다운로드한 커스텀 모델 경로를 수동으로 추가할 수 있으며, 이 경로 역시 시스템 설정의 일부로 편입되어 드롭다운 리스트에 동적으로 관리됩니다.

3.3 GUI 제어 로직의 정밀화 및 예외 처리

사용자 인터페이스의 안정성 확보를 위해 백엔드와 프론트엔드 간의 시그널 교착 상태를 해결하였습니다.

  • 시그널 루프 차단: 콤보박스나 체크박스 조작 시 발생할 수 있는 이벤트 중복 호출을 blockSignals 메커니즘으로 원천 차단하여 UI의 끊김 없는 반응성을 확보하였습니다.
  • 파일 시스템 예외 방어: 윈도우 특유의 파일 잠금 메커니즘으로 발생하는 액세스 거부 경고나, 상대 경로 처리 시 발생할 수 있는 경로 탐색 오류를 해결하기 위해 전역적인 디렉토리 검증 로직을 적용하였습니다.
  • 글로벌 폰트 최적화: 고해상도 환경에서 폰트 렌더링 에러를 방지하기 위해 맑은 고딕을 기본 폰트로 고정하여 시각적인 안정성까지 보완하였습니다.

4. 하이브리드 파이프라인 구축 및 트러블슈팅

개발자나 혹여 관심있는분들은 참고하시면 좋겠습니다.

더보기

Vosk와 Whisper.cpp라는 서로 다른 두 엔진을 윈도우 환경에서 하나의 유기적인 시스템으로 엮는 과정은 예상보다 훨씬 복잡한 공학적 도전이었습니다.

 

1. 이기종 엔진 간의 시각 동기화

문제점: Whisper.cpp가 출력하는 텍스트 세그먼트의 타임스탬프와 Vosk가 분석한 화자 교대 시점이 미세하게 어긋나는 현상이 발생했습니다. 이는 각 엔진이 오디오 데이터를 처리하는 클럭 주기가 미세하게 다르기 때문이었습니다.

해결책: 최단 거리 매핑 알고리즘을 도입하였습니다. 각 STT 문장의 중앙값 시간을 계산하고, 해당 시점과 가장 인접한 화자 클러스터 정보를 1:1로 매칭하는 로직입니다. 또한, GUI 상에서 사용자가 max_offset 파라미터를 직접 조절할 수 있게 하여, 오디오 환경에 따른 미세 튜닝이 가능하도록 구현하였습니다.

2. 윈도우 파일 시스템의 엄격한 잠금 매커니즘

문제점: 윈도우는 리눅스와 달리 파일이나 디렉토리 핸들에 매우 엄격합니다. 배치 프로세스가 새로운 폴더를 생성하고 즉시 파일을 쓰기 시작할 때, 동시에 GUI의 익스플로러 패널이 해당 경로를 스캔하려고 시도하면서 액세스 거부 오류가 빈번하게 발생했습니다.

해결책: 파일 입출력 전후에 명확한 선행 로직을 배치하고, os.makedirs 호출 시 발생할 수 있는 빈 문자열 예외를 방어하기 위해 절대 경로 변환 로직을 강화하였습니다. 또한, QFileSystemModel의 비동기 업데이트 주기를 조절하여 시스템 부하를 분산시켰습니다.

3. 엑셀 호환성을 위한 인코딩 지옥

문제점: 분석 결과를 일반적인 UTF-8로 저장했을 때, 윈도우용 엑셀에서 한글 전사 스크립트가 깨져 보이는 문제가 지속되었습니다. 이는 엑셀이 BOM(Byte Order Mark)이 없는 UTF-8 파일을 인식하지 못해 발생하는 고질적인 문제였습니다.

해결책: 모든 CSV 출력 로직에 utf-8-sig 인코딩을 강제 적용하였습니다. 이를 통해 사용자가 분석 완료 후 별도의 변환 과정 없이 더블 클릭만으로 엑셀에서 정돈된 한글 리포트를 즉시 확인할 수 있는 환경을 구축하였습니다.

4. GUI 반응성 확보를 위한 멀티스레딩 아키텍처

문제점: STT 파이프라인은 CPU를 100% 가깝게 사용하는 무거운 작업입니다. 이를 메인 GUI 스레드에서 실행할 경우, 분석이 끝날 때까지 앱이 응답 없음 상태에 빠지게 됩니다.

해결책: QThread 기반의 PipelineWorker 아키텍처를 설계하였습니다. 모든 무거운 연산은 백그라운드 스레드에서 수행되고, GUI는 시그널 시스템을 통해 실시간 로그와 차트 데이터만 전달받아 업데이트함으로써 배치 작업 중에도 사용자가 설정을 변경하거나 익스플로러를 브라우징할 수 있는 쾌적한 환경을 유지하였습니다.

5. 화자 분리 정밀도 향상

문제점: 오디오 신호가 낮거나 배경 소음이 심한 구간에서 화자 특징(X-Vector)이 제대로 추출되지 않아 Unknown 화자로 분류되는 비중이 높았습니다.

해결책: 클러스터링 알고리즘 전 단계에 정밀한 VAD필터를 적용하여 유의미한 음성 구간만을 선별하도록 하였고, 사용자가 예상 화자 수를 지정하거나 자동으로 설정할 수 있는 옵션을 UI에 제공하여 상황별 최적의 분석 결과가 나오도록 유도하였습니다.

이처럼 우리가 겪은 트러블슈팅의 핵심은

 "서로 다른 것들을 어떻게 조화롭게 연결할 것인가"

에 있었습니다. 엔진 간의 간격, 파일 시스템의 제약, 그리고 사용자와 AI 사이의 인터페이스를 정밀하게 튜닝함으로써, 마침내 윈도우 환경에 완벽히 최적화된 에이전트를 완성할 수 있었습니다.


5. 결과

GUI 개발을 통해 느낀 점

기술의 시각화가 주는 신뢰감

 단순히 터미널에 텍스트가 올라가는 것과, 대시보드 위에서 실시간 로그와 화자 클러스터링 차트가 그려지는 것은 사용자 경험 측면에서 차원이 다른 신뢰를 줍니다. AI가 지금 무엇을 생각하고 어떤 데이터를 처리하는지 시각적으로 보여줌으로써, 복잡한 하이브리드 알고리즘이 단순한 블랙박스가 아닌 제어 가능한 도구로 느껴지게 되었습니다.

상태 관리의 중요성

버튼 하나를 누르는 이면에는 설정값의 영속성(Persistence), 백그라운드 워커의 생명주기 관리, 윈도우 파일 시스템의 잠금 메커니즘 대응 등 수많은 설계적 고민이 필요했습니다. 이를 하나하나 해결하며 시스템이 견고해지는 과정을 통해, 진정한 의미의 에이전트 소프트웨어란 무엇인가를 깊이 체감할 수 있었습니다.

사용자 중심의 설계

개발자가 소스 코드를 수정하는 방식에서 벗어나, 사용자가 슬라이더와 콤보박스로 수천 개의 변수를 튜닝할 수 있게 만든 것은 기술의 문턱을 낮추는 핵심적인 과정이었습니다. 특히 익스플로러를 내장하여 앱 안에서 모든 작업 흐름이 완결되도록 만든 점은 생산성 향상의 핵심 포인트였다고 생각합니다.


자율적 워크플로우의 완성

분석 버튼을 누르고 컴퓨터를 떠날 수 있다는 것은 단순히 편리함을 넘어 업무의 패러다임이 바뀌었음을 의미합니다. 

수백 개의 파일을 던져두면 에이전트가 알아서 경로를 만들고, 엔진을 교체하며, 최종 결과 리포트까지 책상 위에 올려둡니다.

 이러한 '방치형' 자동화를 통해 인간은 반복적인 연산 업무에서 해방되어, AI가 정제해준 데이터를 바탕으로 더 가치 있는 의사결정에만 집중할 수 있게 되었습니다. 

결국 이 프로젝트의 끝은 단순한 STT가 아니라, 인간의 시간을 벌어주는 진정한 의미의

디지털 파트너(Digital Partner)를 구축하는 것이었습니다.

긴 글 읽어주셔서 감사합니다. 다음 포스팅은 이제 윈도우에서 화자분리 스몰,미디움, 라지, 터보 모델들을 모두 쥐어짜서 동작시킨다음 결과를 분석/검증해보는 글로 찾아뵙겠습니다. 

감사합니다.

728x90
반응형
LIST

댓글