详说Azure的服务运行时API

本文深入探讨了微软WindowsAzure服务总线提供的REST风格API,特别是服务运行时API和服务管理API的区别与作用。重点阐述了服务运行时API如何用于动态查询服务信息、读取配置文件的最新设置以及在配置文件更新后的通知机制。同时介绍了两种访问服务运行时API的方式:托管代码和本地代码,并详细解释了Microsoft.WindowsAzure.ServiceRuntime命名空间内各个类的功能。

详说Azure的服务运行时API

【版权声明】原创,作者为chszs,转载需注明。

一、服务运行时API简介

微软的Windows Azure服务总线提供了一整套REST风格的API,其中包括服务运行时API(Service Runtime API)和服务管理API(Service Management API),分别用于运行时操作和管理操作。

那么,什么是REST呢?REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,它可以降低开发的复杂性,提高系统的可伸缩性。使用REST API,意味着我们可以使用任意的编程语言来开发应用程序,它只有一个前提,我们使用的编程语言必须要能够支持HTTP协议。使用REST API,我们就不再需要客户端的SDK。

二、服务运行时API和服务管理API的区别

服务运行时API和服务管理API有什么区别呢?

首先,要从两者运行的“位置”进行比较。服务运行时API运行于Windows Azure云的内部,API代码与云交互环境相勾连;而服务管理API运行于Windows Azure云的外部,可以通过调用服务管理API来操纵正在运行的服务。

其次,两者的功能也大不相同。服务运行时API主要用于动态查看服务信息;而服务管理API则用于Azure授权用户能够以编程的方式管理其部署、托管的服务以及存储账户。授权用户可以管理存储服务的生命周期,包括新建存储服务、更新存储服务、删除存储服务等。

服务运行时API有时也被认为是服务托管API。

三、服务运行时API的作用

服务运行时API有哪些作用呢?

1、WindowsAzure云上的Adapter服务可以通过调用服务运行时API来动态查询服务信息。比如可以访问应用的服务信息和用户的角色信息。还可以用于访问服务的拓扑信息,比如正在运行哪些角色、每个角色包含了多少个实例等等。

2、可以从配置文件中读取最新的设置。比如访问服务定义和服务配置文件中各项设置的最新的值,即使是服务配置正在更新,服务运行时API也能确保取得的值为最新状态。要注意,对于工作者角色,它与角色的生命周期是紧密绑定在一起的。

3、可以在配置文件更新后获取通知。

四、服务运行时API的访问方式

服务运行时API有两种访问方式:

1、对于托管代码,SDK封装了整个Microsoft.WindowsAzure.ServiceRuntime.dll库。只要用Visual Studio创建了一个新的云服务项目后,服务运行时API就可以自动引用。

2、对于本地代码,头文件和库文件都被封装在SDK中,可以使用C语言调用服务运行时API。

要说明一点,本地库和托管库两者的功能是完全相同的,你可以选择任意一种访问方式,而且两者间的代码转换也是很容易的。

五、服务运行时API的命名空间

Microsoft.WindowsAzure.ServiceRuntime的命名空间详见下表所述。

描述

LocalResource

表示本地存储资源,托管服务所保留。

Role

表示定义的角色,作为托管服务的一部分。

RoleEntryPoint

在角色实例进行初始化、运行、停止时,提供运行代码的方法。

RoleEnvironment

提供运行角色实例的配置、端点和状态的信息。

RoleEnvironmentCharge

表示托管服务的配置发生了变化。

RoleEnvironmentChangedEventArgs

表示已更改事件的参数,当配置修改被应用到角色实例后使用。

RoleEnvironmentChangingEventArgs

表示待更改事件的参数,当配置修改被应用到角色实例前使用。

RoleEnvironmentConfigurationSettingChange

表示一个角色配置的修改。

RoleEnvironmentException

在访问RoleEnvironment类的属性和方法发生错误时所抛出的异常。

RoleEnvironmentStoppingEventArgs

表示停止事件的参数,当一个角色实例被停止时使用。

RoleEnvironmentTopologyChange

表示某个角色的拓扑结构发生变化。

RoleInstance

表示一个角色实例。

RoleInstanceEndpoint

表示一个角色实例相关联的端点。

RoleInstanceStatusCheckEventArgs

表示StatusCheck事件的参数,用于在内部定期时间间隔来指示一个角色实例的状态。

当然可以!我们来**尽地展开“备选方案”:使用 HTTP 请求 + Python Flask 实现 VSCode 代码与 UE5 的结合**,用于驱动“陪伴数字人”的表情、动作和语音。 这个方案的优势在于: - ✅ **无需安装任何插件** - ✅ **完全支持蓝图开发(零 C++ 编程)** - ✅ **适用于所有 UE5 版本(包括 Epic Launcher 安装的二进制版)** - ✅ **可打包发布到 Windows / Android** - ✅ **调试简单,适合初学者或毕业设计项目** --- ## 🎯 目标功能 我们要实现一个完整的交互流程: ``` 用户话 → UE5 捕获文本(模拟/手动输入)→ 发送至 Python AI → AI 分析情绪并生成回复 → UE5 接收 JSON → 控制数字人表情 + 播放语音 ``` 最终效果: - 数字人脸上的表情随对话变化(开心、难过、惊讶等) - 自动播放 AI 生成的语音 - 全程通过 HTTP 通信完成 --- ## ✅ 第一步:搭建 Python 后端 AI 引擎(运行在 VSCode 中) 我们将用 `Flask` 构建一个轻量级 Web API,接收 UE5 发来的用户消息,并返回 AI 决策结果。 ### 1. 创建项目结构 ```bash your_project/ ├── ai_engine.py # 主 AI 逻辑 ├── requirements.txt # 依赖包 ``` --- ### 2. 安装依赖 ```bash pip install flask flask-cors ``` > `requirements.txt` 内容: ```txt flask==2.3.3 flask-cors==4.0.0 ``` --- ### 3. 编写 `ai_engine.py` ```python from flask import Flask, jsonify, request from flask_cors import CORS # 允许跨域请求(重要!UE5 可能被视为不同源) import random import json app = Flask(__name__) CORS(app) # 启用跨域支持,否则 UE5 可能无法访问 # 示例:AI 根据输入决定情绪和回复 def decide_emotion_and_reply(user_input): user_input = user_input.lower().strip() if any(word in user_input for word in ["sad", "bad", "depressed", "alone"]): emotion = "sad" reply = "I'm really sorry you're feeling this way... I'm here for you." elif any(word in user_input for word in ["happy", "great", "awesome", "good"]): emotion = "happy" reply = "That's wonderful to hear! 😊 Tell me more!" elif any(word in user_input for word in ["angry", "hate", "mad", "upset"]): emotion = "angry" reply = "Whoa, calm down… I understand you're frustrated." elif any(word in user_input for word in ["surprise", "wow", "amazing"]): emotion = "surprised" reply = "No way! That sounds incredible!" else: emotion = random.choice(["neutral", "curious", "thinking"]) reply = "Interesting... can you tell me more about that?" return { "emotion": emotion, "speech_text": reply, "duration": len(reply) / 5.0 # 粗略估算语音长(秒),用于同步动画 } # ✅ REST API 路由 @app.route('/get_ai_response', methods=['POST']) def get_ai_response(): try: data = request.get_json() user_text = data.get('text', '') if not user_text: return jsonify({"error": "No text provided"}), 400 response = decide_emotion_and_reply(user_text) print(f"💬 AI Response: {response}") return jsonify(response) except Exception as e: return jsonify({"error": str(e)}), 500 # 可选:健康检查接口 @app.route('/health', methods=['GET']) def health(): return jsonify({"status": "running", "message": "AI server is live!"}) # 启动服务 if __name__ == '__main__': print("🚀 Starting AI Companion Server at http://localhost:5000") print("💡 Test with: curl -X POST http://localhost:5000/get_ai_response -H 'Content-Type: application/json' -d '{\"text\": \"I feel sad\"}'") app.run(host='localhost', port=5000, debug=False) ``` --- ### 4. 运行 Python 服务 ```bash python ai_engine.py ``` ✅ 成功后你会看到: ``` 🚀 Starting AI Companion Server at http://localhost:5000 ``` 你可以用浏览器访问: 👉 http://localhost:5000/health 应返回: ```json {"status":"running","message":"AI server is live!"} ``` --- ## ✅ 第二步:UE5 蓝图中发送 HTTP 请求并解析响应 我们将使用 UE5 原生的 **HTTP 模块** 和 **JSON 工具插件** 来实现通信。 ### 1. 启用必要插件 打开 UE5 编辑器 → `Edit → Plugins` 启用以下两个插件: | 插件名 | 用途 | |--------|------| | ✅ **Http** | 提供 HTTP 请求节点 | | ✅ **Json Blueprint Utilities** | 解析 JSON 字符串 | 重启编辑器。 --- ### 2. 创建蓝图类:`BP_DigitalCompanion` 继承自 `Actor` 或 `UserWidget`(如果你是 UI 驱动)。 添加变量: | 变量名 | 类型 | 明 | |-------|------|------| | `UserInputText` | FString | 用户输入的文字(可通过 UMG 输入框获取) | | `AIServerURL` | FString | `"http://localhost:5000/get_ai_response"` | --- ### 3. 创建函数:`RequestAIResponse` 右键 → Add Function → 命名为 `RequestAIResponse` #### 节点流程如下: ```blueprint Function: RequestAIResponse │ ├─→ IsValid (String: UserInputText) ? │ └─ No → Print "❌ Empty input" │ ├─ Yes → Create HTTP Request │ ├─→ Set Method: POST │ ├─→ Set URL: AIServerURL │ ├─→ Set Header: Content-Type = application/json │ │ │ └─→ Construct JSON Body: │ Call: Construct Map from Strings │ Key: "text", Value: UserInputText │ → Convert Map to JSON String (Use node: "Conv_MapToString") │ → Set Request Body │ └─→ Call: Process Request ├─→ On Response Received → ParseResponseAndApply ├─→ On Failure → Print "❌ Request failed" └─→ Timeout: 10.0 seconds ``` > 💡 提示:`Conv_MapToString` 是 “Json Blueprint Utilities” 提供的节点,用于将 `TMap<FString, FString>` 转为 JSON 字符串。 --- ### 4. 创建另一个函数:`ParseResponseAndApply` 处理服务器返回的数据。 ```blueprint Function: ParseResponseAndApply(ResponseCode, ResponseBody) │ ├─→ ResponseCode == 200 ? │ └─ No → Print "❌ HTTP Error:", ResponseCode │ ├─ Yes → JSON String to Object (ResponseBody) │ ├─→ Get Object From Root │ │ │ ├─→ Get Field: "emotion" → Output as FString │ ├─→ Get Field: "speech_text" → Output as FString │ ├─→ Get Field: "duration" → Output as Float │ │ │ └─→ Branch on Emotion String: │ Case "happy": │ → Play Animation: Wave_Hello │ → Set Facial Morph: Smile Weight = 1.0 │ Case "sad": │ → Play Animation: Head_Down │ → Set Facial Morph: Frown Weight = 1.0 │ Case "angry": │ → Play Animation: CrossArms │ → Set Material Parameter: EyeColor = Red │ Default: │ → Reset Face │ └─→ Call TTS or Play Sound: → Use "Play Sound 2D" 或调用第三方 TTS 插件播放 speech_text → 可配合 Delay(duration) 实现口型同步占位 ``` --- ### 5. 触发机建议 - 在 UMG 按钮点击触发 `RequestAIResponse` - 或每 5 秒自动轮询一次(模拟主动关怀) ```blueprint Event BeginPlay └─→ Loop Every 5.0s → Call RequestAIResponse (with fixed test text) ``` --- ## ✅ 第三步:控制 MetaHuman 表情(关键步骤) ### 方法一:使用 Control Rig + 动画序列 - 制作多个短动画:`Anim_Happy`, `Anim_Sad`, `Anim_Surprised` - 在蓝图中: ```blueprint Play Animation Montage (Anim_Happy) ``` ### 方法二:直接控制 Blend Shape(推荐用于精细表情) MetaHuman 使用的是 **Skeletal Mesh 的 Morph Target(形变目标)** 常见 Morph Name 示例: - `smile_open`: 微笑张嘴 - `frown`: 皱眉 - `eyeClosed_left`: 左眼闭合 - `jawOpen`: 张嘴 #### 蓝图设置方法: ```blueprint Set Morph Target ├─ Target: YourMetaHumanMesh ├─ Morph Target Name: "smile_open" └─ Value: 1.0 // 0~1 控制强度 ``` > ⚠️ 注意:Morph Target 名称必须与你的 MetaHuman 导出一致,可在 Skeletal Mesh 查看。 --- ## ✅ 第四步:语音输出方案(Text-to-Speech) ### 方案 A:本地 TTS(Windows Only) 使用 `Windows Text-to-Speech`(需 C++ 封装,但有现成插件) 推荐插件: - 🔗 [TTS Plugin for Unreal](https://github.com/magicien/Dev_WebHelper)(支持在线 TTS) ### 方案 B:调用在线 API(推荐) | 服务 | 是否免费 | 明 | |------|----------|------| | Amazon Polly | ✅ 有免费额度 | 高质量语音 | | Google Cloud Text-to-Speech | ✅ 有免费额度 | 多语言支持 | | Azure Cognitive Services | ✅ 免费试用 | 支持情感语音 | 你可以在 Python 端生成语音文件并返回 URL,UE5 下载后播放。 --- ## ✅ 打包发布注意事项 ### 1. 修改 IP 地址为局域网可达地址 不要用 `localhost`,改用你的 PC 局域网 IP: ```python app.run(host='0.0.0.0', port=5000) # 让外部设备也能访问 ``` UE5 中 URL 改为: ``` http://192.168.x.x:5000/get_ai_response ``` ### 2. 添加网络权限(Android) 在 `Build.cs` 中添加: ```csharp PublicDependencyModuleNames.Add("Http"); PublicDependencyModuleNames.Add("JsonUtilities"); ``` 并在 `AndroidEngine.ini` 添加权限: ```ini [RuntimeOptions] +Permissions=INTERNET ``` --- ## ✅ 测试流程总结 | 步骤 | 操作 | |------|------| | 1 | 运行 `python ai_engine.py` | | 2 | 打开 UE5 项目,进入关卡 | | 3 | 在输入框输入:“I feel happy today” | | 4 | 点击“发送”按钮 | | 5 | 观察日志是否收到 JSON | | 6 | 数字人面部变为“微笑”,并播放语音 | --- ## ✅ 优点 vs 缺点 | 优点 | 缺点 | |------|------| | ✅ 无需插件,纯蓝图实现 | ⚠️ 不是实推送(需手动/定请求) | | ✅ 易于理解和调试 | ⚠️ 延迟略高(取决于网络和服务器响应) | | ✅ 支持打包发布 | ⚠️ 大量请求可能影响性能(可用节流控制) | | ✅ 可扩展性强(后续可升级为 WebSocket) | —— | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值