Soniox
Soniox
LangChain에서 Soniox 오디오 전사 로더를 시작하는 방법을 안내할게요.
출처: 문서
본문
설정
패키지를 설치하세요:
npm install @soniox/langchain
자격 증명
Soniox 콘솔에서 Soniox API 키를 받아 환경 변수로 설정하세요:
export SONIOX_API_KEY=your_api_key
사용법
기본 전사
SonioxAudioTranscriptLoader로 오디오 파일을 전사하고 LLM으로 요약을 생성하는 예제예요.
import { SonioxAudioTranscriptLoader } from "@soniox/langchain";
import { ChatOpenAI } from "@langchain/openai";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";
const audioFileUrl = "https://soniox.com/media/examples/coffee_shop.mp3";
const loader = new SonioxAudioTranscriptLoader(
{
audio: audioFileUrl,
},
{
language_hints: ["en"],
// Any other transcription parameters you find here
// https://soniox.com/docs/stt/api-reference/transcriptions/create_transcription
}
);
console.log(`Transcribing ${audioFileUrl}...`);
const docs = await loader.load();
const transcriptText = docs[0].pageContent;
console.log(`Transcript: ${transcriptText}`);
// Create a chain to summarize the transcript
const prompt = ChatPromptTemplate.fromTemplate(
"Write a concise summary of the following speech:\n\n{transcript}"
);
const chain = prompt
.pipe(new ChatOpenAI({ model: "gpt-5-mini" }))
.pipe(new StringOutputParser());
const summary = await chain.invoke({ transcript: transcriptText });
console.log(summary);
바이너리 데이터에서 오디오를 전사할 수도 있어요:
// Fetch the file
const response = await fetch("https://github.com/soniox/soniox_examples/raw/refs/heads/master/speech_to_text/assets/coffee_shop.mp3");
const audioBuffer = await response.bytes(); // Uint8Array
const loader = new SonioxAudioTranscriptLoader({
audio: audioBuffer,
})
const docs = await loader.load();
console.log(docs[0].pageContent); // Transcribed text
번역
감지된 모든 언어에서 대상 언어로 번역:
const loader = new SonioxAudioTranscriptLoader(
{
audio: audioFileUrl,
},
{
translation: {
type: "one_way",
target_language: "fr",
},
language_hints: ["en"],
}
);
const docs = await loader.load();
let originalText = "";
let translatedText = "";
for (const token of docs[0].metadata.tokens) {
if (token.translation_status === "translation") {
translatedText += token.text;
} else {
originalText += token.text;
}
}
console.log(originalText);
console.log(translatedText);
two_way 번역 유형을 사용해 두 언어 간 동시 전사·번역도 할 수 있어요. Soniox 번역에 대해 자세히 알아보세요.
언어 힌트
Soniox는 60개 이상의 언어로 된 음성을 자동으로 감지하고 전사해요. 오디오에 나타날 가능성이 있는 언어를 알고 있다면 language_hints를 제공해 인식을 해당 언어 쪽으로 편향시켜 정확도를 개선할 수 있어요.
언어 힌트는 인식을 제한하지 않으며, 지정된 언어 쪽으로 모델을 편향시킬 뿐이고, 다른 언어가 존재하면 여전히 감지될 수 있어요.
const loader = new SonioxAudioTranscriptLoader(
{
audio: audioFileUrl,
},
{
language_hints: ["en", "es"],
}
);
const docs = await loader.load();
자세한 내용은 Soniox 언어 힌트 문서를 참고하세요.
화자 분리 (Speaker diarization)
화자 식별을 활성화해 서로 다른 화자를 구분하세요:
const loader = new SonioxAudioTranscriptLoader(
{
audio: audioFileUrl,
},
{
enable_speaker_diarization: true,
}
);
const docs = await loader.load();
// Access speaker information in the metadata
let currentSpeaker = null;
let output = "";
for (const token of docs[0].metadata.tokens) {
if (currentSpeaker !== token.speaker) {
currentSpeaker = token.speaker;
output += `\nSpeaker ${currentSpeaker}: ${token.text.trimStart()}`;
} else {
output += token.text;
}
}
console.log(output);
// Analyze the conversation
const prompt = ChatPromptTemplate.fromTemplate(
`Analyze the following conversation between speakers.
Identify the intent of each speaker.
Conversation:
{conversation}`
);
const chain = prompt
.pipe(new ChatOpenAI({ model: "gpt-5-mini" }))
.pipe(new StringOutputParser());
const analysis = await chain.invoke({ conversation: output });
console.log(analysis);
언어 식별
자동 언어 감지 및 식별을 활성화하세요:
const loader = new SonioxAudioTranscriptLoader(
{
audio: audioFileUrl,
},
{
enable_language_identification: true,
}
);
정확도 향상을 위한 컨텍스트
전사 정확도를 개선하기 위해 도메인별 컨텍스트를 제공하세요:
const loader = new SonioxAudioTranscriptLoader(
{
audio: audioBuffer,
},
{
context: {
general: [
{ key: "industry", value: "healthcare" },
{ key: "meeting_type", value: "consultation" }
],
terms: ["hypertension", "cardiology", "metformin"],
translation_terms: [
{ source: "blood pressure", target: "presión arterial" },
{ source: "medication", target: "medicamento" }
]
}
}
);
자세한 내용은 Soniox 컨텍스트 문서를 참고하세요.
API 레퍼런스
생성자 매개변수
SonioxLoaderParams (필수)
| 매개변수 | 타입 | 필수 | 설명 |
|---|---|---|---|
audio |
Uint8Array | string |
예 | 버퍼 또는 URL로 된 오디오 파일 |
audioFormat |
SonioxAudioFormat |
아니요 | 오디오 파일 형식 |
apiKey |
string |
아니요 | Soniox API 키 (SONIOX_API_KEY 환경 변수 기본) |
apiBaseUrl |
string |
아니요 | API 기본 URL (https://api.soniox.com/v1 기본) |
pollingIntervalMs |
number |
아니요 | 폴링 간격(ms) (최소: 1000, 기본: 1000) |
pollingTimeoutMs |
number |
아니요 | 폴링 타임아웃(ms) (기본: 180000) |
SonioxLoaderOptions (선택)
| 매개변수 | 타입 | 설명 |
|---|---|---|
model |
SonioxTranscriptionModelId |
사용할 모델 (기본: "stt-async-v4") |
translation |
object |
번역 구성 |
language_hints |
string[] |
전사를 위한 언어 힌트 |
language_hints_strict |
boolean |
엄격한 언어 힌트 적용 |
enable_speaker_diarization |
boolean |
화자 식별 활성화 |
enable_language_identification |
boolean |
언어 감지 활성화 |
context |
object |
정확도 향상을 위한 컨텍스트 |
지원되는 옵션의 전체 목록은 문서를 참고하세요.
지원되는 오디오 형식
aac- Advanced Audio Codingaiff- Audio Interchange File Formatamr- Adaptive Multi-Rateasf- Advanced Systems Formatflac- Free Lossless Audio Codecmp3- MPEG Audio Layer IIIogg- Ogg Vorbiswav- Waveform Audio File Formatwebm- WebM Audio
반환 값
load() 메서드는 단일 Document 객체를 포함하는 배열을 반환해요:
type Document {
pageContent: string, // The transcribed text
metadata: SonioxTranscriptResponse // Full transcript with metadata
}
메타데이터에는 전사된 텍스트, 화자 정보(분리 활성화 시), 언어 정보(식별 활성화 시), 번역 데이터(번역 활성화 시), 타이밍 정보가 포함돼요.
type SonioxTranscriptResponse = {
id: string;
text?: string | null;
tokens?: SonioxTranscriptToken[] | null;
}
토큰 타입:
type SonioxTranscriptToken = {
text: string;
start_ms?: number | null;
end_ms?: number | null;
confidence?: number | null;
speaker?: number | string | null;
language?: string | null;
translation_status?: string | null;
};
SonioxTranscriptResponse 타입에 대해 더 자세히 알아보려면 Soniox REST API 레퍼런스를 참고하세요.
관련 자료
더 알아보기
- 이 문서를 MCP로 연결하면 Claude, VSCode 등에서 실시간 답변을 받을 수 있어요.
- GitHub에서 이 페이지 편집하기 또는 이슈 제출하기.