SoundFlow 음성 연속성 패치 기술 리뷰
문제
- 원본 빌드의 직접 루프백 59.987 stream-min에서 정확한 64샘플(4 ms) 무음 삽입 2회가 확인되었습니다.
- 각 무음 구간 뒤에 64샘플 source skip이 발생해 음성 일부가 중복 없이 건너뛰어졌습니다.
- 입력 큐가 밀리면 기존 처리 방식이 큐 전체를 비워 최대 약 320 ms의 음성을 한 번에 버릴 수 있습니다.
- 이 현상은 KWS의 발화 시작·끝 검출과 STT의 단어/음절 연결에 불리하게 작용할 수 있습니다.
원인
1. 재생·녹음 시간 비교의 스냅샷 불일치
재생 시각과 녹음 시각을 서로 다른 순간에 읽어 비교하면 커널 jiffies 증가 경계에서 두 값의 기준 시점이 달라질 수 있습니다. 이때 부족하다고 판단한 64샘플을 0으로 채우고, 반대로 다음 구간에서 source 샘플이 건너뛰어질 수 있습니다.
2. 큐 overflow 시 전체 삭제
16 kHz에서 1,024샘플 버퍼는 64 ms입니다. 큐가 4개로 제한된 상태에서 overflow가 발생하면 기존 clear()가 누적 버퍼를 모두 삭제해 최대 약 320 ms 손실을 만들 수 있습니다.
해결 접근 방안
sndflow.c에서 재생·녹음 시간 차이를 계산하기 전에jiffies를 한 번만 읽어 동일 스냅샷을 사용합니다.SoundFlowInput.cpp에서 overflow 시 전체clear()대신 가장 오래된 버퍼 하나만pop_front()합니다.- overflow 로그는 mutex 보호 구간 밖에서 제한적으로 출력해 오디오 처리 잠금 시간을 늘리지 않습니다.
- 근본적인 producer/consumer 지연은 별도 장시간 캡처와 KWS/STT 발화셋으로 추가 검증합니다.
패치 적용 결과
- 패치 빌드의 직접 루프백 63.042 stream-min 정상 구간에서 64샘플 무음, phase jump, source skip이 모두 0회였습니다.
- overflow 자체는 재현됐지만,
pop_front()로 한 번에 제거되는 범위가 약 64 ms로 제한되었습니다. - 이 결과는 파형 연속성 개선을 의미하며, KWS/STT 인식률 개선을 직접 측정한 결과는 아닙니다.
패치 파일 명
적용 패치
0001-soundflow-use-common-jiffies-snapshot.patch0002-soundflow-drop-oldest-buffer-on-overflow.patch
빌드 산출물
soundflowservicesndflow.kolibKardome.so
관련 하위 문서
| 문서 | 내용 |
|---|---|
| 실기기 A/B 검증 | 원본·패치 설치, 재부팅, 7-stream 캡처와 로그 증거 |
| 음성 손상 원인 분석 | 4 ms 삽입, 320 ms 삭제, HAL/큐 경로 분석 |
| Kardome 튜닝 런북 | v1.1.17, KWS/STT 튜닝 파라미터와 시험 기준 |