【人工智能应用技术】-基础实战-小程序应用(基于springAI+百度语音技术)智能语音开关

ConvLSTM时空预测实战代码详解 ConvLSTM代码复现 阅读详情

微信小程序实现智能设备语音控制(百度语音识别API)——新手踩坑全记录与解决方案

作为编程新手,最近尝试开发一款“智能设备语音控制”微信小程序(核心功能:语音指令→百度API转文字→控制客厅灯/卧室空调),过程中踩了无数坑:从音频参数不匹配到Token获取失败,从API请求格式错误到音频解析异常,最终一步步解决所有问题实现功能。本文将以新手视角,递进式梳理整个开发流程、遇到的所有问题及排查解决方案,既是开发总结,也希望能帮到同阶段的小伙伴。
在这里插入图片描述

手机界面
在这里插入图片描述

一、开发前准备(新手必看:环境+配置不能少)

1.1 开发环境搭建

首先确保基础开发环境到位,新手别跳过这一步,否则后续会出现各种“莫名报错”:

  • 微信开发者工具:下载最新稳定版(本文使用v2.0.12510260),安装后登录微信账号,创建“小程序”项目(选择“不使用云服务”,模板选“空模板”)。
  • 基础库版本:开发者工具→详情→本地设置→调试基础库,选择2.30.0(稳定版,兼容录音、文件读取等API)。
  • 真机调试准备:小程序录音功能不支持模拟器,全程需用“真机调试”(工具右上角→真机调试,手机扫码即可)。

1.2 百度语音识别API申请(核心!密钥别错)

小程序的语音转文字依赖百度短语音识别API,需先申请开发者密钥:

  1. 登录百度智能云官网,注册/登录账号;
  2. 进入“产品服务→人工智能→语音技术”,点击“立即使用”;
  3. 创建应用:填写应用名称(如“小程序语音控制”),勾选“短语音识别”服务,提交后即可看到API Key和Secret Key(后续代码要用到,复制保存好,别漏字符/多空格);
  4. 领取免费资源:进入“资源管理”,领取“短语音识别”免费资源包(5万次调用,足够测试)。
    使用到的核心API
    在这里插入图片描述
    在这里插入图片描述

1.3 小程序域名白名单配置(新手最易漏!)

微信小程序限制网络请求域名,需提前配置合法域名,否则会报“请求未找到合法域名”:

  1. 登录微信公众平台,进入自己的小程序项目;
  2. 开发→开发设置→服务器域名:
    • request合法域名添加:https://aip.baidubce.com(获取Token)、https://vop.baidu.com(语音识别);
    • 无需配置uploadFile域名(后续改用JSON方式上传音频,不用wx.uploadFile);
  3. 保存后重启微信开发者工具,配置才会生效。

二、核心功能开发(从页面到逻辑,递进式实现)

2.1 页面结构(index.wxml):新手友好的简单布局

先搭建基础界面,包含“语音按钮、识别结果、手动输入框、设备列表”,代码注释清晰,新手能看懂:

<!-- 语音控制区 -->
<view class="voice-section">
  <button class="mic-btn {{isRecording ? 'recording' : ''}}" bindtap="startVoiceControl">
    <text class="mic-icon">🎤</text>
    <text class="mic-text">{{isRecording ? '停止录音' : '点击说话控制设备'}}</text>
  </button>
  <view class="voice-result">识别结果:{{voiceText || '未识别到语音'}}</view>
  <input 
    class="voice-input" 
    placeholder="手动输入指令(如:打开客厅灯)" 
    bindinput="inputVoiceText"
    value="{{voiceText}}"
  />
  <button class="send-btn" bindtap="executeVoiceCommand">执行指令</button>
</view>

<!-- 智能设备列表 -->
<view class="device-section">
  <text class="section-title">我的智能设备</text>
  <!-- 客厅灯 -->
  <view class="device-card">
    <view class="device-info">
      <text class="device-name">客厅灯</text>
      <text class="device-status {{deviceList.livingRoomLight.status ? 'online' : 'offline'}}">
        {{deviceList.livingRoomLight.status ? '在线' : '离线'}}
      </text>
    </view>
    <view class="device-control">
      <text class="switch-status">{{deviceList.livingRoomLight.switch ? '开' : '关'}}</text>
      <button 
        class="switch-btn {{deviceList.livingRoomLight.switch ? 'on' : 'off'}}"
        bindtap="toggleDeviceSwitch"
        data-device="livingRoomLight"
      >
        {{deviceList.livingRoomLight.switch ? '关闭' : '打开'}}
      </button>
    </view>
  </view>

  <!-- 卧室空调 -->
  <view class="device-card">
    <view class="device-info">
      <text class="device-name">卧室空调</text>
      <text class="device-status {{deviceList.bedroomAir.status ? 'online' : 'offline'}}">
        {{deviceList.bedroomAir.status ? '在线' : '离线'}}
      </text>
    </view>
    <view class="device-control">
      <text class="switch-status">{{deviceList.bedroomAir.switch ? '开' : '关'}}</text>
      <button 
        class="switch-btn {{deviceList.bedroomAir.switch ? 'on' : 'off'}}"
        bindtap="toggleDeviceSwitch"
        data-device="bedroomAir"
      >
        {{deviceList.bedroomAir.switch ? '关闭' : '打开'}}
      </button>
    </view>
  </view>
</view>

<!-- 操作提示弹窗 -->
<view class="result-toast" wx:if="{{showResult}}">{{resultText}}</view>

2.2 样式美化(index.wxss):简单易上手

不用复杂样式,重点是界面清晰,新手可直接复制:

