feat: release Find-Word v0.1
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
# 오디오 출처와 재현
|
||||
|
||||
## 포함 자산
|
||||
|
||||
| 대상 | 생성 방식 | 원문/설정 | 배포 방식 |
|
||||
| --- | --- | --- | --- |
|
||||
| `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 공식 저장소](https://github.com/espeak-ng/espeak-ng): GPL-3.0-or-later.
|
||||
이번에는 Ubuntu 24.04 패키지 `1.51+dfsg-12build1`, `ko` 포먼트 음성을 사용했다.
|
||||
[공식 언어 목록](https://github.com/espeak-ng/espeak-ng/blob/master/docs/languages.md)에 한국어가 있다.
|
||||
- [FFmpeg 공식 라이선스 안내](https://ffmpeg.org/legal.html): 빌드 구성에 따라
|
||||
LGPL/GPL. 생성 과정에서 PCM 리샘플링만 사용했으며 실행 파일을 배포하지 않는다.
|
||||
- 합성 엔진의 프로그램 라이선스와 그 출력물은 구분한다.
|
||||
[GPLv3 §2](https://www.gnu.org/licenses/gpl-3.0.html#section2) 및
|
||||
[GNU 출력물 설명](https://www.gnu.org/licenses/gpl-faq.html#GPLOutput)에 따르면
|
||||
출력이 그 프로그램을 바탕으로 한 저작물인 경우에만 프로그램 라이선스가
|
||||
출력에 적용된다. 이 작업의 산출물은 직접 작성한 텍스트의 포먼트 합성 파형이며,
|
||||
프로그램 코드·외부 녹음·모델을 포함하지 않는 자체 생성 오디오로 취급한다.
|
||||
- 엔진·라이브러리·다운로드한 Debian 패키지는 `.cache/`에서만 생성 도구로
|
||||
사용하며 Git 대상과 `dist/`에 들어가지 않는다. 별도 외부 음원 라이선스는 없다.
|
||||
프로젝트 자체의 소스·문서·자체 생성 자산은 private / all-rights-reserved다.
|
||||
[루트 LICENSE](../LICENSE)를 따른다. 별도로 번들에 포함되는 React, ReactDOM,
|
||||
scheduler의 MIT 전문은 [THIRD_PARTY_NOTICES.md](../THIRD_PARTY_NOTICES.md)에
|
||||
있으며 `dist/THIRD_PARTY_NOTICES.md`로 함께 배포한다.
|
||||
|
||||
## 생성 절차
|
||||
|
||||
일반적인 Ubuntu 개발 환경에는 `espeak-ng`, `ffmpeg`, Python 3, Node.js가
|
||||
필요하다. **이미 포함된 WAV로 빌드·실행할 때는 이 도구가 필요 없다.**
|
||||
|
||||
```bash
|
||||
npm run audio:generate
|
||||
npm test -- tests/assets.test.ts
|
||||
npm run build
|
||||
```
|
||||
|
||||
현재 작업에서는 시스템 설치 없이 다음 명령으로 worktree 내부에 도구를 풀었다.
|
||||
이 명령은 문서화용이며 서버에서 실행한 이력이 없다.
|
||||
|
||||
```bash
|
||||
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%이다.
|
||||
물리적 음압을 측정하거나 장치 출력을 보정하지 않는다.
|
||||
|
||||
포먼트 합성 특성상 한국어 발음·억양과 웃음이 기계적으로 들린다. 배경도 실제
|
||||
장소 녹음처럼 세밀하지 않다. 객관식의 자모 차이와 단어 친숙도, 발음의 자연스러움은
|
||||
검수자가 직접 들어 평가해야 한다. 현재 단계 수치는 임상 검증이나 청력 판정용이 아니다.
|
||||
Reference in New Issue
Block a user