Files
Find-Word/docs/AUDIO_PROVENANCE.md
T
2026-10-14 06:19:24 +00:00

5.1 KiB
Raw Blame History

오디오 출처와 재현

포함 자산

대상 생성 방식 원문/설정 배포 방식
public/audio/intro.wav 로컬 eSpeak NG 한국어 포먼트 합성 src/content.ts의 INTRO PCM WAV
목표 음성 100개 같은 로컬 엔진 10 패턴 × 10 단어 PCM WAV
길거리·쇼핑몰·극장·백화점·시장·지하철·카페·비 오는 거리 직접 작성한 결정론적 DSP ENVIRONMENTS, 고정 seed 브라우저 메모리에서 합성
화면 파형·S 캐릭터 직접 작성한 CSS App.tsx, styles.css CSS, 외부 이미지 없음

모든 한국어 문장은 이번 앱을 위해 직접 작성했다. 다른 사람의 녹음, 노래, 샘플 라이브러리, 음성 복제, 신경망 모델을 포함하지 않는다. 웃음도 INTRO의 ‘으하하하~~’ 문자열을 동일 엔진으로 합성한 것이다. 효과를 위해 타인 음원을 다운로드하지 않았다. 런타임에 speechSynthesis 또는 네트워크 TTS도 호출하지 않는다.

WAV는 16kHz, mono, signed 16-bit little-endian PCM이다. 101개 합계는 20,497,222바이트다. 파일별 원문·바이트 수·SHA-256은 public/audio/manifest.json에 있다. 생성 시 실행 도구에서 읽은 eSpeak NG 1.51, FFmpeg 6.1.1-3ubuntu5의 실제 버전도 기록했다. tests/assets.test.ts는 원문 대응, PCM 포맷, 비무음 신호, 20MiB 이내 크기, gain 적용 후 피크 여유를 검사한다. 빌드 마지막에는 dist/audio 파일의 해시도 확인한다. 청취 연산 변경에 맞춰 101개 WAV와 manifest를 모두 재생성했다. 정답과 경쟁 단어는 renderSentence로 채우며, 순서·반복·정정·조건·방향 단서가 실제 음성에 들어간다.

사용 도구와 라이선스

  • eSpeak NG 공식 저장소: GPL-3.0-or-later. 이번에는 Ubuntu 24.04 패키지 1.51+dfsg-12build1, ko 포먼트 음성을 사용했다. 공식 언어 목록에 한국어가 있다.
  • FFmpeg 공식 라이선스 안내: 빌드 구성에 따라 LGPL/GPL. 생성 과정에서 PCM 리샘플링만 사용했으며 실행 파일을 배포하지 않는다.
  • 합성 엔진의 프로그램 라이선스와 그 출력물은 구분한다. GPLv3 §2 및 GNU 출력물 설명에 따르면 출력이 그 프로그램을 바탕으로 한 저작물인 경우에만 프로그램 라이선스가 출력에 적용된다. 이 작업의 산출물은 직접 작성한 텍스트의 포먼트 합성 파형이며, 프로그램 코드·외부 녹음·모델을 포함하지 않는 자체 생성 오디오로 취급한다.
  • 엔진·라이브러리·다운로드한 Debian 패키지는 .cache/에서만 생성 도구로 사용하며 Git 대상과 dist/에 들어가지 않는다. 별도 외부 음원 라이선스는 없다. 프로젝트 자체의 소스·문서·자체 생성 자산은 private / all-rights-reserved다. 루트 LICENSE를 따른다. 별도로 번들에 포함되는 React, ReactDOM, scheduler의 MIT 전문은 THIRD_PARTY_NOTICES.md에 있으며 dist/THIRD_PARTY_NOTICES.md로 함께 배포한다.

생성 절차

일반적인 Ubuntu 개발 환경에는 espeak-ng, ffmpeg, Python 3, Node.js가 필요하다. 이미 포함된 WAV로 빌드·실행할 때는 이 도구가 필요 없다.

npm run audio:generate
npm test -- tests/assets.test.ts
npm run build

현재 작업에서는 시스템 설치 없이 다음 명령으로 worktree 내부에 도구를 풀었다. 이 명령은 문서화용이며 서버에서 실행한 이력이 없다.

mkdir -p .cache/espeak
cd .cache/espeak
apt download espeak-ng espeak-ng-data libespeak-ng1 libpcaudio0 libsonic0
for pkg in *.deb; do dpkg-deb -x "$pkg" root; done
cd ../..
npm run audio:generate

scripts/generate_audio.py가 시스템 엔진 또는 .cache/espeak/root/usr를 자동 선택한다. ko, 속도 145, 피치 45, 진폭 100을 고정하고 FFmpeg로 16kHz PCM을 만든 뒤 Python wave 모듈로 메타데이터 없는 WAV를 쓴다. 런타임 데이터는 Node의 type stripping으로 읽어 텍스트 중복을 피한다. 같은 엔진·버전·플랫폼에서는 해시로 재현 여부를 비교할 수 있다. 다른 버전은 새 출처와 해시를 검토해야 한다.

음량·품질 한계

보이스와 배경은 같은 디지털 RMS로 정규화되고 음성 경로만 dB gain을 적용한다. 안내의 gain은 1.8에서 0.12로 감소한다. 기본 전체 음량은 35%이다. 물리적 음압을 측정하거나 장치 출력을 보정하지 않는다.

포먼트 합성 특성상 한국어 발음·억양과 웃음이 기계적으로 들린다. 배경도 실제 장소 녹음처럼 세밀하지 않다. 객관식의 자모 차이와 단어 친숙도, 발음의 자연스러움은 검수자가 직접 들어 평가해야 한다. 현재 단계 수치는 임상 검증이나 청력 판정용이 아니다.