基于OpenAI API构建AI语音助手原型:从大模型到智能硬件实践
最近在AI硬件圈子里OpenAI即将推出一款AI智能音箱的消息不胫而走据传其定价在300-400美元区间。这不仅仅是又一个智能音箱它很可能标志着AI大模型从云端“下凡”以更自然、更贴身的方式融入我们的日常生活。对于开发者而言这背后潜藏着巨大的机遇如何利用这类新型AI硬件的能力构建下一代交互应用本文将深入探讨这一潜在产品的技术内涵并手把手教你如何基于现有的AI能力模拟和构建一个具备类似功能的智能语音助手原型。无论你是对AI应用开发感兴趣的初学者还是希望探索硬件结合可能性的资深开发者都能从本文中获得从概念到代码的完整实践路径。1. 背景与核心概念AI智能音箱的演进与OpenAI的入局1.1 智能音箱的发展简史智能音箱并非新鲜事物。从早期的Amazon Echo搭载Alexa到Google Home集成Google Assistant再到国内小爱同学、天猫精灵的普及其核心逻辑一直未变通过语音唤醒词激活将用户的语音指令上传至云端进行识别和语义理解再将处理结果如播放音乐、查询天气、控制家居返回并播报。然而传统的智能助手在处理复杂、多轮、需要上下文理解的对话时常常显得力不从心回答生硬且缺乏真正的“智能”。1.2 大模型带来的范式变革以OpenAI的GPT系列、Google的Gemini等为代表的大语言模型LLM的出现彻底改变了人机对话的体验。它们拥有强大的自然语言理解、生成和推理能力能够进行更开放、更连贯、更富有创造性的对话。将这种级别的AI能力注入到一个常驻家中的硬件设备中正是下一代智能音箱的进化方向。传闻中的OpenAI音箱其核心卖点很可能就是内置或深度集成了类似GPT-4o级别的模型提供远超传统助手的对话体验。1.3 OpenAI智能音箱的潜在技术栈虽然产品细节未公布但我们可以基于OpenAI现有的技术生态进行合理推测核心模型极有可能采用优化后的GPT-4o或更轻量、低延迟的专用模型在保证响应速度的同时提供强大的多模态语音、文本、视觉理解能力。语音技术包含高精度的语音识别ASR将语音转为文本由大模型处理再通过文本转语音TTS生成自然、富有情感的人声回复。OpenAI的WhisperASR和TTS API已为此打下基础。硬件集成除了麦克风阵列和扬声器可能还会集成摄像头用于视觉识别、传感器等实现更丰富的环境感知。交互模式可能支持“持续聆听与上下文记忆”让对话更自然无需每次都说唤醒词。对于开发者来说理解这个技术栈至关重要。即使没有实体硬件我们也可以利用OpenAI开放的API模拟构建一个具备其核心对话能力的软件原型。2. 环境准备与项目说明在开始构建我们的软件原型之前需要准备好开发环境。本项目将使用Python作为主要语言因为它拥有丰富的AI和音频处理库。2.1 基础环境要求操作系统Windows 10/11, macOS, 或 Linux (如Ubuntu 20.04)。Python版本建议使用 Python 3.8 - 3.11。版本过高或过低可能导致某些库依赖冲突。包管理工具使用pip进行Python包管理。2.2 核心依赖库我们将创建一个虚拟环境来管理依赖。首先在项目目录下创建并激活虚拟环境# 创建虚拟环境 python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate激活后命令行提示符前会出现(venv)标识。接下来安装核心库pip install openai pip install sounddevice pip install soundfile pip install numpy pip install pydub pip install python-dotenvopenai: OpenAI官方库用于调用GPT和Whisper API。sounddevicesoundfile: 用于录制音频和播放音频。numpy: 音频数据处理的基础库。pydub: 简化音频文件格式处理。python-dotenv: 管理环境变量安全存储API密钥。2.3 获取OpenAI API密钥本项目需要OpenAI API的调用权限。访问 OpenAI平台 并登录。点击右上角个人头像选择 “View API keys”。点击 “Create new secret key”为项目创建一个新的密钥并妥善保存。重要安全提示API密钥是访问你账户的凭证务必像保护密码一样保护它。切勿将其直接硬编码在代码中或上传到GitHub等公开仓库。2.4 项目结构初始化创建一个清晰的项目文件夹结构有助于代码管理openai_speaker_demo/ ├── .env # 存储环境变量API密钥 ├── .gitignore # Git忽略文件 ├── requirements.txt # 项目依赖列表 ├── src/ │ ├── __init__.py │ ├── audio_handler.py # 音频录制与播放模块 │ ├── openai_client.py # OpenAI API交互模块 │ └── main.py # 主程序入口 └── temp_audio/ # 临时存放录音文件创建requirements.txt文件方便他人复现环境openai1.0.0 sounddevice0.4.6 soundfile0.12.1 numpy1.24.0 pydub0.25.1 python-dotenv1.0.03. 核心模块拆解与实现我们将系统拆分为三个核心模块音频处理、AI对话逻辑和主控流程。3.1 音频处理模块 (audio_handler.py)这个模块负责“听”和“说”即录制用户的语音和播放AI的回复。# src/audio_handler.py import sounddevice as sd import soundfile as sf import numpy as np from pydub import AudioSegment from pydub.playback import play import tempfile import os class AudioHandler: def __init__(self, samplerate16000, channels1): 初始化音频处理器。 :param samplerate: 采样率Whisper推荐16000或更高 :param channels: 声道数1为单声道 self.samplerate samplerate self.channels channels self.is_recording False self.frames [] def record_audio(self, duration5): 录制指定时长的音频。 :param duration: 录制时长秒 :return: 保存的临时音频文件路径 print(f开始录音请说话...最长{duration}秒) self.frames [] self.is_recording True # 使用回调函数进行流式录制更灵活可后期改为按键控制 def callback(indata, frames, time, status): if status: print(f录音错误: {status}) if self.is_recording: self.frames.append(indata.copy()) # 创建输入流 with sd.InputStream(samplerateself.samplerate, channelsself.channels, callbackcallback): sd.sleep(duration * 1000) # 录制指定毫秒数 self.is_recording False print(录音结束。) if not self.frames: return None # 将录制的数据拼接并保存为临时文件 audio_data np.concatenate(self.frames, axis0) temp_file tempfile.NamedTemporaryFile(deleteFalse, suffix.wav) temp_file.close() sf.write(temp_file.name, audio_data, self.samplerate) return temp_file.name def play_audio_from_text(self, text, voice_modelalloy): 调用OpenAI TTS API将文本转为语音并播放。 注意此功能需要消耗OpenAI API额度。 :param text: 要转换为语音的文本 :param voice_model: 语音模型可选 alloy, echo, fable, onyx, nova, shimmer # 此函数需要在openai_client.py中实现这里先留空后续整合 pass def play_audio_file(self, file_path): 播放指定的音频文件。 :param file_path: 音频文件路径 try: audio AudioSegment.from_file(file_path) play(audio) except Exception as e: print(f播放音频失败: {e}) if __name__ __main__: # 简单测试录音功能 handler AudioHandler() audio_file handler.record_audio(duration3) if audio_file: print(f音频已保存至: {audio_file}) # 可以取消注释以下行来回放测试 # handler.play_audio_file(audio_file) os.unlink(audio_file) # 删除临时文件3.2 OpenAI客户端模块 (openai_client.py)这个模块是智能的“大脑”负责与OpenAI的各类API交互。# src/openai_client.py import os from openai import OpenAI from dotenv import load_dotenv import base64 # 加载.env文件中的环境变量 load_dotenv() class OpenAIClient: def __init__(self): api_key os.getenv(OPENAI_API_KEY) if not api_key: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY 环境变量) self.client OpenAI(api_keyapi_key) # 简单的对话历史记录用于实现多轮对话上下文 self.conversation_history [ {role: system, content: 你是一个 helpful assistant.} ] def transcribe_audio(self, audio_file_path): 使用Whisper模型将音频文件转录为文本。 :param audio_file_path: 音频文件路径 :return: 识别出的文本 try: with open(audio_file_path, rb) as audio_file: transcript self.client.audio.transcriptions.create( modelwhisper-1, fileaudio_file, response_formattext ) return transcript except Exception as e: print(f语音识别失败: {e}) return None def chat_completion(self, user_input): 使用Chat Completions API进行对话。 :param user_input: 用户输入的文本 :return: AI回复的文本 # 将用户输入加入历史 self.conversation_history.append({role: user, content: user_input}) try: response self.client.chat.completions.create( modelgpt-3.5-turbo, # 可根据需要改为 gpt-4, gpt-4o 等 messagesself.conversation_history, max_tokens500, temperature0.7, ) ai_reply response.choices[0].message.content # 将AI回复加入历史 self.conversation_history.append({role: assistant, content: ai_reply}) # 可选限制历史记录长度防止token数超限 if len(self.conversation_history) 10: self.conversation_history [self.conversation_history[0]] self.conversation_history[-8:] return ai_reply except Exception as e: print(f对话生成失败: {e}) return 抱歉我暂时无法处理您的请求。 def text_to_speech(self, text, voicealloy, output_pathoutput.mp3): 使用TTS API将文本转换为语音并保存为文件。 :param text: 要转换的文本 :param voice: 语音类型 :param output_path: 输出音频文件路径 :return: 音频文件路径 try: response self.client.audio.speech.create( modeltts-1, voicevoice, inputtext ) response.stream_to_file(output_path) return output_path except Exception as e: print(f语音合成失败: {e}) return None if __name__ __main__: # 测试模块功能 client OpenAIClient() # 假设有一个测试音频文件 test_audio.wav # text client.transcribe_audio(test_audio.wav) # if text: # print(f识别结果: {text}) # reply client.chat_completion(text) # print(fAI回复: {reply}) # client.text_to_speech(reply, output_pathtest_reply.mp3)3.3 主程序模块 (main.py)这是整个应用的“总指挥”负责串联所有流程。# src/main.py import os import time from audio_handler import AudioHandler from openai_client import OpenAIClient def main(): print( OpenAI 智能音箱软件原型 Demo ) print(初始化组件...) # 初始化音频处理器和OpenAI客户端 audio AudioHandler(samplerate16000) ai_client OpenAIClient() print(初始化完成。) print(提示本Demo为模拟交互请按提示操作。) print(- * 40) try: while True: input(按 Enter 键开始录音或输入 quit 退出...) command input().strip().lower() if command quit: print(再见) break # 步骤1录音 print(正在录音5秒...) audio_file_path audio.record_audio(duration5) if not audio_file_path: print(未检测到有效录音请重试。) continue # 步骤2语音识别 (STT) print(正在识别语音...) user_text ai_client.transcribe_audio(audio_file_path) os.unlink(audio_file_path) # 删除临时录音文件 if not user_text: print(语音识别失败请重试。) continue print(f你说: {user_text}) # 步骤3AI对话处理 print(AI思考中...) ai_text_reply ai_client.chat_completion(user_text) print(fAI回复: {ai_text_reply}) # 步骤4语音合成与播放 (TTS) print(正在生成语音...) tts_output_path temp_reply.mp3 success_path ai_client.text_to_speech(ai_text_reply, voicenova, output_pathtts_output_path) if success_path: print(播放回复...) audio.play_audio_file(success_path) os.unlink(success_path) # 删除临时语音文件 else: print(语音合成失败请查看文字回复。) print(- * 40) time.sleep(0.5) # 短暂间隔 except KeyboardInterrupt: print(\n程序被用户中断。) except Exception as e: print(f程序运行出错: {e}) if __name__ __main__: main()4. 完整实战运行你的第一个AI语音助手现在让我们将以上所有部分组合起来完成一次端到端的运行。4.1 项目配置在项目根目录openai_speaker_demo/下创建.env文件。在.env文件中填入你的OpenAI API密钥OPENAI_API_KEY你的_OpenAI_API_密钥_sk-...切记将.env添加到.gitignore文件中避免密钥泄露。4.2 运行程序在项目根目录下确保虚拟环境已激活然后运行主程序cd openai_speaker_demo python src/main.py4.3 交互演示程序启动后你将看到如下界面 OpenAI 智能音箱软件原型 Demo 初始化组件... 初始化完成。 提示本Demo为模拟交互请按提示操作。 ---------------------------------------- 按 Enter 键开始录音或输入 quit 退出...按下Enter键。程序提示“开始录音请说话...”此时对着麦克风清晰地说一句话例如“今天北京的天气怎么样”等待5秒录音结束程序会自动进行后续流程识别将你的语音转为文字。思考将文字发送给GPT获取回复文本。播报将回复文本转为语音并播放出来。4.4 预期结果与代码逻辑流一次成功的交互其背后的代码执行流如下main.py调用audio.record_audio()生成一个临时WAV文件。将该文件路径传给ai_client.transcribe_audio()调用Whisper API返回识别文本。将识别文本传给ai_client.chat_completion()调用Chat Completions API得到AI回复文本。将AI回复文本传给ai_client.text_to_speech()调用TTS API生成MP3文件。调用audio.play_audio_file()播放该MP3文件。清理过程中产生的临时音频文件。至此你已经成功构建了一个具备“听说想”完整链条的AI语音助手原型其核心逻辑与传闻中的OpenAI智能音箱是相通的。5. 常见问题与排查思路在实际运行中你可能会遇到一些问题。以下是常见问题的排查指南。问题现象可能原因排查与解决思路导入openai库错误1. 未安装openai库。2. 虚拟环境未激活或安装位置不对。1. 运行pip install openai。2. 确认命令行前有(venv)或在PyCharm等IDE中正确配置了Python解释器。ModuleNotFoundError: No module named sounddevicesounddevice库安装失败通常是因为缺少系统级音频驱动。Linux:sudo apt-get install libportaudio2。macOS:brew install portaudio。Windows: 通常通过pip install sounddevice即可若失败可尝试安装 Microsoft C Build Tools 。录音没有声音/录制失败1. 麦克风权限未开启。2. 默认录音设备设置错误。3.sounddevice未找到有效输入设备。1. 检查系统麦克风权限。2. 运行python -m sounddevice查看可用设备并在AudioHandler初始化时通过device参数指定正确的设备索引。播放音频没有声音1. 扬声器未开启或静音。2.pydub播放依赖ffmpeg。1. 检查系统音量。2. 安装ffmpegmacOSbrew install ffmpegLinuxsudo apt install ffmpegWindows从官网下载并添加至系统PATH。OpenAI API调用返回错误 (如认证失败、额度不足)1. API_KEY 未正确设置或失效。2. 账户余额不足或达到速率限制。1. 检查.env文件格式是否正确无空格无引号并重启终端。2. 登录 OpenAI Usage Dashboard 检查额度和用量。语音识别结果完全错误或为空1. 录音质量差环境嘈杂、音量小。2. 采样率不匹配。Whisper对16kHz以上效果更好。3. 音频文件格式问题。1. 确保在安静环境下靠近麦克风清晰发音。2. 确认AudioHandler初始化时的samplerate与录制一致并尝试提高到44100。3. 确保保存的音频格式为WAV等标准格式。程序响应非常慢1. 网络延迟高API调用需访问境外服务器。2. TTS生成音频较耗时。1. 网络问题无法根治可考虑使用代理注意此处仅陈述技术可能性具体网络配置请遵守当地法律法规。2. 对于原型可以暂时注释掉TTS部分先仅输出文字回复以测试其他环节。6. 进阶优化与工程实践建议上面的原型只是一个起点。要将其打磨成一个健壮、可用的应用需要考虑以下方面6.1 性能与用户体验优化流式处理目前的流程是“录完-识别-思考-合成-播放”延迟感明显。真正的智能音箱采用流式技术流式语音识别Streaming ASR边录边识别用户说完立即得到文本。流式文本生成AI边思考边输出可以逐词或逐句返回。流式语音合成文本生成一部分就合成播放一部分。 这需要更复杂的异步编程和WebSocket连接OpenAI的API也提供了相应的流式端点。唤醒词与持续聆听实现像“Hey Siri”一样的本地唤醒词检测可用Porcupine、Snowboy等开源库并在唤醒后进入持续聆听模式直到用户主动结束。回声消除与降噪在播放AI语音时需要抑制麦克风拾取到的自身扬声器声音防止误触发。这涉及数字信号处理算法。6.2 代码结构与可维护性配置化管理将采样率、录音时长、AI模型类型、语音角色等参数抽取到配置文件如config.yaml中便于调整。日志记录使用logging模块替代print记录程序运行状态、错误信息和API调用详情便于调试和监控。异常处理增强对网络超时、API限额、音频设备异常等情况进行更细致的捕获和恢复提供友好的用户提示而不是直接崩溃。状态管理引入明确的状态机如IDLE,LISTENING,PROCESSING,SPEAKING使程序逻辑更清晰。6.3 成本控制与安全API成本Whisper、GPT、TTS API都是按使用量计费。在开发阶段设置使用上限Budget。对于非必要测试可以缓存结果或使用模拟数据。考虑在原型验证后针对特定场景微调更小、更便宜的模型。隐私与安全音频数据录音文件应在处理后立即删除我们的代码已做。如果涉及上传需明确告知用户并获得同意。对话历史conversation_history包含了所有对话。在生产环境中需考虑数据加密存储、定期清理并遵守相关数据保护法规。API密钥绝对不要在前端代码或客户端中硬编码API密钥。当前原型在本地运行尚可若部署为Web服务密钥应存储在服务器端环境变量或安全的密钥管理服务中。6.4 扩展功能设想多模态交互如果未来的硬件配备摄像头可以集成OpenAI的GPT-4V等视觉模型实现“看图说话”功能例如识别物体、描述场景。智能家居控制集成Home Assistant、米家等平台的API将AI的指令解析为具体的设备控制命令如“打开客厅的灯”。个性化与记忆为不同用户创建简档记忆用户的偏好如喜欢的音乐类型、常查询的信息提供个性化服务。离线功能探索在设备端部署小型开源模型如Whisper.cpp、Llama.cpp在无网络或处理简单任务时使用以降低延迟和成本。7. 总结通过本文我们从一则关于OpenAI智能音箱的传闻出发深入剖析了其背后的技术逻辑并完成了一个从零搭建的、功能完整的AI语音助手软件原型。我们不仅实现了录音、语音识别、智能对话和语音合成的核心链路还探讨了在实际工程化过程中可能遇到的性能、成本、安全等问题及其优化方向。这个原型的价值在于它清晰地展示了如何将强大的云端AI能力OpenAI API与本地硬件交互麦克风、扬声器相结合这正是未来AI硬件产品的核心架构。无论OpenAI最终发布的硬件产品形态如何其软件层面的核心思想——以自然语言为交互界面以大型模型为智能中枢——已经非常明确。对于开发者来说现在正是探索和实践的好时机。你可以基于这个原型深化学习研究流式处理、唤醒词、本地模型部署等进阶话题。结合硬件尝试用树莓派等开发板将其实体化打造属于自己的“智能音箱”。探索场景将其定制化为学习助手、会议记录员、智能客服原型等。技术的最终目的是服务人与生活。通过动手实践我们不仅能紧跟技术潮流更能亲手塑造未来的交互方式。希望本文能成为你探索AI应用开发的一块坚实跳板。如果在实践过程中遇到任何问题欢迎在评论区交流探讨。

