{"product_id":"phien-am-audio-với-deepgram-claude-giọng-noi-dến-insight","title":"Phiên âm Audio với Deepgram + Claude — Giọng nói đến insight","description":"\n\u003cp\u003eKết hợp \u003cstrong\u003eDeepgram\u003c\/strong\u003e (speech-to-text hàng đầu) với \u003cstrong\u003eClaude\u003c\/strong\u003e (text analysis) tạo ra pipeline mạnh mẽ: chuyển audio thành text, rồi extract insights, tóm tắt, hoặc phân tích sentiment tự động. Use case phổ biến: ghi chép cuộc họp, phân tích customer calls, tạo subtitles.\u003c\/p\u003e\n\n\u003ch2\u003eDeepgram vs các STT khác\u003c\/h2\u003e\n\n\u003cp\u003eTại sao chọn Deepgram?\u003c\/p\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eAccuracy\u003c\/strong\u003e — WER (Word Error Rate) thấp nhất trong các STT services\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSpeed\u003c\/strong\u003e — Real-time transcription với latency \u0026lt; 300ms\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eFeatures\u003c\/strong\u003e — Diarization (ai nói?), punctuation, speaker labels\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eVietnamese support\u003c\/strong\u003e — Hỗ trợ tiếng Việt với model Nova-2\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eCost\u003c\/strong\u003e — Cạnh tranh, có free tier 12,000 phút\/năm\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eCài đặt\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003epip install deepgram-sdk anthropic aiofiles\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport os\nimport asyncio\nfrom deepgram import DeepgramClient, PrerecordedOptions, FileSource\nimport anthropic\n\ndeepgram = DeepgramClient(api_key=os.environ.get(\"DEEPGRAM_API_KEY\"))\nclaude = anthropic.Anthropic(api_key=os.environ.get(\"ANTHROPIC_API_KEY\"))\n\nprint(\"Deepgram + Claude ready\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003ePhiên âm File Audio\u003c\/h2\u003e\n\n\u003cp\u003eDeepgram hỗ trợ nhiều định dạng: MP3, MP4, WAV, FLAC, OGG, WebM và nhiều hơn:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003easync def transcribe_file(audio_path, language=\"vi\"):\n    \"\"\"\n    Phiên âm file audio với Deepgram.\n\n    Args:\n        audio_path: Đường dẫn đến file audio\n        language: 'vi' cho tiếng Việt, 'en' cho tiếng Anh\n\n    Returns:\n        dict với transcript, words, và metadata\n    \"\"\"\n    with open(audio_path, \"rb\") as audio_file:\n        audio_data = audio_file.read()\n\n    payload: FileSource = {\"buffer\": audio_data}\n\n    options = PrerecordedOptions(\n        model=\"nova-2\",           # Model tốt nhất hiện tại\n        language=language,\n        smart_format=True,        # Tự động format numbers, dates\n        punctuate=True,           # Thêm dấu câu\n        diarize=True,             # Phân biệt người nói\n        utterances=True,          # Chia theo câu nói\n        paragraphs=True,          # Chia theo đoạn văn\n        sentiment=True,           # Phân tích cảm xúc\n        summarize=\"v2\",           # Tóm tắt tự động\n    )\n\n    response = await deepgram.listen.asyncprerecorded.v(\"1\").transcribe_file(\n        payload,\n        options\n    )\n\n    result = response.results\n    channel = result.channels[0]\n    alternative = channel.alternatives[0]\n\n    # Extract speaker segments nếu có diarization\n    speakers = {}\n    if result.utterances:\n        for utterance in result.utterances:\n            speaker = utterance.speaker\n            if speaker not in speakers:\n                speakers[speaker] = []\n            speakers[speaker].append(utterance.transcript)\n\n    return {\n        \"transcript\": alternative.transcript,\n        \"paragraphs\": [p.sentences[0].text if p.sentences else \"\"\n                       for p in (alternative.paragraphs.paragraphs if alternative.paragraphs else [])],\n        \"confidence\": alternative.confidence,\n        \"speakers\": speakers,\n        \"summary\": result.summary.short if hasattr(result, 'summary') and result.summary else None,\n        \"duration\": response.metadata.duration\n    }\n\n# Ví dụ sử dụng\nresult = asyncio.run(transcribe_file(\"meeting.mp3\", language=\"vi\"))\nprint(f\"Transcript: {result['transcript'][:500]}\")\nprint(f\"Duration: {result['duration']:.1f}s\")\nprint(f\"Confidence: {result['confidence']:.2%}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003ePhiên âm từ URL\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003easync def transcribe_url(audio_url, language=\"en\"):\n    \"\"\"Phiên âm audio từ URL (YouTube, podcast, etc.)\"\"\"\n    options = PrerecordedOptions(\n        model=\"nova-2\",\n        language=language,\n        smart_format=True,\n        punctuate=True,\n        diarize=True,\n        utterances=True\n    )\n\n    response = await deepgram.listen.asyncprerecorded.v(\"1\").transcribe_url(\n        {\"url\": audio_url},\n        options\n    )\n\n    transcript = response.results.channels[0].alternatives[0].transcript\n    return transcript\n\n# Phiên âm podcast hoặc video\nurl = \"https:\/\/example.com\/podcast-episode.mp3\"\ntranscript = asyncio.run(transcribe_url(url))\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003ePhân tích Meeting với Claude\u003c\/h2\u003e\n\n\u003cp\u003eSau khi có transcript, Claude có thể extract nhiều loại insights:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003edef analyze_meeting(transcript, speakers=None):\n    \"\"\"\n    Phân tích nội dung cuộc họp với Claude.\n    Trả về: tóm tắt, action items, quyết định, và điểm chú ý.\n    \"\"\"\n\n    # Format transcript với speaker labels nếu có\n    if speakers and len(speakers) \u0026gt; 1:\n        formatted = \"TRANSCRIPT THEO NGƯỜI NÓI:\n\n\"\n        for speaker_id, texts in speakers.items():\n            formatted += f\"[Speaker {speaker_id}]:\n\"\n            formatted += \"\n\".join(texts[:5])  # 5 đoạn đầu mỗi người\n            formatted += \"\n\n\"\n    else:\n        formatted = transcript\n\n    prompt = f\"\"\"Phân tích transcript cuộc họp sau và cung cấp:\n\n1. **TÓM TẮT** (3-5 câu): Nội dung chính của cuộc họp là gì?\n2. **ACTION ITEMS**: Liệt kê các việc cần làm, ai chịu trách nhiệm\n3. **QUYẾT ĐỊNH**: Các quyết định đã được đưa ra\n4. **ĐIỂM QUAN TRỌNG**: Thông tin key facts, numbers, deadlines\n5. **FOLLOW-UP**: Câu hỏi chưa được giải quyết, cần theo dõi thêm\n\nTRANSCRIPT:\n{formatted[:4000]}\"\"\"\n\n    response = claude.messages.create(\n        model=\"claude-opus-4-5\",\n        max_tokens=2048,\n        messages=[{\"role\": \"user\", \"content\": prompt}]\n    )\n\n    return response.content[0].text\n\n# Pipeline hoàn chỉnh\nasync def meeting_pipeline(audio_path):\n    \"\"\"Pipeline từ audio file đến meeting analysis.\"\"\"\n    print(\"Step 1: Transcribing audio...\")\n    result = await transcribe_file(audio_path, language=\"vi\")\n\n    print(f\"  Transcribed {result['duration']:.0f}s of audio\")\n    print(f\"  Confidence: {result['confidence']:.2%}\")\n\n    print(\"\nStep 2: Analyzing with Claude...\")\n    analysis = analyze_meeting(\n        transcript=result[\"transcript\"],\n        speakers=result[\"speakers\"]\n    )\n\n    return {\n        \"transcript\": result[\"transcript\"],\n        \"analysis\": analysis,\n        \"speakers_count\": len(result[\"speakers\"]),\n        \"duration_minutes\": result[\"duration\"] \/ 60\n    }\n\n# Chạy pipeline\n# meeting_result = asyncio.run(meeting_pipeline(\"team_meeting.mp3\"))\n# print(meeting_result[\"analysis\"])\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eReal-time Transcription\u003c\/h2\u003e\n\n\u003cp\u003eDeepgram cũng hỗ trợ streaming transcription cho live audio:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport asyncio\nfrom deepgram import LiveTranscriptionEvents, LiveOptions\n\nasync def realtime_transcription():\n    \"\"\"Real-time transcription từ microphone.\"\"\"\n\n    connection = deepgram.listen.asynclive.v(\"1\")\n\n    # Callback khi nhận transcript\n    async def on_transcript(self, result, **kwargs):\n        sentence = result.channel.alternatives[0].transcript\n        if sentence:\n            print(f\"Transcript: {sentence}\")\n\n    connection.on(LiveTranscriptionEvents.Transcript, on_transcript)\n\n    options = LiveOptions(\n        model=\"nova-2\",\n        language=\"vi\",\n        encoding=\"linear16\",\n        channels=1,\n        sample_rate=16000,\n        interim_results=True,  # Show partial results\n        smart_format=True\n    )\n\n    await connection.start(options)\n\n    # Đọc audio từ microphone (cần pyaudio)\n    # Gửi chunks: await connection.send(audio_chunk)\n\n    await asyncio.sleep(30)  # Record 30 giây\n    await connection.finish()\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003ePhân tích Customer Calls\u003c\/h2\u003e\n\n\u003cp\u003eUse case thực tế: phân tích sentiment và chất lượng customer service:\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003edef analyze_customer_call(transcript):\n    \"\"\"Phân tích cuộc gọi khách hàng — quality assurance.\"\"\"\n\n    prompt = f\"\"\"Phân tích cuộc gọi customer service này:\n\nTRANSCRIPT:\n{transcript[:3000]}\n\nĐánh giá theo các tiêu chí:\n1. **SENTIMENT KHÁCH HÀNG**: Positive\/Neutral\/Negative, lý do\n2. **VẤN ĐỀ**: Khách hàng gọi vì vấn đề gì?\n3. **GIẢI QUYẾT**: Vấn đề có được giải quyết không?\n4. **CHẤT LƯỢNG AGENT**: Điểm 1-10, nhận xét về thái độ và kỹ năng\n5. **ESCALATION RISK**: Có nguy cơ khách hàng churn không?\n6. **IMPROVEMENT**: Gợi ý cải thiện cho lần sau\n\nTrả lời dưới dạng JSON.\"\"\"\n\n    response = claude.messages.create(\n        model=\"claude-haiku-4-5\",\n        max_tokens=1024,\n        messages=[{\"role\": \"user\", \"content\": prompt}]\n    )\n\n    return response.content[0].text\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eXử lý nhiều files cùng lúc\u003c\/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003eimport asyncio\nfrom pathlib import Path\n\nasync def batch_transcribe(audio_dir, language=\"vi\"):\n    \"\"\"Phiên âm tất cả audio files trong thư mục.\"\"\"\n    audio_files = list(Path(audio_dir).glob(\"*.mp3\")) +                   list(Path(audio_dir).glob(\"*.wav\"))\n\n    print(f\"Found {len(audio_files)} audio files\")\n\n    # Chạy parallel (tối đa 5 files cùng lúc)\n    semaphore = asyncio.Semaphore(5)\n\n    async def transcribe_with_semaphore(file_path):\n        async with semaphore:\n            result = await transcribe_file(str(file_path), language)\n            return {\"file\": file_path.name, **result}\n\n    tasks = [transcribe_with_semaphore(f) for f in audio_files]\n    results = await asyncio.gather(*tasks, return_exceptions=True)\n\n    # Filter errors\n    successful = [r for r in results if not isinstance(r, Exception)]\n    print(f\"Successfully transcribed: {len(successful)}\/{len(audio_files)}\")\n\n    return successful\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eKết luận\u003c\/h2\u003e\n\n\u003cp\u003ePipeline Deepgram + Claude biến audio thành structured insights hoàn toàn tự động. Từ meeting recordings đến customer calls, từ podcasts đến voice memos — bất kỳ audio nào cũng có thể trở thành searchable, analyzable knowledge.\u003c\/p\u003e\n\n\u003cp\u003eBước tiếp theo: Đọc về \u003ca href=\"\/collections\/ung-dung\"\u003eVoice Assistant với ElevenLabs + Claude\u003c\/a\u003e để thêm khả năng text-to-speech, tạo vòng lặp voice conversation hoàn chỉnh.\u003c\/p\u003e\n\n\u003chr\u003e\n\u003ch3\u003eBài viết liên quan\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"\/products\/b%E1%BA%AFt-d%E1%BA%A7u-v%E1%BB%9Bi-claude-vision-g%E1%BB%ADi-hinh-%E1%BA%A3nh-qua-api\"\u003eBắt đầu với Claude Vision — Gửi hình ảnh qua API\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/chuy%E1%BB%83n-t%E1%BB%AB-openai-agents-sdk-sang-claude-h%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-migration-chi-ti%E1%BA%BFt\"\u003eChuyển từ OpenAI Agents SDK sang Claude — Hướng dẫn migration chi tiết\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/context-compaction-t%E1%BB%B1-d%E1%BB%99ng-nen-context-cho-conversations-dai\"\u003eContext Compaction — Tự động nén context cho conversations dài\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/claude-cho-data-kham-pha-dataset-m%E1%BB%9Bi\"\u003eClaude cho Data: Khám phá dataset mới\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/products\/claude-cho-engineering-incident-response-workflow\"\u003eClaude cho Engineering: Incident Response workflow\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721906634964,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/phien-am-audio-v_i-deepgram-claude-gi_ng-noi-d_n-insight_c8703dae-770b-4feb-96db-e09377489fde.jpg?v=1774521807","url":"https:\/\/claude.vn\/products\/phien-am-audio-v%e1%bb%9bi-deepgram-claude-gi%e1%bb%8dng-noi-d%e1%ba%bfn-insight","provider":"CLAUDE.VN","version":"1.0","type":"link"}