init
This commit is contained in:
73
docs/steps/step-08.md
Normal file
73
docs/steps/step-08.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# **File: COMMIT\_08\_VOICE\_TOKEN.md**
|
||||
|
||||
## **Commit 8: Real-time Voice: Token API**
|
||||
|
||||
### **Objective**
|
||||
|
||||
Implement the serverless-friendly Deepgram token generation API. This is the expert-level correction to the user's "WebSocket proxy" plan. A standard Vercel deployment does not support persistent WebSocket backends.22
|
||||
|
||||
This architecture (based on the nextjs-live-transcription starter's implications 23) provides a secure, stateless way to use Deepgram's real-time streaming:
|
||||
|
||||
1. The client requests a temporary token from our Next.js API.
|
||||
2. Our Next.js API (server-side) uses
|
||||
our secret Deepgram API key to generate a temporary, short-lived token.
|
||||
3. The client receives this temporary token and uses it to connect *directly* to Deepgram's WebSocket endpoint.
|
||||
|
||||
### **Implementation Specification**
|
||||
|
||||
**1\. Create app/api/voice-token/route.ts**
|
||||
|
||||
Create a file at /app/api/voice-token/route.ts:
|
||||
|
||||
TypeScript
|
||||
|
||||
import { NextRequest, NextResponse } from 'next/server';
|
||||
import { DeepgramClient, createClient } from '@deepgram/sdk';
|
||||
|
||||
/\*\*
|
||||
\* This API route generates a short-lived, temporary API key
|
||||
\* for a client to connect directly to Deepgram's WebSocket.
|
||||
\* This avoids exposing our main API key and bypasses
|
||||
\* serverless WebSocket limitations.
|
||||
\*/
|
||||
export async function POST(request: NextRequest) {
|
||||
const deepgramApiKey \= process.env.DEEPGRAM\_API\_KEY;
|
||||
|
||||
if (\!deepgramApiKey) {
|
||||
return NextResponse.json(
|
||||
{ error: 'Deepgram API key not configured' },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
|
||||
const deepgram: DeepgramClient \= createClient(deepgramApiKey);
|
||||
|
||||
try {
|
||||
// Create a new, temporary key with 'member' permissions
|
||||
// that expires in 1 minute (60 seconds).
|
||||
const { key, error } \= await deepgram.keys.create(
|
||||
null, // Let Deepgram generate the key
|
||||
'Temporary key for Ponderants user',
|
||||
\['member'\], // Required scope for transcription
|
||||
{ timeToLive: 60 }
|
||||
);
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
// Send the temporary key back to the client
|
||||
return NextResponse.json({ key });
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error creating Deepgram key:', error);
|
||||
return NextResponse.json(
|
||||
{ error: 'Failed to generate voice token' },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
### **Test Specification**
|
||||
|
||||
This is an API-only commit. It will be tested by the client implemented in **Commit 09**.
|
||||
Reference in New Issue
Block a user