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回复语音文件获取成功!"
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