如何解决OpenAI Python模块中的Unicode编码错误?
解决OpenAI API调用中的UnicodeEncodeError编码问题
问题场景
开发基于OpenAI GPT-3.5-turbo的聊天机器人,支持语音输入转文本、GPT生成回复后转语音输出,但调用OpenAI API时触发如下编码错误:
UnicodeEncodeError: 'latin-1' codec can't encode character '\u201c' in position 7: ordinal not in range(256)
错误原因
HTTP协议头默认使用latin-1编码,而语音识别(此处用sphinx)返回的文本中包含了latin-1不支持的Unicode特殊字符(比如\u201c是智能左双引号)。当OpenAI的Python SDK底层发送请求时,会尝试用latin-1编码HTTP相关内容,遇到这类字符就会触发编码失败。
解决方法
预处理语音识别的文本结果,清理或替换掉latin-1不支持的特殊Unicode字符,常用两种方式:
方式1:定向替换特殊字符
针对常见的特殊标点(比如智能引号)替换为普通ASCII标点:
# 替换智能引号为普通引号,处理常见Unicode特殊字符 my_question = my_question.replace('\u201c', '"').replace('\u201d', '"') my_question = my_question.replace('\u2018', "'").replace('\u2019', "'")
方式2:过滤非ASCII字符
如果不需要保留非ASCII字符,直接过滤所有超出ASCII范围的内容:
# 仅保留ASCII字符,忽略其他Unicode字符 my_question = my_question.encode('ascii', 'ignore').decode('ascii')
修改后的完整代码
import os import speech_recognition as sr import openai from dotenv import load_dotenv from os import path from playsound import playsound from gtts import gTTS import simpleaudio as sa load_dotenv() language = 'en' openai.api_key = os.getenv("OPENAI_API_KEY") while True: # 语音输入识别 recog = sr.Recognizer() with sr.Microphone() as source: audio = recog.listen(source) # 保存语音文件(可选,用于调试) with open("microphone-results.wav", "wb") as f: f.write(audio.get_wav_data()) AUDIO_FILE = path.join(path.dirname(path.realpath(__file__)), "microphone-results.wav") my_question = recog.recognize_sphinx(audio) # --- 新增:清理文本中的特殊Unicode字符 --- my_question = my_question.replace('\u201c', '"').replace('\u201d', '"') my_question = my_question.replace('\u2018', "'").replace('\u2019', "'") # 或者用过滤方式: # my_question = my_question.encode('ascii', 'ignore').decode('ascii') # 调用OpenAI API生成回复 response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "You are a chatbot named jarvis"}, {"role": "user", "content": str(my_question)}, ] ) reply = ''.join(choice.message.content for choice in response.choices) tts = gTTS(reply) tts_file = "temp.wav" tts.save(tts_file) wave_obj = sa.WaveObject.from_wave_file(tts_file) play_obj = wave_obj.play() play_obj.wait_done() os.remove(tts_file)
额外提示
- 建议在语音识别后添加错误处理,比如捕获
sr.UnknownValueError(无法识别语音)和sr.RequestError(识别服务出错),避免程序直接崩溃。 - 升级OpenAI SDK到最新版本,可能已修复部分编码相关的底层问题。
内容的提问来源于stack exchange,提问作者Satanic Potato
相关产品推荐
相关产品推荐

