You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure多通道音频流语音转文本:如何区分各通道转录内容

解决Azure Speech to Text双声道通道识别问题

问题分析

你当前使用ConversationTranscriber处理双声道音频时,所有转录结果的Channel字段都显示为0,核心原因是默认配置未明确告知服务音频的声道数量,导致服务无法区分不同声道的音频流。

解决方案

1. 配置音频声道数

创建AudioConfig时,通过属性明确指定音频的声道数量,让Speech服务识别并区分不同通道的音频。

2. 确保音频格式合规

确认你的音频文件是标准双声道(立体声)格式,且说话人1的音频确实对应通道1、说话人2对应通道2,避免单声道转双声道的无效格式。

修改后的代码实现

以下是调整后的完整代码,重点修改了AudioConfig的配置部分:

import time
import traceback
import logging
import json
import azure.cognitiveservices.speech as speechsdk

def conversation_transcriber_recognition_canceled_cb(evt: speechsdk.SessionEventArgs):
    print('Canceled event')

def conversation_transcriber_session_stopped_cb(evt: speechsdk.SessionEventArgs):
    print('SessionStopped event')

def conversation_transcriber_transcribed_cb(evt: speechsdk.SpeechRecognitionEventArgs):
    try:
        print('TRANSCRIBED:')
        result_json = evt.result.json
        print(result_json)
        # 解析通道信息并映射预设说话人姓名
        result_data = json.loads(result_json)
        channel = result_data.get("Channel")
        speaker_name = "说话人1" if channel == 1 else "说话人2" if channel == 2 else "未知"
        print(f"映射后说话人: {speaker_name}")
    except Exception:
        print(traceback.format_exc())
        logging.error(traceback.format_exc())

def conversation_transcriber_session_started_cb(evt: speechsdk.SessionEventArgs):
    print('SessionStarted event')

def recognize_from_file():
    speech_key = "你的订阅密钥"
    service_region = "你的服务区域"
    audio_filename = "你的双声道音频文件路径"

    speech_config = speechsdk.SpeechConfig(
        subscription=speech_key, region=service_region)
    speech_config.speech_recognition_language = "en-US"

    # 关键修改:配置双声道参数
    audio_config = speechsdk.audio.AudioConfig(filename=audio_filename)
    # 指定音频声道数为2
    audio_config.set_property(speechsdk.PropertyId.SpeechServiceConnection_AudioChannelCount, "2")
    # 明确设置多声道输入类型
    audio_config.set_property(speechsdk.PropertyId.AudioInput_Type, "MultiChannel")

    conversation_transcriber = speechsdk.transcription.ConversationTranscriber(
        speech_config=speech_config, audio_config=audio_config)

    transcribing_stop = False

    def stop_cb(evt: speechsdk.SessionEventArgs):
        print('CLOSING on {}'.format(evt))
        nonlocal transcribing_stop
        transcribing_stop = True

    # 绑定回调事件
    conversation_transcriber.transcribed.connect(conversation_transcriber_transcribed_cb)
    conversation_transcriber.session_started.connect(conversation_transcriber_session_started_cb)
    conversation_transcriber.session_stopped.connect(conversation_transcriber_session_stopped_cb)
    conversation_transcriber.canceled.connect(conversation_transcriber_recognition_canceled_cb)
    conversation_transcriber.session_stopped.connect(stop_cb)
    conversation_transcriber.canceled.connect(stop_cb)

    conversation_transcriber.start_transcribing_async()

    while not transcribing_stop:
        time.sleep(10)

    conversation_transcriber.stop_transcribing_async()

if __name__ == "__main__":
    recognize_from_file()

关键说明

  • 通过set_property设置SpeechServiceConnection_AudioChannelCount为"2",强制告知服务音频为双声道格式。
  • 在转录回调中,解析结果的Channel字段,直接根据预设规则映射真实说话人姓名,替代原有的Guest标识。
  • 如果仍出现Channel为0的情况,用音频编辑工具(如Audacity)检查音频文件:确认两个声道的波形分别对应不同说话人,避免是单声道转双声道的无效文件。

内容的提问来源于stack exchange,提问作者Harish Alwala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:00:08