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
相关产品推荐
相关产品推荐

