我在 OpenShift 集群上的本地使用 Azure 容器 SpeechToText 服务。我使用最新版本:4.7.0-amd64-fr-fr。另一方面,我有小型容器化 Flask API,它使用 azure 认知服务 sdk 与容器交互,这是我能够在我的组织中使用 websocket 协议的唯一方法。
对于我实现的使用
speechsdk.SpeechRecognizer
的方法,一切正常,但使用 speechsdk.transcription.ConversationTranscriber
时,转录会因以下错误而被系统取消:
即将结束 ConversationTranscriptionCanceledEventArgs(session_id=edfb67ce81194adebba896e90996e20d, 结果=ConversationTranscriptionResult(result_id=614535e47f7b48ba9f7c2b22c1071c07, peaker_id=、text=、reason=ResultReason.Canceled)) 取消详细信息(原因=CancellationReason.Error, error_details="WebSocket 升级失败:内部服务错误 (404)。 错误详细信息:失败,未找到 HTTP 404 ws://..svc.cluster.local/speech/universal/v2?language=fr-FR X-ConnectionId: edfb67ce81194adebba896e90996e20d 请检查请求 细节。会话 ID: edfb67ce81194adebba896e90996e20d")
我使用的是 Redhat rhel8
这是我的代码:
host=ws://<service>.<namespace>.svc.cluster.local:80
app.route('/conversation', methods=['POST'])
@handle_file_d
def conversation_transcription(filename):
done = False
speech_config = speechsdk.SpeechConfig(host=host)
audio_config = speechsdk.audio.AudioConfig(filename=filename)
speech_config.speech_recognition_language=os.environ.get('SPEECH_LANGUAGE')
conversation_transcriber = speechsdk.transcription.ConversationTranscriber(speech_config=speech_config,
audio_config=audio_config)
def conversation_transcriber_recognition_canceled_cb(evt: speechsdk.SessionEventArgs):
print('Canceled event')
def conversation_transcriber_session_started_cb(evt: speechsdk.SessionEventArgs):
print('SessionStarted event')
def conversation_transcriber_session_stopped_cb(evt: speechsdk.SessionEventArgs):
print('SessionStopped event')
def conversation_transcriber_transcribed_cb(evt: speechsdk.SpeechRecognitionEventArgs):
if evt.result.reason == speechsdk.ResultReason.RecognizedSpeech:
text = '\tText={}\n'.format(evt.result.text)
speaker_id = '\tSpeaker ID={}\n'.format(evt.result.speaker_id)
print(f"{speaker_id}, {text}")
elif evt.result.reason == speechsdk.ResultReason.NoMatch:
# output.put('\tNOMATCH: Speech could not be TRANSCRIBED: {}\n'.format(evt.result.no_match_details))
print('\tNOMATCH: Speech could not be TRANSCRIBED: {}\n'.format(evt.result.no_match_details))
pass
else:
pass
def start_transcribing_async_cb(evt):
print('Start transcribing event')
def stop_cb(evt: speechsdk.SessionEventArgs):
#"""callback that signals to stop continuous recognition upon receiving an event `evt`"""
print('CLOSING on {}'.format(evt))
if evt.result.reason == speechsdk.ResultReason.Canceled:
cancellation_details = evt.result.cancellation_details
print(cancellation_details)
nonlocal done
done = 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)
# stop transcribing on either session stopped or canceled events
conversation_transcriber.session_stopped.connect(stop_cb)
conversation_transcriber.canceled.connect(stop_cb)
conversation_transcriber.start_transcribing_async()
while not done:
time.sleep(.5)
conversation_transcriber.stop_transcribing_async()
return "done"
我尝试使用不同版本的python sdk(目前我使用的是1.37.0)和不同版本的speechToText图像,但我仍然得到相同的错误。
转录从未真正开始,它似乎从未到达 SpeechToText 容器。
非常感谢:)
感谢您联系我们并报告此问题。
从错误消息来看,问题似乎出在您的连接端点 url 上。
计划一: 请启用 SDK 日志记录并检查是否提供详细的错误日志信息。
计划2: 另外,为了确保端点地址与容器兼容,您可以使用 1.34.0 之前的某些 SDK 版本记录日志(其中 v2 端点被设为默认值: https://learn.microsoft.com/azure/ai-services/speech-service/releasenotes?tabs=speech-sdk#speech-sdk-1340-november-2023-release )所以例如1.33.0,并检查那里的connectionUrl的值。
计划3: 您能否在
speechConfig
中设置 v1 端点而不是 v2 端点?这是一个例子:
speech_config
= speechsdk.SpeechConfig(
endpoint
="ws://localhost:5000/speech/recognition/conversation/cognitiveservices/v1?endSilenceTimeoutMs=5000&initialSilenceTimeoutMs=1000")
计划4: 如果没有帮助尝试使用:
SpeechConfig(endpoint=
"and give the full connection Url with the whole resource path and all query parameters"
等待您的回复。