天问ESP32C3-Pro实现语音大模型对话(服务器代码)
ESP32C3-Pro,需要购买麦克风及喇叭,一个INMP441模块和一个MAX98357模块。服务器端代码,可以使用阿里云大模型,阿里云tts和asr实现大模型对话。boot键,对着INMP441说话时,开始录音(时间可以更改,默认·3秒)。注意:因为ESP32C3只有一个I2S,所以无法同时接收和发送音频。其他细节也可以修改,比如播放音频不能播放最后一个字。
ESP32C3-Pro,需要购买麦克风及喇叭,一个INMP441模块和一个MAX98357模块。
'''
大模型案例
该案例需要连接一个INMP441模块,和一个MAX98357模块。
INMP441连线如下:
INMP441 ESP32C3
VDD 3V
GND G
SD IO7(SD)
SCK IO4(SCK)
WS IO0(WS)
L/R G
MAX98357连线如下:
MAX98357 ESP32C3(图形块)
Vin 5V
GND G
SD 3V
GAIN 悬空
DIN IO3(SD)
RCLK IO2(SCK)
LRC IO1(WS)
按住boot键,对着INMP441说话时,开始录音(时间可以更改,默认·3秒)。
注意:因为ESP32C3只有一个I2S,所以无法同时接收和发送音频。
'''
esp32代码可以用天问的大模型对话.hd
只需要把
response = urequests.post("http://www.haohaodada.com/project/voiceAI/ApiAI.php",files={"file":(file_path,"audio/wav")},params={"userName":'修改为你自己的帐号名称',"userPwd":'修改为你自己的帐号密码'},timeout=20)
改成自己的地址。其他细节也可以修改,比如播放音频不能播放最后一个字。
服务器相关代码(阿里云llm+asr+tts):
文件上传 识别代码:
app = Flask(__name__)
# 配置上传文件夹
UPLOAD_FOLDER = 'uploads'
if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# 添加静态文件访问路由
@app.route('/uploads/<filename>')
def uploaded_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
@app.route('/project/voiceAI/ApiAI.php', methods=['POST'])
def handle_audio_upload():
# 获取当前时间并格式化为时间戳(例如:20240515_)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
# 1. 获取查询参数 (params)
username = request.args.get('userName')
password = request.args.get('userPwd')
# 2. 验证用户凭证
if username == '' or password == '':
return jsonify({
"success": 401,
"msg": "用户名或密码错误"
}), 401
# 3. 检查是否有文件上传
if 'file' not in request.files:
return jsonify({
"success": 400,
"msg": "没有上传文件"
}), 400
file = request.files['file']
# 4. 检查文件有效性
if file.filename == '':
return jsonify({
"success": 400,
"msg": "未选择文件"
}), 400
# 5. 检查文件类型
if not (file.filename.endswith('.wav') or file.filename.endswith('.pcm')):
return jsonify({
"success": 400,
"msg": "上传的pcm文件格式不正确!"
}), 400
# 6. 保存文件
# 原始文件名
original_filename = secure_filename(file.filename)
# 添加时间戳的新文件名(例如:20240515_audio.pcm)
timestamped_filename = timestamp + "_" + original_filename
# 保存文件
save_path = os.path.join(app.config['UPLOAD_FOLDER'], timestamped_filename)
file.save(save_path)
print(save_path)
# 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将apiKey替换为自己的API Key
# import dashscope
dashscope.api_key = api_key
recognition = Recognition(model='paraformer-realtime-v2',
format='pcm',
sample_rate=16000,
# “language_hints”只支持paraformer-realtime-v2模型
language_hints=['zh', 'en'],
callback=None)
result = recognition.call(save_path)
sentences = result.get_sentence()
if result.status_code == HTTPStatus.OK:
print('识别结果:')
print(result.get_sentence())
first_sentence_text = sentences[0]['text']
print("第一个句子文本:", first_sentence_text)
else:
print('Error: ', result.message)
json返回格式:
服务器JSON 格式响应:
{
"question": "用户说话内容",
"src": "大模型回复",
"srclink": "http://ip:port/......./aireplywav/src.wav",#tts合成答案的语音文件
"pcmlink": "http://ip:port/......./pcm/pcm.txt", #esp32上传语音文件
"success": 200,
"msg": "AI回复语音文件获取成功!"
}
更多推荐



所有评论(0)