← Docs hub

AGC 녹음 명령서 — 기존 시험 이력

2026-09-14 갱신: 아래 40/55/70/40 시험은 수행됐으며 outuser 증폭이 확인됐다. 잠정 기본값은 F + vol 0.55다. 최신 결과와 55/60/70 설정 명령을 먼저 확인하세요. 아래는 당시 설정과 공통 녹음 절차를 보존한 것이며 동일 시험을 다시 요청하는 뜻이 아닙니다.

테스터 실행 순서: 3절 조건별 전체 setprop → 서비스 재시작·확인 → 4절 녹음 시작 → 음원 재생 → 녹음 종료 → PC로 저장. 한 조건을 저장한 뒤 다음 조건으로 넘어갑니다. 명령은 모두 소문자 setprop입니다. setProp이 아닙니다.

F 필터와 AGC ON은 유지하고, vol만 0.4 → 0.55 → 0.7 → 0.4로 바꿉니다. outuser의 말소리가 실제로 커지고, 잡음·왜곡이 나빠지지 않는지 확인하는 시험입니다. 아직 RMS 회복이 확인된 설정은 아닙니다.

1. 왜 시험 방향이 바뀌었나?

사용자가 전달한 Kardome v1.1.18 업체 답변 기준입니다.

항목 쉬운 의미 이번 시험
AGC 출력 크기를 자동으로 조절하는 기능 ON 유지
EQ_TOTAL_GAIN AGC가 꺼져 있을 때 사용하는 고정 dB gain 0 고정. AGC ON에서는 효과 없음
AGC_MAX_GAIN_ZONE AGC가 서서히 향하는 gain. 단순 최대 제한만은 아님 40 / 55 / 70 비교
AGC_LIMITER_ZONE 큰 소리의 피크를 제한하는 별도 장치 변경하지 않음. 업체 기본값 0.3

업체 설명: AGC gain 범위는 1–200, 기본값 55입니다. limiter 범위는 0.2–0.9, 기본값 0.3입니다. 일정한 RMS로 맞추는 기능은 아닙니다. gain을 높이면 보통 출력은 커질 수 있지만, 실제 RMS 증가량은 입력과 제한 동작에 따라 달라집니다.

EQ_TOTAL_GAIN은 양수가 증폭, 음수가 감쇠이며 audio_user_out에만 적용됩니다. audio_kardome_out에는 해당 EQ/gain 경로가 없습니다. AGC ON에서 EQ gain의 설정·조회가 성공해도 출력이 같았던 결과는 업체 설명과 일치합니다.

정정: 앞서 AGC_MAX_GAIN_ZONE을 “상한일 뿐”이라고 설명한 부분은 업체 답변으로 정정합니다. 다만 과거 vol=0.4/0.5/0.6에서 RMS 회복을 관측하지 못한 측정 결과는 취소하지 않습니다. 이번 시험은 새 gain 단계, 같은 입력 조건, 적용 로그, 시작·끝 기준 녹음을 묶어 그 불일치를 확인합니다. 새 알고리즘을 넣어서 해결했다는 뜻이 아닙니다.

2. 바이너리는 새로 필요한가?

이번 40/55/70 시험에는 재빌드가 필요 없습니다. 20260907 EQ-readback 서비스에는 이미 다음 처리가 있습니다.

vol 0.4  → AGC_MAX_GAIN_ZONE 40, zone 1
vol 0.55 → AGC_MAX_GAIN_ZONE 55, zone 1
vol 0.7  → AGC_MAX_GAIN_ZONE 70, zone 1

소스에서 AGC 활성 요청과 위 zone별 setter, 반환 결과 로그를 확인했습니다. 단, 이 바이너리는 AGC enable/gain/limiter 내부값을 다시 읽는 진단 로그가 없습니다. result=0은 설정 API 성공이지 내부값 재조회나 PCM 증폭 확인이 아닙니다. limiter 0.3도 업체 기본값이며 기기에서 측정·조회한 값이 아닙니다. 따라서 이번에 “limiter 0.3 강제 설정·검증 완료”라고 기록하지 않습니다.