page { background-color: #f5f5f5; padding-bottom: 20px; }

/* 语音控制区 */
.voice-section {
  background: white;
  padding: 20px;
  margin-bottom: 10px;
  text-align: center;
}
.mic-btn {
  background: #1677ff;
  color: white;
  border: none;
  border-radius: 50px;
  padding: 15px 30px;
  font-size: 16px;
  margin-bottom: 15px;
}
.mic-btn.recording { background: #ff4d4f; }
.mic-icon { font-size: 20px; margin-right: 8px; }
.voice-result {
  font-size: 14px;
  color: #666;
  margin: 10px 0;
  text-align: left;
  padding: 0 10%;
}
.voice-input {
  border: 1px solid #e5e5e5;
  border-radius: 8px;
  padding: 10px 15px;
  font-size: 14px;
  margin-bottom: 10px;
  width: 90%;
}
.send-btn {
  background: #00b578;
  color: white;
  border: none;
  border-radius: 8px;
  padding: 8px 20px;
  font-size: 14px;
}

/* 设备列表 */
.device-section { padding: 0 10px; }
.section-title {
  font-size: 16px;
  font-weight: bold;
  margin: 15px 0;
  display: block;
}
.device-card {
  background: white;
  border-radius: 10px;
  padding: 15px;
  margin-bottom: 10px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.device-status.online { color: #00b578; }
.device-status.offline { color: #ff4d4f; }
.switch-btn.on { background: #ff4d4f; color: white; border: none; }
.switch-btn.off { background: #1677ff; color: white; border: none; }

/* 提示弹窗 */
.result-toast {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: rgba(0,0,0,0.7);
  color: white;
  padding: 10px 20px;
  border-radius: 8px;
  font-size: 14px;
  z-index: 999;
}

2.3 核心逻辑开发(index.js):分模块实现

新手建议分模块写逻辑,避免代码混乱,核心模块包括:录音初始化、Token获取、语音转文字、设备控制。

第一步:初始化数据+录音管理器
Page({
  data: {
    voiceText: '', // 语音识别结果
    // 设备初始状态(模拟)
    deviceList: {
      livingRoomLight: { status: true, switch: false }, // 客厅灯:在线、关闭
      bedroomAir: { status: true, switch: true }        // 卧室空调:在线、打开
    },
    showResult: false, // 提示弹窗显示状态
    resultText: '',    // 提示文本
    isRecording: false,// 录音状态
    recorderManager: null, // 录音管理器
    tempFilePath: ''   // 录音文件路径
  },

  // 页面加载时初始化录音管理器
  onLoad: function() {
    const recorderManager = wx.getRecorderManager();
    this.setData({ recorderManager });
    this.initRecorder(); // 初始化录音回调
  },

  // 初始化录音回调(开始/停止/错误)
  initRecorder: function() {
    const that = this;
    const recorderManager = this.data.recorderManager;

    // 录音开始
    recorderManager.onStart(() => {
      that.setData({ isRecording: true });
      that.showResultToast('正在录音,请说话');
    });

    // 录音停止(获取文件路径,调用识别接口)
    recorderManager.onStop((res) => {
      that.setData({
        isRecording: false,
        tempFilePath: res.tempFilePath
      });
      that.voiceToText(res.tempFilePath); // 核心:语音转文字
    });

    // 录音错误
    recorderManager.onError((err) => {
      that.setData({ isRecording: false });
      that.showResultToast('录音失败:' + err.errMsg);
    });
  },
})
第二步:录音控制+手动输入
// 开始/停止录音(含权限申请)
startVoiceControl: function() {
  const { isRecording, recorderManager } = this.data;
  if (isRecording) {
    recorderManager.stop();
  } else {
    // 动态申请录音权限(新手别忘!否则真机录音失败)
    wx.authorize({
      scope: 'scope.record',
      success: () => {
        // 录音参数:严格匹配百度API要求(新手重点!参数错必报错)
        recorderManager.start({
          format: 'wav',        // 百度支持的格式
          sampleRate: 16000,    // 百度强制采样率
          numberOfChannels: 1,  // 单声道
          encodeBitRate: 64000, // 微信允许范围(24000-96000)
          duration: 6000        // 最长录音6秒
        });
      },
      fail: () => {
        wx.showModal({
          title: '权限申请失败',
          content: '需要麦克风权限才能语音控制,请前往设置开启',
          confirmText: '去设置',
          success: (res) => {
            if (res.confirm) wx.openSetting();
          }
        });
      }
    });
  }
},

// 手动输入指令
inputVoiceText: function(e) {
  this.setData({ voiceText: e.detail.value });
},

// 显示提示弹窗(3秒后隐藏)
showResultToast: function(text) {
  this.setData({ showResult: true, resultText: text });
  setTimeout(() => {
    this.setData({ showResult: false });
  }, 3000);
},
第三步:百度Token获取+语音转文字(核心!按官方规范)

新手最容易在这里出错,重点是“按百度API官方要求传参”,放弃wx.uploadFile,改用JSON方式上传(base64编码音频):

// 核心:百度语音转文字(按官方JSON方式)
voiceToText: function(tempFilePath) {
  const that = this;
  // ========== 新手替换这里!填自己的百度API密钥 ==========
  const apiKey = '你的API Key';
  const secretKey = '你的Secret Key';
  // ======================================================

  // 步骤1:获取百度Access Token(官方POST表单方式)
  wx.request({
    url: 'https://aip.baidubce.com/oauth/2.0/token',
    method: 'POST',
    header: { 'Content-Type': 'application/x-www-form-urlencoded' },
    data: {
      grant_type: 'client_credentials', // 官方固定值
      client_id: apiKey,
      client_secret: secretKey
    },
    success: (tokenRes) => {
      // 检查Token是否获取成功
      if (tokenRes.statusCode !== 200 || tokenRes.data.error) {
        let errMsg = tokenRes.data.error_description || 'Token获取失败';
        if (tokenRes.data.error === 'invalid_client') errMsg = 'API Key/Secret Key错误,请核对';
        that.showResultToast(errMsg);
        return;
      }
      const accessToken = tokenRes.data.access_token;

      // 步骤2:读取录音文件(二进制→base64,获取原始字节长度)
      const fs = wx.getFileSystemManager();
      fs.readFile({
        filePath: tempFilePath,
        encoding: 'binary', // 先读二进制,获取原始长度
        success: (binaryRes) => {
          const fileBinary = binaryRes.data;
          const fileLen = fileBinary.length; // 原始字节长度(百度要求的len参数)
          // 二进制转base64(百度要求的speech参数)
          const speechBase64 = wx.arrayBufferToBase64(new Uint8Array(
            fileBinary.split('').map(char => char.charCodeAt(0))
          ));

          // 步骤3:构造百度API要求的JSON请求体
          const requestData = {
            "format": "wav",
            "rate": 16000,
            "channel": 1,
            "cuid": "wx-miniprogram-123456789", // 固定值,避免为空
            "token": accessToken,
            "dev_pid": 1537, // 普通话近场识别模型
            "len": fileLen,  // 原始字节长度(关键!不是base64长度)
            "speech": speechBase64 // base64编码的音频
          };

          // 步骤4:发送POST请求(手动序列化JSON,避免字段丢失)
          wx.request({
            url: 'https://vop.baidu.com/server_api',
            method: 'POST',
            header: { 'Content-Type': 'application/json; charset=utf-8' },
            data: JSON.stringify(requestData),
            success: (transRes) => {
              console.log('百度API返回:', transRes.data); // 新手调试用:看返回结果
              if (transRes.data.err_no === 0 && transRes.data.result) {
                const text = transRes.data.result[0];
                that.setData({ voiceText: text });
                that.showResultToast('识别成功:' + text);
                that.executeVoiceCommand(); // 自动执行设备控制
              } else {
                const errMsg = transRes.data.err_msg || '识别失败';
                that.showResultToast(`识别失败:${errMsg}(错误码:${transRes.data.err_no})`);
              }
            },
            fail: (err) => {
              that.showResultToast('请求百度API失败:' + err.errMsg);
            }
          });
        },
        fail: (fileErr) => {
          that.showResultToast('读取录音文件失败:' + fileErr.errMsg);
        }
      });
    },
    fail: (tokenErr) => {
      that.showResultToast('获取Token失败:' + tokenErr.errMsg);
    }
  });
},
第四步:设备控制逻辑(指令解析+手动切换)
// 执行语音/手动指令(解析关键词控制设备)
executeVoiceCommand: function() {
  const { voiceText, deviceList } = this.data;
  if (!voiceText.trim()) {
    this.showResultToast('请输入/说出控制指令');
    return;
  }

  // 解析指令(新手可扩展更多设备)
  let targetDevice = '';
  let targetAction = '';
  let deviceName = '';

  if (voiceText.includes('客厅灯')) {
    targetDevice = 'livingRoomLight';
    deviceName = '客厅灯';
    targetAction = voiceText.includes('打开') || voiceText.includes('开') ? 'on' : 'off';
  } else if (voiceText.includes('卧室空调')) {
    targetDevice = 'bedroomAir';
    deviceName = '卧室空调';
    targetAction = voiceText.includes('打开') || voiceText.includes('开') ? 'on' : 'off';
  } else {
    this.showResultToast('无法识别指令,请说“打开客厅灯”或“关闭卧室空调”');
    return;
  }

  // 检查设备是否在线
  if (!deviceList[targetDevice].status) {
    this.showResultToast(`${deviceName}已离线,无法控制`);
    return;
  }

  // 更新设备状态
  const newDeviceList = JSON.parse(JSON.stringify(deviceList));
  newDeviceList[targetDevice].switch = targetAction === 'on';
  this.setData({ deviceList: newDeviceList });
  this.showResultToast(`${deviceName}已${targetAction === 'on' ? '打开' : '关闭'}`);
},

// 手动切换设备开关
toggleDeviceSwitch: function(e) {
  const deviceKey = e.currentTarget.dataset.device;
  const { deviceList } = this.data;
  const deviceName = deviceKey === 'livingRoomLight' ? '客厅灯' : '卧室空调';

  if (!deviceList[deviceKey].status) {
    this.showResultToast(`${deviceName}已离线,无法操作`);
    return;
  }

  const newDeviceList = JSON.parse(JSON.stringify(deviceList));
  newDeviceList[deviceKey].switch = !newDeviceList[deviceKey].switch;
  this.setData({ deviceList: newDeviceList });
  this.showResultToast(`${deviceName}已${newDeviceList[deviceKey].switch ? '打开' : '关闭'}`);
}
});

2.4 全局配置(app.json)

简单配置页面和导航栏,新手直接复制:

{
  "pages": ["pages/index/index"],
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#1677ff",
    "navigationBarTitleText": "智能开关语音控制",
    "navigationBarTextStyle": "white"
  },
  "sitemapLocation": "sitemap.json",
  "lazyCodeLoading": "requiredComponents"
}

三、新手踩坑排错全流程(递进式,按报错顺序)

作为新手,开发中遇到的每一个报错都让人头大,以下是我遇到的所有问题+排查思路+解决方案,新手可对照自查:

坑1:param rate invalid(音频参数不匹配)

  • 报错现象:百度API返回“param rate invalid”,语音识别失败;
  • 原因分析:录音参数(格式/采样率/码率)和百度API要求不匹配,比如用了mp3格式、采样率8000、码率超出范围;
  • 解决方案:
    1. 录音格式改为wav(百度推荐);
    2. 采样率固定为16000(百度强制);
    3. 声道数改为1(单声道,百度要求)。

坑2:encodeBitRate超出范围

  • 报错现象:微信控制台提示“encodeBitRate 256000 不在允许的范围内(24000-96000)”;
  • 原因分析:一开始把码率设为256000,超出微信录音API的限制;
  • 解决方案:将encodeBitRate改为64000(既符合微信要求,也兼容百度API)。

坑3:invalid_client(Token获取失败)

  • 报错现象:获取Token时返回“invalid_client”,提示“unknown client id”或“Client authentication failed”;
  • 原因分析:
    1. API Key/Secret Key复制错误(多空格、少字符、大小写错);
    2. Token请求方式不对(用了GET/URL拼接参数,而非官方要求的POST表单);
  • 解决方案:
    1. 重新登录百度智能云,复制正确的API Key/Secret Key;
    2. 按官方要求用POST方式,参数放在data里(而非URL拼接)。

坑4:json read error(3300)(音频上传方式不规范)

  • 报错现象:百度API返回“json read error(错误码:3300)”;
  • 原因分析:一开始用wx.uploadFile(form-data方式)上传音频,不符合百度API的JSON/RAW上传规范;
  • 解决方案:放弃wx.uploadFile,改用wx.request按官方JSON方式上传(音频转base64,构造JSON请求体)。

坑5:json speech not found(speech/len参数异常)

  • 报错现象:百度API返回“json speech not found”(err_no=3300),控制台显示“音频原始字节长度:undefined”;
  • 原因分析:
    1. len参数为undefined(小程序readFile在encoding: 'base64'时无length字段);
    2. speech字段在请求序列化时丢失;
  • 解决方案:
    1. 先以binary编码读取文件,手动计算原始字节长度;
    2. 手动序列化JSON请求体(JSON.stringify),确保speech字段不丢失;
    3. 兜底cuid参数为非空值,避免参数为空导致解析异常。

通用排错技巧(新手必学)

  1. 看控制台日志:开发者工具→调试器→控制台,打印关键参数(如Token、音频长度、请求体),定位哪一步出错;
  2. 真机调试:模拟器不支持录音/文件读取,所有测试必须用真机;
  3. 核对官方文档:百度语音识别API的参数、请求方式一定要对照官方文档,新手别凭“感觉”写;
  4. 简化测试:先手动传固定的base64音频测试API是否正常,再联调录音功能。

四、最终效果与总结

4.1 实现效果

  1. 点击“🎤 点击说话控制设备”,授权麦克风后开始录音;
  2. 说“打开客厅灯”,录音停止后自动调用百度API识别文字;
  3. 识别成功后,客厅灯状态变为“开”,并弹出提示;
  4. 也可手动输入指令,点击“执行指令”控制设备;
  5. 设备离线时,操作会提示“离线无法控制”。

4.2 新手学习总结

作为编程新手,这次开发让我收获很多:

  1. API调用要严格按官方规范:尤其是第三方API(如百度语音),参数、请求方式、格式错一个就会报错;
  2. 排错要“递进式”:先定位报错环节(Token→音频读取→API请求),再查参数/格式,别盲目改代码;
  3. 小程序权限/域名配置别漏:新手容易忽略域名白名单、录音权限,这些是基础;
  4. 日志打印是神器:新手要学会用console.log打印关键参数,快速定位问题。

五、完整代码获取

本文所有代码已整理成可直接运行的项目,新手只需替换百度API密钥,按步骤配置即可运行。核心注意点:

https://gitee.com/JavaBigDataStudy/smart-device-control-center.git

  • 替换index.js中的apiKey和secretKey;
  • 配置微信小程序域名白名单;
  • 用真机调试(模拟器不支持录音)。

希望这篇新手向的踩坑总结能帮到大家,也欢迎各位小伙伴交流补充~

基于STM32、HAL库的SC16IS752IPW总线转UART驱动程序设计 / FIFO空间不足。// 设置LCR寄存器的DLAB位为1以访问DLL/DLH。// 设置LCR寄存器,先访问DLL/DLH。// 设置LCR寄存器(不包含DLAB位) 阅读详情

相关推荐

Qt 6.5实战:用QMediaPlayer搞定RTSP监控流播放(附LAV Filters解码器避坑指南)

本文详细介绍了如何在Qt 6.5中使用QMediaPlayer实现低延迟RTSP监控流播放,并提供了LAV Filters解码器的配置避坑指南。通过优化缓冲策略和硬件加速设置,显著提升视频流的播放性能和稳定性,适用于工业视觉检测和安防监控等实时场景。

weixin_33712987的博客 400

微信小程序集成CTC语音唤醒:小云小云智能家居控制方案

本文介绍了如何在星图GPU平台上自动化部署CTC语音唤醒-移动端-单麦-16k-小云小云镜像,实现智能家居语音控制功能。通过该方案,用户只需说出“小云小云”唤醒词,即可语音控制家居设备开关,提升智能家居交互的便捷性和自然性。

weixin_42515340的博客 438

UWB灵犀遥控器方案介绍

UWB灵犀指向遥控器的技术原理和方案介绍

xiongdauwb的博客 3899

【人工智能应用技术】-基础实战-小程序应用(基于springAI+百度语音技术)智能语音控制

摘要: 本文详细介绍了微信小程序与Spring Boot后端交互的实现过程,聚焦智能语音控制场景。从环境配置、核心代码编写到常见问题解决,提供新手友好指南。后端采用Spring Boot构建统一RESTful接口,处理语音指令并返回设备状态;小程序端实现录音、语音识别及指令传输。重点解决跨域、枚举序列化、字段匹配等典型问题,附完整代码与效果图,帮助开发者快速实现端到端联调。

Coder_Boy_的博客 1277

华为无线AP+AC(ensp)

VLAN 100--192.168.100.0/24为AP的管理IP地址VLAN10--192.168.10.0/24为无线用户获取的IP地址在DHCP Server(LSW3)上查看地址分配情况。

abcdlalal的博客 1万+

SIGIR 2026:信息检索前沿技术与投稿指南

信息检索(Information Retrieval, IR)是计算机科学中处理大规模数据检索的核心技术,其基本原理是通过算法模型从海量数据中高效提取相关信息。随着深度学习的发展,神经信息检索(Neural IR)和多模态检索成为研究热点,如稠密检索模型(DPR)和跨模态预训练(CLIP)等技术的应用显著提升了检索精度。这些技术不仅在学术领域具有重要价值,还在电商搜索、医疗检索等实际场景中展现出巨大潜力。SIGIR作为信息检索领域的顶级会议,汇聚了全球顶尖学者和工业界专家,是展示最新研究成果的重要平台。本文

weixin_29189363的博客 287

【人工智能应用技术】-基础实战-小程序应用(基于springAI+百度语音技术)智能语音控制-单片机交互

摘要 企业级物联网开发中,ESP32和STM32是主流单片机选型,分别适用于消费级和工业级场景。Java后端与设备交互应采用"边缘网关+MQTT"分层架构,通过标准化主题和JSON格式实现数据上传与指令下发。关键措施包括设备认证、TLS加密、QoS保障和异常处理。传统C51系列由于性能不足、缺乏通信能力和安全特性,无法满足企业级需求。相比之下,ESP32/STM32在运算性能、联网能力、外设资源和开发支持方面具有显著优势,更适合现代物联网应用开发。

Coder_Boy_的博客 821

Mac上VMware Fusion手动安装VMware Tools实现跨系统复制粘贴

本文详细指导了在Mac的VMware Fusion中手动安装VMware Tools的完整流程,以解决虚拟机与宿主机之间无法复制粘贴的常见问题。通过定位安装镜像、挂载、解压并运行安装脚本,最终实现跨系统无缝数据交换,提升工作效率。

orange的博客 699

【人工智能应用技术】-基础实战-小程序应用(基于springAI+百度语音技术)智能语音控制-Java部分核心逻辑

核心目标:定义与ESP32完全对齐的Java数据模型(DTO),确保JSON序列化/反序列化无偏差,这是双方交互的基础。

Coder_Boy_的博客 920

谷歌A2A协议入门指南:附简易Python代码示例

继"关税"之后,当下最热门的词汇当属AI智能体——这种基于人工智能的软件能够执行复杂任务、实现工作流自动化并提升生产效率。但迄今为止,大多数智能体都处于各自为政的状态,难以顺畅协作。就像团队执行重大项目时,成员之间却无法交流!对于技术人员而言,一个可能遇到的典型场景是:假设你需要协调四个不同的AI服务——处理用户查询的Gemini智能体、在向量数据库进行搜索的AI应用、基于Claude的摘要生成器,以及运行专业领域逻辑的Python智能体。

独立开发,substack顶级编辑 799

llama-factory微调qwen2.5-vl

使用llama-factory完成qwen2.5-vl微调

qq_44908396的博客 2933

【人工智能应用技术】-基础实战-小程序应用(基于springAI+百度语音技术)智能语音控制-单片机交互代码

ESP32单片机与Java评估业务平台的交互逻辑,核心是通过“MQTT协议为基础、安全认证为保障、标准化数据为载体”,实现“平台决策-设备执行-数据反馈-评估优化”的业务闭环。本文梳理的交互架构、核心流程与代码实现,不仅适用于ESP32与Java平台的交互场景,也为其他物联网设备与后端评估平台的标准化交互提供了可复用的实践方案。后续可进一步优化方向:引入边缘计算(ESP32端预处理数据)降低平台压力,采用MQTT over TLS协议提升传输安全性。

Coder_Boy_的博客 739

YOLO系列算法改进 | C3k2改进篇 | 融合DFRL双融合注意力接收层 | 轻量化与全局感受野双突破,适应高分辨率航拍与密集小目标检测场景 | CVPR 2026

YOLO系列算法改进 | C3k2改进篇 | 融合DFRL双融合注意力接收层 | 轻量化与全局感受野双突破,适应高分辨率航拍与密集小目标检测场景 | CVPR 2026 (以YOLO26最新目标检测模型为基础,利用C3k2_DFRL创新模块进行改进)

2502_91881744的博客 233

【人工智能应用技术】-基础实战-小程序应用(基于springAI+百度语音技术)智能语音控制-单片机环境搭建

本文专为ESP32新手设计,核心目标是让你快速搞定开发环境搭建,并写出第一个极简的Hello World程序(串口打印)。全程避开复杂术语,步骤清晰可复制,为后续开发ESP32与Java平台交互程序打下基础。

Coder_Boy_的博客 878

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SpringAI 详解:模型支持与核心功能全览

SpringAI是Spring生态下的人工智能集成框架,为Java开发者提供了便捷统一的AI能力接入方案。它支持多种主流AI模型,包括OpenAI、百度文心等语言大模型,DALL·E、Stable Diffusion等图像生成模型,以及语音识别、翻译等功能。通过统一API抽象,SpringAI简化了文本生成、多轮对话、文生图、RAG等核心功能的实现,适用于智能客服、内容创作等场景。其开箱即用、高度可扩展的特性,以及与Spring生态的无缝集成,降低了企业应用AI的门槛,助力智能化升级。

weixin_51786043的博客 1562

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring AI:Java开发者的AI开发新利器

在人工智能浪潮席卷全球的当下,Java开发者也渴望高效地将AI能力融入应用。Spring AI应运而生,为Java生态带来全新变革。它凭借独特设计理念与强大功能,简化AI开发流程,让Java开发者轻松拥抱AI时代。接下来,让我们深入了解这个Java开发者的AI开发新利器。

gadiaola的博客 5404

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 225

6 款电商 AI 图片生成软件实测|国内 + 跨境卖家工具清单

电商 AI 作图工具已经从 "能不能用" 进入了 "好不好用" 的阶段。对于绝大多数卖家而言,现在的 AI 工具已经可以覆盖 60%-80% 的基础商品图需求,显著降低拍摄和设计成本。选择工具的核心逻辑不是 "哪款最强",而是 "哪款最适配你的品类、平台规模和团队能力"。垂直电商工具胜在工作流效率,通用生图工具强在创意上限,模板类工具赢在上手速度。建议根据自身业务阶段,搭配 1-2 款主力工具 + 1 款辅助工具,形成适合自己的视觉生产流程。

Mardi_Ladin的博客 398

我用 GPUWorks 在 M1 Pro 上搭了个发票识别原型

公司里经常要看电子发票。我想先做个小原型:把 PDF 发给一个自己部署的图文模型,让它提取发票类型、日期、交易双方和金额,再把结果交给同事核对。这个原型不用先接财务系统,先看看从部署到调用要走多少步,模型返回的内容能不能帮上忙。

鸽芷咕的博客 2万+

您您这可以把问小白的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭

第三层是格式编译层。这个决策背后的判断很清晰:一个批量导出工具的价值,不在于“试三次”,而在于你真正用它处理了几十份技术文档、访谈记录或课程讲义之后,它是否值得留在你的工作流里。问小白的会话列表通过分页接口加载,AI导出鸭 在页面运行时建立旁路监听,捕获每一次分页请求返回的完整对话清单,包括会话 ID、标题、时间戳和隐藏的元数据字段。让AI导出回归优雅——这句话说的是:导出不该是体力活,而应该是一次完整的、可预期的文件交付。注意:这里的“批量”指的是左侧列表里的多个独立会话,不是一条会话内的多轮对话。

laoyunsi的博客 246

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 501

河道漂浮物目标检测数据集

目标检测,yolo,河道漂浮物目标检测数据集

DL_data_set的博客 201

AI Agent之核心框架

A: 显式 Thought 有三类价值:可解释性(便于人类审计)、可调试性(定位哪一步选错工具)、学习信号(可做监督微调或评估中间步骤质量)。ReAct 把推理与 可执行行动 绑定,每一步行动后都有 真实 Observation 反馈,从而用工具结果约束生成,降低闭卷幻觉。做完不等于结束——还要 评估做得好不好,把 教训 记下来,下次 带着教训重试,反思作为 记忆,影响后续尝试的策略。工作流程:Action → Evaluation → Reflection → Retry。A: 普通 CoT 只在。

剑雨巍巍的博客 199

AI 应用开发工程师技术实践:大模型接入、通用组件封装与性能优化

本文提出AI应用从PoC到生产的核心挑战:模型调用的持续可用、可控与可优化。通过构建统一LLM网关实现多供应商路由与故障转移,封装对话、工具调用与RAG组件以解耦业务逻辑,结合前缀缓存、批处理与流式背压治理等性能优化手段,形成“接通→接稳→接快”的工程路径,最终以工程化能力决定AI应用的生产可用性。

2301_79189962的博客 558

AI前沿日报 · 2026-11-04 | 祛魅时刻:Astra“纯读权重“神话的崩塌

①Astra"裸权重通吃"被spaCy创始人Honnibal精准祛魅——仅1/3实验真裸读,数学能力提升依赖Python+50次迭代;②Simon Willison用Qwen 3.8-27B端侧复现权重空间编程;③Nvidia开源Auto-Ontology自动知识图谱;④$800开源全域抓取机器人Stringman;⑤OpenAI悄然重开Codex训练开关引信任危机;⑥DeepMind发布Gemini 4 Argon机器人基础模型;⑦美国科技巨头隐性AI债务达3.2万亿美元,6个月增90%。

johnsong2009的博客 574

大模型 Embedding 与向量相似度详解

Embedding 解决的问题:计算机不懂文字,但懂数字│▼文本 → 向量(1024维浮点数数组)│▼相似度解决的问题:怎么判断两个向量(文本)有多接近│▼余弦相似度:看向量方向的夹角,越接近0°越相似│▼最终效果:语义搜索——理解意思,而非字面匹配一句话总结:Embedding 把文字变成数字,余弦相似度比较数字的方向,两者结合实现了"理解语义"的搜索。

T3165919332的博客 90
上一篇: 业务导向型技术日志记录(2)
下一篇: 【人工智能应用技术】-基础实战-小程序应用(基于springAI+百度语音技术)智能语音控制
Coder_Boy_
博客等级 码龄10年 2804粉丝 819原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值