Telnyx Edge에서 충돌에 강한 AI 팟캐스트 제작 파이프라인 구축하기
요약
본 글은 팟캐스트 후반 작업을 위한 내구성이 강한 AI 파이프라인 구축 방법을 제시합니다. Telnyx Edge Compute에서 실행되는 TypeScript 애플리케이션인 Show Wrap Desk를 사용하여, 전사, 챕터 식별, 쇼 노트 생성 등 여러 단계를 하나의 Stateful Actor에 통합했습니다. 작업 실패 시에도 완료된 단계의 기록을 유지하고 재개할 수 있어 워크플로우의 안정성을 크게 높였습니다.
핵심 포인트
- Telnyx Edge Compute 기반으로 AI 파이프라인 구축 가능
- Stateful Actor를 사용하여 작업 상태 및 진행 상황 추적
- 실패해도 데이터가 보존되어 중복 처리 방지 및 재개 용이
- 임베디드 SQL을 활용하여 별도 오케스트레이션 DB 불필요
팟캐스트 후반 작업(post-production)은 거의 단일 작업으로 이루어지지 않습니다. 에피소드가 게시되기 전에, 누군가는 녹음을 전사(transcribe)하고, 챕터를 식별하며, 쇼 노트(show notes)를 작성하고, 홍보용 문구를 만들고, 트레일러를 제작해야 합니다. 각 단계는 이전 단계에 의존하기 때문에 워크플로우가 중단에 취약해집니다.
만약 전사 작업이 실패하면, 애플리케이션이 전체 녹음을 다시 전사해야 할까요?
저는 보다 내구성이 강한 접근 방식을 탐색하기 위해 Show Wrap Desk를 구축했습니다.
이것은 Telnyx Edge Compute에서 실행되는 TypeScript 애플리케이션으로, 하나의 팟캐스트 녹음을 다음 요소들로 변환합니다:
- 화자 레이블이 지정된 전사본(speaker-labeled transcript)
- 타임스탬프가 포함된 챕터
- AI가 생성한 쇼 노트
- 짧은 트레일러 스크립트
- Text-to-Speech로 생성된 MP3 트레일러
이 워크플로우는 쇼당 하나의 Stateful Actor에 의해 소유되므로, 나중에 작업이 실패하더라도 완료된 단계의 기록이 유지됩니다.
파이프라인
제작자는 다음 요청으로 워크플로우를 시작합니다:
curl -X POST https://<your-worker>/wrap \
-H "Content-Type: application/json" \
-d '{...}
이 엔드포인트는 즉시 에피소드 ID와 202 Accepted 응답을 반환하며, 액터가 계속해서 처리합니다:
transcribing → chapterizing → notes → wrapped
언제든지 진행 상황을 확인할 수 있습니다:
curl "https://<your-worker>/wrapstatus/<episodeId>?show=engineering-notes"
쇼당 하나의 Stateful Actor
워커는 쇼로부터 결정론적 액터 이름(deterministic actor name)을 파생합니다:
const desk = env.DESKS.idFromName(`show:${show}`);
const result = await desk.onWrap(show, audioUrl);
동일한 쇼에 제출된 모든 에피소드는 동일한 WrapDesk 액터에 도달합니다.
이 액터는 임베디드 SQL 테이블에 워크플로우 데이터를 저장합니다:
episodes: 상태, 오류 및 완료 시간을 추적합니다.chapters: 제목과 타임스탬프를 저장합니다.assets: 전사본, 쇼 노트 및 트레일러 오디오를 저장합니다.
이를 통해 별도의 오케스트레이션 데이터베이스가 필요 없이 워크플로우에 내구성이 강한 원장(ledger)을 제공합니다.
안정적인 작업으로 중복 파이프라인 방지
각 에피소드는 안정적인 ID를 가진 예약된 작업(scheduled task)을 통해 처리됩니다:
await this.schedule(
0,
"wrapTick",
...
동일한 ID로 다시 스케줄링하면 새 복사본을 생성하는 대신 보류 중인 작업을 대체합니다.
각 단계가 성공적으로 완료된 후, 액터(actor)는 에피소드 상태를 업데이트하고 다음 단계를 위해 해당 작업을 재활성화합니다. 처리 과정이 불완전한 상태에서 동일한 오디오 URL이 다시 제출되면, 액터는 기존 에피소드를 찾아 이를 재개합니다.
개별 단계들은 작업 수행 전에 영속화된 출력(persisted output)을 확인하기도 합니다. 저장된 스크립트는 다시 전사되지 않으며, 기존 챕터는 보존되고, 생성된 노트나 트레일러 오디오는 재사용됩니다.
실패가 발생할 경우, 결과가 저장되기 이전에 발생한 현재 실행 중인 외부 작업(external operation)을 반복할 수 있습니다. 하지만 완료되어 영속화된 단계들은 다시 시작되지 않습니다.
화자 레이블링 전사 (Speaker-labeled transcription)
첫 번째 단계는 녹음 파일을 다운로드하고 Deepgram Nova-3를 사용하여 Telnyx Speech-to-Text API로 제출합니다:
const form = new FormData();
form.append("file", blob, "episode.mp3");
...
응답에는 단어별 타임스탬프와 화자 레이블이 포함됩니다. 액터는 이러한 단어들을 정규화하여 에피소드를 진행하기 전에 스크립트 자산(transcript asset)으로 저장합니다.
챕터 생성 (Creating chapters)
애플리케이션은 동일한 화자의 연속된 단어들을 턴(turns)으로 그룹화합니다. 60초보다 긴 침묵은 새로운 챕터를 시작합니다:
const turns = buildTurns(words);
const chapters = splitIntoChapters(turns, 60);
경계 감지(Boundary detection)는 로컬에서 발생하므로, 애플리케이션은 모든 타임스탬프를 결정하기 위해 AI 요청이 필요하지 않습니다.
Telnyx AI Inference가 결과 섹션의 짧은 요약본을 받은 다음 챕터 제목을 반환합니다. 이 예제는 Edge Compute TELNYX 바인딩을 통해 zai-org/GLM-5.3-Flash를 사용합니다.
쇼 노트 작성 (Writing show notes)
다음 추론 요청은 다음 내용을 포함하는 마크다운(Markdown) 형식의 쇼 노트를 생성합니다:
에피소드 요약
- 에피소드를 요약한 내용
- 핵심 시사점
- 인용구
- 생성된 챕터 목록
모델로 전송되는 스크립트는 관리 가능한 컨텍스트 창 안에 예시를 유지하도록 제한됩니다. 프로덕션 구현에서는 긴 녹음 파일에 대해 청킹(chunking) 또는 계층적 요약(hierarchical summarization)을 도입해야 합니다.
트레일러 생성하기
모델은 유망한 챕터를 선택하고 최대 400자로 제한된 트레일러 스크립트를 작성합니다.
이 스크립트는 Telnyx Text-to-Speech WebSocket으로 전송됩니다:
socket.send(JSON.stringify({ text: " " }));
socket.send(JSON.stringify({ text: script }));
socket.send(JSON.stringify({ text: "" }));
액터는 서비스가 다음을 보낼 때까지 base64 오디오 프레임을 수집합니다:
{ "isFinal": true }
샘플은 기본적으로 azure.en-US-AvaMultilingualNeural를 사용하지만, HOST_VOICE는 다른 지원되는 음성으로 변경할 수 있습니다.
이 프로젝트는 제출된 녹음 파일에서 팟캐스트 호스트의 목소리를 자동으로 복제하지 않습니다. 사용자 지정 또는 클론된 음성은 별도로 구성해야 합니다.
예시 실행하기
git clone https://github.com/team-telnyx/telnyx-code-examples.git
cd telnyx-code-examples/show-wrap-desk
...
Telnyx API 키를 추가한 다음, 바인딩을 생성하고 배포합니다:
npm run types
npm run deploy
생성된 워커 URL을 DEPLOY_URL로 설정하고 실행합니다:
npm run bootstrap
포함된 데모는 퍼블릭 도메인 LibriVox 녹음 파일을 사용합니다.
패턴 확장하기
이 아키텍처를 프로덕션에서 사용하기 전에, 인증(authentication), 오디오 크기 제한(audio-size limits), URL 유효성 검사(URL validation), 보존 제어(retention controls), 워크플로우 원격 측정(workflow telemetry), 그리고 생성된 홍보 콘텐츠에 대한 수동 검토를 추가해야 합니다.
대용량 스크립트와 오디오 파일도 액터 SQL에 직접 보관되는 대신 내구성 객체 스토리지(durable object storage)로 이동해야 합니다.
이 재사용 가능한 아이디어는 팟캐스팅보다 더 큰 범위의 영역을 포괄합니다:
- 각 워크로드에 내구성 있는 액터(durable actor)를 할당합니다.
- 모든 단계의 출력을 저장합니다.
- 명시적인 상태(explicit statuses)로 진행 상황을 추적합니다.
- 안정적인 ID(stable IDs)를 사용하여 작업을 예약합니다.
- 각 단계를 재시도해도 안전하도록 만듭니다.
- 동일한 내구성 레저(durable ledger)를 통해 상태를 노출합니다.
이러한 패턴은 전사(transcription) 배치, 미디어 처리, 문서 강화(document enrichment), 보고서 생성 및 기타 장기 실행 AI 워크플로우를 지원할 수 있습니다.
전체 소스 코드는 다음에서 확인할 수 있습니다:
https://github.com/team-telnyx/telnyx-code-examples/tree/main/show-wrap-desk
#ai #typescript #podcasting #edgecomputing
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기