전달 폴더: sndflow_kardome_1.1.18_agc_test_20260910. 기존 검증 패키지의 네 파일을 변경 없이 다시 모은 것입니다. 현재 기기가 같은 네 파일의 SHA-256과 일치하면 재설치를 생략합니다. 새 limiter/AGC property는 추가하지 않았으므로 임의의 setprop ...agc.* 명령을 사용하지 않습니다.

전달 파일 (artifacts/ 아래) 기기 설치 위치
vendor/bin/hw/vendor.quber.hardware.soundflowservice@1.0-service /vendor/bin/hw/vendor.quber.hardware.soundflowservice@1.0-service
vendor/bin/soundflowctl /vendor/bin/soundflowctl
vendor/lib64/libKardome.so /vendor/lib64/libKardome.so
vendor/etc/kardome_config.bin /vendor/etc/kardome_config.bin

재설치가 필요하면 패키지 루트에서 bash scripts/install.sh를 사용합니다. 네 파일 백업 → 설치 → 권한/SELinux 복구 → 서비스/Core 시작 → 버전 및 해시 확인 순서입니다. config 파일 배치와 krdmLibUploadConfig 호출은 다른 일이며, 이번에 config 업로드 호출을 추가한 것은 아닙니다.

3. setprop 명령 — 네 번 순서대로

먼저 PC에서 adb root, adb wait-for-device, adb shell을 실행합니다. 아래는 기기 root shell 명령입니다.

① F_AGC40 — 아래 전체 복사 후 재시작·녹음

setprop persist.vendor.audio.sndflow.vol 0.4
setprop persist.vendor.audio.sndflow.krdm.kws.sensitivity ""
setprop persist.vendor.audio.sndflow.krdm.pre_filter "5,150,0,0"
setprop persist.vendor.audio.sndflow.krdm.eq_filter "0,1800,2.5,1;0,2800,1.5,1"
setprop persist.vendor.audio.sndflow.krdm.eq_total_gain 0

② F_AGC55 — ① 녹음·PC 저장을 끝낸 뒤 실행

setprop persist.vendor.audio.sndflow.vol 0.55
setprop persist.vendor.audio.sndflow.krdm.kws.sensitivity ""
setprop persist.vendor.audio.sndflow.krdm.pre_filter "5,150,0,0"
setprop persist.vendor.audio.sndflow.krdm.eq_filter "0,1800,2.5,1;0,2800,1.5,1"
setprop persist.vendor.audio.sndflow.krdm.eq_total_gain 0

③ F_AGC70 — ② 녹음·PC 저장을 끝낸 뒤 실행

setprop persist.vendor.audio.sndflow.vol 0.7
setprop persist.vendor.audio.sndflow.krdm.kws.sensitivity ""
setprop persist.vendor.audio.sndflow.krdm.pre_filter "5,150,0,0"
setprop persist.vendor.audio.sndflow.krdm.eq_filter "0,1800,2.5,1;0,2800,1.5,1"
setprop persist.vendor.audio.sndflow.krdm.eq_total_gain 0

④ F_AGC40_REPEAT — ③ 녹음·PC 저장을 끝낸 뒤 실행

setprop persist.vendor.audio.sndflow.vol 0.4
setprop persist.vendor.audio.sndflow.krdm.kws.sensitivity ""
setprop persist.vendor.audio.sndflow.krdm.pre_filter "5,150,0,0"
setprop persist.vendor.audio.sndflow.krdm.eq_filter "0,1800,2.5,1;0,2800,1.5,1"
setprop persist.vendor.audio.sndflow.krdm.eq_total_gain 0

매 조건 공통 — 서비스 재시작과 적용 확인

