如何生成含双方音频的视频通话单音频文件?Twilio实时转录优化
一、生成包含通话双方音频的单音频文件
方案1:通过Twilio Composition API直接合成
这是最直接的事后合成方式,只需在创建Composition时指定包含所有参与者的音频轨道:
from twilio.rest import Client # 替换为你的Twilio账号信息 account_sid = 'YOUR_ACCOUNT_SID' auth_token = 'YOUR_AUTH_TOKEN' client = Client(account_sid, auth_token) # 创建包含所有参与者音频的合成文件 composition = client.video.compositions.create( room_sid='RM_YOUR_ROOM_SID', audio_sources=['*'], # 通配符表示包含房间内所有参与者的音频轨道 status_callback='https://your-server.com/composition-status', format='mp3' # 支持mp3/ogg等格式 ) print(f"合成任务已启动,SID: {composition.sid}")
- 如果你需要指定特定参与者,可将
audio_sources替换为具体的参与者SID数组,比如['PA_USER1_SID', 'PA_USER2_SID']。 - 合成完成后,Twilio会通过
status_callback通知你文件的下载地址。
方案2:客户端实时混合并录制(无需事后合成)
如果需要在通话过程中实时获取合并后的音频文件,可以在前端使用Web Audio API混合多轨道音频后录制:
// 假设已获取本地音频流localStream和远端音频流remoteStream const audioContext = new AudioContext(); const mixedStreamDestination = audioContext.createMediaStreamDestination(); // 连接本地音频源到混合目标 const localAudioSource = audioContext.createMediaStreamSource(localStream); localAudioSource.connect(mixedStreamDestination); // 连接远端音频源到混合目标 const remoteAudioSource = audioContext.createMediaStreamSource(remoteStream); remoteAudioSource.connect(mixedStreamDestination); // 启动录制混合后的音频流 const recorder = new MediaRecorder(mixedStreamDestination.stream); recorder.start(); // 监听录制完成事件,获取Blob文件 recorder.onstop = (e) => { const audioBlob = new Blob([e.data], { type: 'audio/mp3' }); // 可将Blob上传到服务器或直接下载 const downloadLink = document.createElement('a'); downloadLink.href = URL.createObjectURL(audioBlob); downloadLink.download = 'combined-call-audio.mp3'; downloadLink.click(); };
二、实现实时转录功能(解决Composition API延迟问题)
Composition API是事后处理工具,天然不适合近实时场景,推荐以下两种实时方案:
方案1:客户端侧实时转录(轻量低延迟)
利用浏览器原生的Web Speech API直接在前端对音频流进行实时转录,无需依赖后端:
// 初始化语音识别器 const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)(); recognition.continuous = true; // 持续识别 recognition.interimResults = true; // 返回临时结果 recognition.lang = 'zh-CN'; // 设置识别语种 // 监听识别结果 recognition.onresult = (event) => { let fullTranscript = ''; for (let i = event.resultIndex; i < event.results.length; i++) { fullTranscript += event.results[i][0].transcript; } // 将转录结果展示到页面或发送给其他参与者 console.log('实时转录:', fullTranscript); }; // 传入远端音频流(本地流同理) const remoteAudioTrack = remoteStream.getAudioTracks()[0]; const mediaStream = new MediaStream([remoteAudioTrack]); // 注意:部分浏览器需要将音频流绑定到audio元素才能让识别器工作 const audioElement = document.createElement('audio'); audioElement.srcObject = mediaStream; audioElement.play(); recognition.start();
- 优点:延迟极低,开发成本低;缺点:依赖浏览器支持,对网络波动敏感,特定语种/方言支持有限。
方案2:Twilio Media Streams + 第三方实时转录服务(专业高准确率)
通过Twilio Media Streams将通话音频实时转发到你的后端,再对接专业实时转录服务(如OpenAI Whisper实时API、Google Speech-to-Text实时模式):
配置Twilio Media Streams:
在Twilio控制台的视频房间配置中,开启Media Streams,指定你的后端WebSocket端点(如wss://your-server.com/twilio-audio-stream)。后端接收音频流并转发到转录服务(Node.js示例):
const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', (ws) => { ws.on('message', (data) => { const message = JSON.parse(data.toString()); // 处理媒体事件,获取PCMU编码的音频数据 if (message.event === 'media') { const audioPayload = Buffer.from(message.media.payload, 'base64'); // 将音频数据发送到实时转录服务(示例为伪代码) sendToRealTimeTranscription(audioPayload); } }); }); async function sendToRealTimeTranscription(audioBuffer) { // 对接第三方实时转录API,比如Whisper实时或Google STT const response = await fetch('https://transcription-service.com/realtime', { method: 'POST', body: audioBuffer, headers: { 'Content-Type': 'audio/pcm; rate=8000' } // Twilio默认是8kHz PCMU }); const transcriptResult = await response.json(); // 将转录结果推送到前端或存储 console.log('专业转录结果:', transcriptResult.text); }
- 优点:转录准确率高,支持多语种/方言,稳定性强;缺点:需要后端开发,需承担第三方转录服务的成本。
方案3:使用Twilio Marketplace转录插件
检查Twilio Marketplace是否有官方或第三方的实时转录插件,部分插件可直接集成到视频通话中,无需自行处理流转发逻辑,能大幅减少开发工作量。
内容的提问来源于stack exchange,提问作者user21233524
相关产品推荐
相关产品推荐

