{"id":51002323,"url":"https://github.com/rocosrex/linguaforge","last_synced_at":"2026-06-20T16:02:11.363Z","repository":{"id":356789770,"uuid":"1234067772","full_name":"rocosrex/LinguaForge","owner":"rocosrex","description":"OpenAI Realtime Translation PoC for YouTube live translation with WebRTC, Chrome tab audio, and Korean captions","archived":false,"fork":false,"pushed_at":"2026-05-09T18:06:49.000Z","size":95,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-09T20:13:48.039Z","etag":null,"topics":["ai-translation","captions","chrome","express","korean","live-translation","nodejs","openai","openai-realtime","realtime-translation","speech-to-speech","tab-audio-capture","webrtc","youtube"],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rocosrex.png","metadata":{"files":{"readme":"README.ko.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-09T17:53:32.000Z","updated_at":"2026-05-09T18:06:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rocosrex/LinguaForge","commit_stats":null,"previous_names":["rocosrex/linguaforge"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/rocosrex/LinguaForge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rocosrex%2FLinguaForge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rocosrex%2FLinguaForge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rocosrex%2FLinguaForge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rocosrex%2FLinguaForge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rocosrex","download_url":"https://codeload.github.com/rocosrex/LinguaForge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rocosrex%2FLinguaForge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34576054,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-20T02:00:06.407Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-translation","captions","chrome","express","korean","live-translation","nodejs","openai","openai-realtime","realtime-translation","speech-to-speech","tab-audio-capture","webrtc","youtube"],"created_at":"2026-06-20T16:02:08.456Z","updated_at":"2026-06-20T16:02:11.354Z","avatar_url":"https://github.com/rocosrex.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# LinguaForge 한국어\n\n[English README](README.md)\n\n[![Node.js \u003e=20](https://img.shields.io/badge/Node.js-%3E%3D20-339933?logo=node.js\u0026logoColor=white)](https://nodejs.org/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\nLinguaForge는 YouTube 영어 오디오를 실시간으로 한국어 통역하는 localhost PoC입니다. Chrome 탭 오디오를 캡처하고, OpenAI Realtime Translation에 WebRTC로 전송한 뒤, 브라우저에서 번역 음성 및 번역 자막을 제공합니다. 종료 후에는 번역 transcript를 Markdown으로 저장할 수 있습니다.\n\n이 저장소는 운영 서비스가 아니라 PoC입니다. 기본적으로 loopback 주소에만 bind되며, OpenAI API key는 로컬 서버에만 보관합니다.\n\n검색 키워드: OpenAI Realtime Translation, OpenAI Codex, WebRTC translation, YouTube live translation, Chrome tab audio capture, Korean captions, speech-to-speech translation, AI interpreter, realtime subtitles.\n\n![localhost에서 실행 중인 LinguaForge](assets/linguaforge-app.png)\n\n## 기능\n\n- Chrome 탭 오디오 캡처\n- 로컬 Express 서버에서 단기 OpenAI client secret 생성\n- `gpt-realtime-translate` WebRTC 통역 세션 연결\n- 번역 음성 재생\n- 번역 자막 표시\n- 원본/번역 볼륨 조절\n- 수동 종료, 탭 종료 감지, 무음 종료, 최대 세션 시간 종료\n- Markdown transcript 다운로드\n\n## Codex 작업 환경\n\n이 프로젝트는 OpenAI Codex를 코딩 에이전트로 사용해 개발했습니다. 현재 저장소 상태 기준으로 공개해도 되는 환경 정보는 아래와 같습니다.\n\n- 에이전트: Codex, GPT-5 기반 코딩 에이전트\n- 로컬 환경: macOS 26.4.1, `zsh`, Asia/Seoul timezone\n- 런타임 확인: Node.js `v24.7.0`, npm `11.5.1`\n- 앱 실행 방식: localhost Express server, 기본 포트 `4000`\n- 저장소 대상: public GitHub project `rocosrex/LinguaForge`\n\n## 실행 방법\n\n```bash\ncd yt-translate-poc\nnpm install\ncp .env.example .env\n```\n\n`.env`를 수정합니다.\n\n```dotenv\nOPENAI_API_KEY=sk-...\nPORT=4000\nHOST=127.0.0.1\n```\n\n실행:\n\n```bash\nnpm start\n```\n\n브라우저에서 엽니다.\n\n```text\nhttp://127.0.0.1:4000\n```\n\nChrome에서 `Start`를 누르고 YouTube 탭을 선택한 뒤, 탭 오디오 공유를 반드시 켜야 합니다.\n\n## 보안 메모\n\n- `.env`는 git에서 ignore됩니다.\n- 서버는 기본적으로 `127.0.0.1`에서만 실행됩니다.\n- `0.0.0.0` 같은 unsafe bind host는 차단됩니다.\n- `/session`은 localhost Host/Origin만 허용합니다.\n- 브라우저에는 OpenAI API key가 내려가지 않고, 단기 client secret만 전달됩니다.\n\n## 테스트 결과\n\n최근 자동 테스트 결과:\n\n```text\nnpm test\n24 passed, 0 failed\n```\n\n로컬 smoke check:\n\n- `http://127.0.0.1:4000`에서 서버 기동 확인\n- 정적 페이지 로딩 확인\n- API key 설정 후 `/session` 200 응답 확인\n- non-local Host 요청 403 차단 확인\n- `HOST=0.0.0.0` 실행 전 차단 확인\n- 브라우저 실시간 통역 동작은 PoC 테스트 중 수동 확인\n\n## 비용 메모\n\n비용 추정은 아직 정확하지 않습니다. 한 번의 거친 수동 테스트에서 약 8분에 USD 10 정도로 보였지만, 해당 테스트는 비용을 분리해 측정한 것이 아니라 신뢰할 수 있는 벤치마크로 쓰면 안 됩니다. 분당/시간당 비용은 별도의 통제된 재테스트 후 문서화해야 합니다.\n\n## 공개 데이터 메모\n\nYouTube transcript 전문은 public 저장소에 추적하지 않습니다. `test-output/`에는 전체 원문 transcript가 아니라 요약된 비교/평가 리포트만 남깁니다.\n\n## 알려진 제약\n\n- `gpt-realtime-translate`는 dynamic voice adaptation 방식이라 통역 음색이 세션 중 바뀔 수 있습니다.\n- glossary, 고정 음성 선택, custom prompting은 이번 PoC 범위가 아닙니다.\n- 브라우저 테스트는 소스 계약 테스트 중심이며, WebRTC 전체 동작은 Chrome에서 수동 확인이 필요합니다.\n- 현재 transcript export는 번역문만 저장합니다.\n\n## 라이선스\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frocosrex%2Flinguaforge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frocosrex%2Flinguaforge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frocosrex%2Flinguaforge/lists"}