순서 / 녹음 폴더 실행할 명령 적용 로그에 있어야 할 값
1. F_AGC40 setprop persist.vendor.audio.sndflow.vol 0.4 AGC_MAX_GAIN_ZONE=40 result=0
2. F_AGC55 setprop persist.vendor.audio.sndflow.vol 0.55 AGC_MAX_GAIN_ZONE=55 result=0
3. F_AGC70 setprop persist.vendor.audio.sndflow.vol 0.7 AGC_MAX_GAIN_ZONE=70 result=0
4. F_AGC40_REPEAT setprop persist.vendor.audio.sndflow.vol 0.4 AGC_MAX_GAIN_ZONE=40 result=0

각 행 설정 후 아래 재시작·확인을 하고, 해당 조건 녹음을 끝낸 다음 다음 행으로 넘어갑니다. 네 값을 연속으로 먼저 넣지 마세요.

stop soundflowservice
getprop init.svc.soundflowservice

stopped 확인 후:

start soundflowservice
getprop init.svc.soundflowservice

running 확인 후:

/vendor/bin/soundflowctl start
getprop sys.audio.sndflow.krdm.version
getprop persist.vendor.audio.sndflow.vol
getprop persist.vendor.audio.sndflow.krdm.kws.sensitivity
getprop persist.vendor.audio.sndflow.krdm.pre_filter
getprop persist.vendor.audio.sndflow.krdm.eq_filter
getprop persist.vendor.audio.sndflow.krdm.eq_total_gain
logcat -d -b all | grep -E 'AGC_MAX_GAIN_ZONE|applied filters|EQ_ENABLE|EQ_TOTAL_GAIN|Invalid value'

버전은 1.1.18, gain은 해당 행의 40/55/70, 필터는 각각 filters=1/2 result=0, EQ gain은 readback=0 result=0을 확인합니다. 로그의 가장 최근 재시작 시각을 기준으로 확인하고, 이전 시험의 성공 로그를 현재 결과로 읽지 않습니다. 적용 실패·초기화 오류가 있으면 녹음 비교를 중단합니다. EQ readback 성공은 AGC readback 성공을 뜻하지 않습니다.

4. 녹음은 어떻게 하나?

기존 GUI 녹음 도구를 사용한다면: 위 조건 설정 → 서비스 재시작·적용 확인 → GUI 녹음 시작 → 같은 음원 재생 → 녹음 종료 → 아래 폴더명으로 저장합니다. GUI가 프로퍼티를 덮어쓰지 않는지 녹음 직전에 다시 확인하세요. GUI 녹음과 아래 dump 명령은 동시에 사용하지 않습니다.

GUI 없이 ADB로 직접 WAV를 받으려면 아래 A–D를 따르세요. PC 터미널은 WSL/Linux bash 기준입니다. adb shell에 들어간 창과 PC 창을 구분하세요. 연결 기기가 여러 대면 먼저 대상 기기를 하나로 지정해야 합니다.

A. 준비 — PC 창

adb devices
adb root
adb wait-for-device
adb shell

기기 shell에서 현재 녹음을 종료합니다. 실행 중인 녹음이 있다면 먼저 담당자와 종료 시점을 맞춥니다.

setprop vendor.audio.sndflow.dump.in false
setprop vendor.audio.sndflow.dump.out false
setprop vendor.audio.sndflow.dump.allinout false
sleep 2
exit

첫 시험 전에 기존 녹음 파일을 PC에 백업합니다. 아래 목적지는 새 폴더명을 쓰세요. 기존 폴더가 있으면 다른 이름을 사용합니다. 이 명령은 기기 파일을 삭제하지 않습니다.

adb pull /data/vendor/audio ./before_agc_test_backup_01

백업 성공 후 adb shell에 들어가 3절의 해당 조건 전체 setprop과 서비스 재시작·확인을 진행합니다. 재시작 후 dump는 아직 OFF입니다.

B. 녹음 시작 — 기기 shell

PC 창에 있다면 먼저 adb shell로 기기 shell에 들어갑니다.

이전 녹음을 PC에 저장한 뒤에만 실행하세요. 같은 이름의 기기 WAV가 새 녹음으로 덮어써집니다.