相关新闻

历年会议文件散落各处,应用商店会议记录归档软件推荐

历年会议文件散落各处,应用商店会议记录归档软件推荐

上周翻一份半年前的项目复盘资料,打开电脑里的"会议纪要"文件夹,里面按日期建了二十多个子目录,有的存的是 Word,有的是 PDF,还有几个干脆是录音文件——当时开完会随手一扔,现在想找某次需求评审…

2026/10/28 7:55:47 阅读更多 →
无损剪辑终极指南:如何用LosslessCut实现秒级视频处理

无损剪辑终极指南:如何用LosslessCut实现秒级视频处理

无损剪辑终极指南:如何用LosslessCut实现秒级视频处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在视频处理领域,时间就是金钱&#xff0…

2026/10/24 15:58:19 阅读更多 →
深度排查:ComfyUI-Easy-Use项目中IPAdapter参数错误问题解析与版本兼容性优化

深度排查:ComfyUI-Easy-Use项目中IPAdapter参数错误问题解析与版本兼容性优化

深度排查:ComfyUI-Easy-Use项目中IPAdapter参数错误问题解析与版本兼容性优化 【免费下载链接】ComfyUI-Easy-Use In order to make it easier to use the ComfyUI, I have made some optimizations and integrations to some commonly used nodes. 项目地址: htt…

2026/10/25 13:25:02 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/28 7:28:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/28 7:29:02 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →