构建AI应用,让它能看、能听、会说话 — 在30分钟内
所以,你想构建一个能观看视频流、倾听用户并以自然语音回应的AI。听起来很酷,对吧?现在尝试构建它。
你需要一个语音转文本API。一个视觉模型。一个语言模型。一个文本转语音服务。用于实时流的WebRTC。用于低延迟通信的WebSocket。然后你把它们全部拼接在一起,祈祷延迟保持在两秒以下,并在音频和视频不同步时调试异步的混乱。
我们经历过。这正是我们构建Orga AI的原因。
统一的SDK。无缝的API流。视觉、语音和对话 — 在700毫秒内协同处理。开箱即用支持40多种语言。是的,你可以在30分钟内让它运行起来。
什么是Orga AI?
Orga AI是一个实时对话式AI平台。用户打开摄像头,自然说话,并向AI展示正在发生的事情。AI观看、倾听并用其语音回应 — 使用他们的语言。
它是这样的:
用户(将手机摄像头对准设备):“我的智能集线器无法连接。指示灯一直闪烁橙色。”
Orga AI(观察闪烁模式):“我看到橙色闪烁了 — 你的集线器丢失了网络设置。把后面给我看看,我会指导你进行重置。”
无需打字。无需截图。没有“请详细描述你的问题”。AI看到问题,并像同事一样用语音讲解解决方案。这就是你可以用Orga交付的体验。
开始使用Orga SDK
Orga提供了一套从客户端到服务器端的SDK,协同工作以将你的应用程序连接到我们的API。Orga客户端SDK可以与任何基于React的框架集成。选择你的技术栈并跟着操作。
Next.js(最快设置)
我们的Next.js启动器已经搭建好一个完整的应用程序,视频、音频和AI对话功能已预先配置好。
1
2
3
4
|
npx @orga-ai/create-orga-next-app my-app
cd my-app
npm install
npm run dev
|
打开localhost:3000。你会看到一个可运行的演示:摄像头预览、语音输入、AI回应。自定义个性,插入你的逻辑,然后交付。
后端代理(Node)
为了保护你的API密钥安全,你首先需要创建一个小的后端服务。此后端充当你的应用和Orga之间的代理。其工作是从Orga API获取ICE服务器和一个临时令牌。你的客户端SDK(React或React Native)将在建立自身连接之前调用此端点。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import 'dotenv/config';
import express from 'express';
import cors from 'cors';
import { OrgaAI } from '@orga-ai/node';
const app = express();
app.use(cors());
const orga = new OrgaAI({
apiKey: process.env.ORGA_API_KEY!
});
app.get('/api/orga-client-secrets', async (_req, res) => {
try {
const { ephemeralToken, iceServers } = await orga.getSessionConfig();
res.json({ ephemeralToken, iceServers });
} catch (error) {
console.error('Failed to get session config:', error);
res.status(500).json({ error: 'Internal server error' });
}
});
app.listen(5000, () => console.log('Proxy running on http://localhost:5000'));
|
一旦此后端端点运行,你的前端SDK就可以调用它以获取会话配置。无需在客户端暴露你的API密钥。
后端部分到此结束。接下来,我们将看到如何从前端调用此端点并建立连接。
React(Vite, CRA 或你自己的设置)
已经有React项目了吗?直接引入SDK。
1
|
npm install @orga-ai/react
|
在设置Provider时,此处是你告诉客户端SDK要调用哪个后端端点的地方。该端点返回临时令牌和ICE服务器,然后SDK使用这些信息建立与Orga的安全连接,而永远不会暴露你的API密钥。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
'use client'
import { OrgaAI, OrgaAIProvider } from '@orga-ai/react';
OrgaAI.init({
logLevel: 'debug',
model: 'orga-1-beta',
voice: 'alloy',
fetchSessionConfig: async () => {
const res = await fetch('http://localhost:5000/api/orga-client-secrets');
if (!res.ok) throw new Error('Failed to fetch session config');
const { ephemeralToken, iceServers } = await res.json();
return { ephemeralToken, iceServers };
},
});
export function OrgaClientProvider({ children }: { children: React.ReactNode }) {
return <OrgaAIProvider>{children}</OrgaAIProvider>;
}
|
然后用Provider包裹你的应用:
1
2
3
4
5
6
7
8
9
10
11
|
import type { ReactNode } from 'react';
import { OrgaClientProvider } from './providers/OrgaClientProvider';
export default function RootLayout({ children }: { children: ReactNode }) {
return (
<html lang="en">
<body>
<OrgaClientProvider>{children}</OrgaClientProvider>
</body>
</html>
);
}
|
现在你已准备好创建你的主文件并导入 useOrgaAI hook。它暴露了你需要的一切:startSession()、endSession(),以及像 connectionState 这样的实时状态。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
'use client'
import {
useOrgaAI,
OrgaVideo,
OrgaAudio,
} from '@orga-ai/react';
export default function Home() {
const {
startSession,
endSession,
connectionState,
toggleCamera,
toggleMic,
isCameraOn,
isMicOn,
userVideoStream,
aiAudioStream,
} = useOrgaAI();
const isConnected = connectionState === 'connected';
const isIdle = connectionState === 'disconnected';
return (
<main className="mx-auto flex max-w-2xl flex-col gap-6 p-8">
<header>
<h1 className="text-3xl font-bold">Orga React SDK 快速开始</h1>
<p className="text-gray-600">状态: {connectionState}</p>
</header>
<section className="grid grid-cols-2 gap-4">
<button
className="rounded bg-blue-600 px-4 py-2 text-white disabled:opacity-50"
disabled={!isIdle}
onClick={() => startSession()}
>
开始会话
</button>
<button
className="rounded bg-red-600 px-4 py-2 text-white disabled:opacity-50"
disabled={!isConnected}
onClick={() => endSession()}
>
结束会话
</button>
<button
className="rounded border px-4 py-2 disabled:opacity-50"
disabled={!isConnected}
onClick={toggleCamera}
>
{isCameraOn ? '摄像头开' : '摄像头关'}
</button>
<button
className="rounded border px-4 py-2 disabled:opacity-50"
disabled={!isConnected}
onClick={toggleMic}
>
{isMicOn ? '麦克风开' : '麦克风关'}
</button>
</section>
<OrgaVideo stream={userVideoStream} className="h-64 w-full rounded bg-black" />
<OrgaAudio stream={aiAudioStream} />
</main>
);
}
|
React Native(Expo)
为移动端构建吗?相同的API,原生性能。设置与React示例几乎相同,只是在如何导入和初始化SDK方面略有不同。
安装所需的依赖项:
1
|
npm install @orga-ai/react-native react-native-webrtc react-native-incall-manager
|
对于Expo,确保更新app.json以请求摄像头/麦克风访问权限:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
{
"expo": {
"ios": {
"infoPlist": {
"NSCameraUsageDescription": "允许 $(PRODUCT_NAME) 访问您的摄像头",
"NSMicrophoneUsageDescription": "允许 $(PRODUCT_NAME) 访问您的麦克风"
}
},
"android": {
"permissions": [
"android.permission.CAMERA",
"android.permission.RECORD_AUDIO"
]
}
}
}
|
在设置Provider时,此处是你告诉客户端SDK要调用哪个后端端点的地方。该端点返回临时令牌和ICE服务器,然后SDK使用这些信息建立与Orga的安全连接,而永远不会暴露你的API密钥。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import { Stack } from 'expo-router';
import { OrgaAI, OrgaAIProvider } from '@orga-ai/react-native';
OrgaAI.init({
logLevel: 'debug',
model: 'orga-1-beta',
voice: 'alloy',
fetchSessionConfig: async () => {
const response = await fetch('http://localhost:5000/api/orga-client-secrets');
if (!response.ok) throw new Error('Failed to fetch session config');
const { ephemeralToken, iceServers } = await response.json();
return { ephemeralToken, iceServers };
},
});
export default function RootLayout() {
return (
<OrgaAIProvider>
<Stack />
</OrgaAIProvider>
);
}
|
现在你已准备好创建你的主文件并导入 useOrgaAI hook。它暴露了你需要的一切:startSession()、endSession(),以及像 connectionState 这样的实时状态。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
import { StyleSheet, View } from 'react-native';
import {
OrgaAICameraView,
OrgaAIControls,
useOrgaAI,
} from '@orga-ai/react-native';
export default function HomeScreen() {
const {
connectionState,
isCameraOn,
isMicOn,
userVideoStream,
startSession,
endSession,
toggleCamera,
toggleMic,
flipCamera,
} = useOrgaAI();
return (
<View style={styles.container}>
<OrgaAICameraView
streamURL={userVideoStream?.toURL()}
containerStyle={styles.cameraContainer}
style={{ width: '100%', height: '100%' }}
>
<OrgaAIControls
connectionState={connectionState}
isCameraOn={isCameraOn}
isMicOn={isMicOn}
onStartSession={startSession}
onEndSession={endSession}
onToggleCamera={toggleCamera}
onToggleMic={toggleMic}
onFlipCamera={flipCamera}
/>
</OrgaAICameraView>
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: '#0f172a' },
cameraContainer: { width: '100%', height: '100%' },
});
|
与Web端的React不同,使用React Native和Expo构建引入了一些移动端特有的细节。WebRTC和音频需要原生访问设备的摄像头和麦克风,因此你需要在app.json中配置权限。
注意:由于Orga依赖于原生模块,SDK无法在Expo Go内运行。你需要使用开发客户端。
在本地开发时,请记住你的后端端点必须可以从你的移动设备访问。测试时请使用你的本地网络IP(例如 http://192.168.x.x:5000)或像ngrok这样的隧道工具。
有关React、React Native和Node的更详细设置指南、故障排除步骤和深入示例,请查看我们的完整文档。你将找到从设置到生产就绪所需的一切。
你可以构建什么?
Orga听起来不像机器人。语音自然。时机感像人类。用户忘记他们正在与AI对话 — 因此他们可以自由交谈并信任答案。以下是其应用场景:
- 客户支持。用户展示他们的路由器。AI发现端口3的红灯并说:“那个端口有硬件故障。试试另一条线缆。”不再需要“描述你的问题。”AI直接看到它。
- 无障碍辅助。视障用户在咖啡馆举起手机。“菜单上有什么?”AI大声读出告示板。稍后:“我的咖啡好了吗?”它发现柜台上写有他们名字的杯子。
- 现场服务。技术人员将手机对准一个不熟悉的操作面板。“重置开关在哪里?”AI在左侧一个小盖子后面找到它,并指导他们完成步骤 — 无需动手。
如果你的用户需要展示某些东西并谈论它,Orga就是为此而构建的。
通过系统提示使其个性化
每个Orga代理都从一个系统提示开始。它只是一段告诉AI如何行事的文本。想要一个友好的技术支持代表?一个严格的安全检查员?一个耐心的导师?只需写出来。
你是HomeHelp的技术员。
平静地说话。当用户展示损坏的设备时,首先识别型号,然后指导他们进行修复。
如果你看到裸露的电线或水渍,
告诉他们联系专业人员。
立即开始构建
在 platform.orga-ai.com 创建一个免费帐户来构建和测试完整原型。
在 platform.orga-ai.com 注册
从仪表板获取你的API密钥
为你的框架运行启动命令
在 docs.orga-ai.com 探索文档
你已经花了足够多的时间连接各种服务。现在,去构建产品吧。
你会创造什么?