setprop vendor.audio.sndflow.dump.in true
setprop vendor.audio.sndflow.dump.out true
setprop vendor.audio.sndflow.dump.allinout true
getprop vendor.audio.sndflow.dump.in
getprop vendor.audio.sndflow.dump.out
getprop vendor.audio.sndflow.dump.allinout
sleep 2
ls -l /data/vendor/audio/sndflow_mic.wav /data/vendor/audio/sndflow_ref.wav /data/vendor/audio/sndflow_outuser.wav /data/vendor/audio/sndflow_outkardome.wav /data/vendor/audio/sndflow_allinout.wav

세 값이 true이고 파일이 생성되는지 확인합니다. 잠시 후 ls -l을 다시 실행해 크기가 증가하는지 확인하세요. 파일이 없거나 증가하지 않으면 음원을 재생하지 말고 로그를 전달하세요. true는 녹음 요청값이지 녹음 성공 증거가 아닙니다.

이제 동일 음원을 재생합니다. 녹음 도중 서비스를 재시작하지 마세요. 각 조건에서 음원 재생 전 대기 시간을 동일하게 유지합니다. 위 2초는 파일 생성 확인용 대기이며 AGC 안정화가 보장되는 시간이라는 뜻은 아닙니다.

C. 녹음 종료 — 기기 shell

음원이 끝난 뒤 아래를 실행합니다. WAV 종료 처리를 위해 서비스를 먼저 죽이지 말고 dump를 OFF 합니다.

setprop vendor.audio.sndflow.dump.in false
setprop vendor.audio.sndflow.dump.out false
setprop vendor.audio.sndflow.dump.allinout false
sleep 2
getprop vendor.audio.sndflow.dump.in
getprop vendor.audio.sndflow.dump.out
getprop vendor.audio.sndflow.dump.allinout
ls -l /data/vendor/audio/sndflow_mic.wav /data/vendor/audio/sndflow_ref.wav /data/vendor/audio/sndflow_outuser.wav /data/vendor/audio/sndflow_outkardome.wav /data/vendor/audio/sndflow_allinout.wav
exit

세 값이 false여야 합니다. 계속 파일 크기가 증가하거나 처리 오류가 있으면 다음 녹음을 시작하지 않습니다. dump OFF 후 WAV close는 처리 루프에서 수행되므로 서비스가 멈춘 경우 정상 종료를 단정하지 않습니다.

D. PC로 WAV·로그 저장 — PC WSL/Linux bash 창

첫 줄만 현재 조건에 맞게 바꾸고 아래 블록 전체를 실행하세요. 이미 사용한 폴더명은 다시 쓰지 않습니다.

AGC_RECORD_DIR="F_AGC40_60dB"
mkdir "$AGC_RECORD_DIR" && (
  adb pull /data/vendor/audio/sndflow_mic.wav "$AGC_RECORD_DIR/" &&
  adb pull /data/vendor/audio/sndflow_ref.wav "$AGC_RECORD_DIR/" &&
  adb pull /data/vendor/audio/sndflow_outuser.wav "$AGC_RECORD_DIR/" &&
  adb pull /data/vendor/audio/sndflow_outkardome.wav "$AGC_RECORD_DIR/" &&
  adb pull /data/vendor/audio/sndflow_allinout.wav "$AGC_RECORD_DIR/" &&
  adb shell getprop > "$AGC_RECORD_DIR/getprop.txt" &&
  adb logcat -d -b all > "$AGC_RECORD_DIR/logcat.txt" &&
  adb shell sha256sum /vendor/bin/hw/vendor.quber.hardware.soundflowservice@1.0-service /vendor/bin/soundflowctl /vendor/lib64/libKardome.so /vendor/etc/kardome_config.bin > "$AGC_RECORD_DIR/device_sha256.txt" &&
  ls -lh "$AGC_RECORD_DIR"
)

5개 WAV와 3개 txt가 모두 저장되어야 한 조건이 끝납니다. 복사 실패 시 기기 WAV를 덮어쓰지 말고 먼저 복사 문제를 해결하세요. 파일 존재·크기는 1차 확인이며, WAV 헤더와 발화 누락은 분석 시 별도로 검사합니다.

프로필 60 dB 폴더 65 dB 폴더 무음 배경 폴더
F_AGC40 F_AGC40_60dB F_AGC40_65dB F_AGC40_Clean
F_AGC55 F_AGC55_60dB F_AGC55_65dB F_AGC55_Clean
F_AGC70 F_AGC70_60dB F_AGC70_65dB F_AGC70_Clean
F_AGC40_REPEAT F_AGC40_REPEAT_60dB F_AGC40_REPEAT_65dB F_AGC40_REPEAT_Clean

같은 프로필에서 60 dB 저장 후 B–D를 반복하여 65 dB, Clean을 받습니다. 다음 프로필로 바뀔 때는 전체 setprop → 서비스 재시작·확인 → B–D 순서입니다. 처음과 끝의 40은 같은 음원·환경으로 비교합니다.

모든 조건에서 동일하게 지킬 것

전체 getprop/logcat은 내부 분석용으로만 전달하고, 그대로 공개 Wiki에 올리지 않습니다. 첫 F_AGC40과 마지막 REPEAT는 환경·시간에 따른 차이를 확인하는 기준입니다. 이는 독립 반복을 충분히 확보한 통계 시험은 아닙니다.

5. 결과가 나오면 어떻게 결정하나?

결과 다음 행동
55/70에서 outuser 말소리가 커지고, 반복 오차보다 차이가 크며 잡음·왜곡이 악화하지 않음 더 낮은 gain부터 후보 선택. 원래 A1/Default 수준 회복 여부는 동일 조건 기준 녹음과 별도 비교
말소리와 잡음이 함께 커짐 크기 증가만 확인. 품질 개선으로 확정하지 않음
gain을 높여도 커지지 않고 피크가 일정 수준에 몰림 limiter 영향 후보. 다음 단계에서 limiter 설정·내부값 조회를 추가한 진단 빌드 검토
적용 로그는 성공하지만 limiter 징후 없이 출력도 그대로 숫자를 더 키우는 시험 중단. AGC zone별 enable/gain/limiter 재조회와 처리 시작 후 상태 확인을 추가하고 업체와 확인
첫 40과 마지막 40도 크게 다름 프로필 효과를 결론내리지 말고 입력·환경 재현성부터 확보

분석의 주 출력은 outuser입니다. 말소리 구간 RMS, MIC 입력 대비 출력 크기, 배경 잡음, 파형 잘림(clipping), 음성 중 비정상 저레벨 구간(dropout)을 함께 봅니다. outkardome은 보조 출력으로 비교하되 EQ gain 반응을 기대하는 기준으로 쓰지 않습니다. ref가 실제로 정합될 때만 ref 기반 비교를 추가합니다.

최종 목표는 “RMS 숫자만 올리기”가 아니라 “인식에 전달할 말소리를 손상 없이 확보하기”입니다. 파형만으로 STT 정확도 개선을 확정하지 않습니다. 70에서 이상이 들리면 시험을 중단하고 vol=0.4로 되돌린 뒤 서비스를 재시작합니다. limiter를 곧바로 높이지 않습니다.

Connections

준비 범위: 기존 artifact SHA-256 확인 및 별도 패키징, 명령과 소스 매핑 확인. 새 Android 빌드·기기 설치·AGC 내부값 조회·새 PCM 실측은 이번 준비 작업에서 수행하지 않았습니다.

Keyboard shortcuts

⌘K / Ctrl+KOpen command palette
/Focus search
g hGo to home
g pGo to projects
g sGo to sessions
j / kNext / prev row (tables)
?Show this help
EscClose dialogs

Structured queries

Mix key:value filters with free text in the palette:

type:sessionOnly session pages
project:llm-wikiFilter by project name (substring)
model:claudeFilter by model name (substring)
date:>2026-03-01Sessions after a date
date:<2026-04-01Sessions before a date
tags:rustPages mentioning a tag/topic
sort:dateSort results by date (newest first)

Example: type:session project:llm-wiki date:>2026-04 sort:date