鸿蒙AR儿童识字卡应用开发指南
互动学习:通过AR技术让识字过程更加生动有趣多感官体验:结合视觉、听觉和触觉增强记忆智能识别:准确识别识字卡片并展示相关内容多设备协同:家长可以远程查看学习进度学习分析:记录学习情况并提供个性化建议扩展方向增加更多识字卡片和3D模型开发识字游戏和挑战集成家长控制功能增加手写识别练习注意事项:1. 需要申请ohos.permission.CAMERA权限
·
鸿蒙AR儿童识字卡应用开发指南
一、系统架构设计
基于HarmonyOS的AR能力和AI技术,我们设计了一套AR儿童识字系统,主要功能包括:
- 卡片识别:通过摄像头识别识字卡片
- AR渲染:在卡片上叠加3D模型和动画
- 语音交互:支持语音朗读和互动
- 多设备协同:跨设备同步学习进度
- 学习记录:跟踪儿童学习情况
https://example.com/harmony-ar-literacy-arch.png
二、核心代码实现
1. AR渲染服务
// ARRenderService.ets
import xComponent from '@ohos.xComponent';
import arEngine from '@ohos.arEngine';
class ARRenderService {
private static instance: ARRenderService;
private arSession: arEngine.ARSession | null = null;
private xComponent: xComponent.XComponent | null = null;
private isTracking: boolean = false;
private constructor() {}
public static getInstance(): ARRenderService {
if (!ARRenderService.instance) {
ARRenderService.instance = new ARRenderService();
}
return ARRenderService.instance;
}
public async initAR(surfaceId: string): Promise<void> {
this.arSession = await arEngine.createARSession();
await this.arSession.init();
this.xComponent = xComponent.createXComponent();
await this.xComponent.init(surfaceId);
const config: arEngine.ARConfig = {
trackingMode: arEngine.TrackingMode.TRACKING_MODE_IMAGE,
lightEstimationMode: arEngine.LightEstimationMode.LIGHT_ESTIMATION_MODE_AMBIENT
};
await this.arSession.configure(config);
}
public async load3DModel(modelId: string): Promise<void> {
if (!this.arSession) return;
const model = await this.loadModelFromResources(modelId);
await this.arSession.add3DModel(model);
}
public async startTracking(): Promise<void> {
if (!this.arSession || this.isTracking) return;
await this.arSession.start();
this.isTracking = true;
// 设置帧回调
this.arSession.on('frame', (frame) => {
this.processARFrame(frame);
});
}
public stopTracking(): void {
if (!this.arSession || !this.isTracking) return;
this.arSession.stop();
this.isTracking = false;
}
private async loadModelFromResources(modelId: string): Promise<arEngine.ARModel> {
// 简化实现,实际应从资源加载模型
return {
id: modelId,
uri: `resources/models/${modelId}.glb`,
scale: { x: 0.1, y: 0.1, z: 0.1 },
position: { x: 0, y: 0, z: 0 }
};
}
private processARFrame(frame: arEngine.ARFrame): void {
if (!frame.images || frame.images.length === 0) return;
// 处理图像帧进行卡片识别
const image = frame.images[0];
cardRecognitionService.recognizeCard(image).then(card => {
if (card) {
this.showCardContent(card);
}
});
}
private showCardContent(card: RecognizedCard): void {
if (!this.arSession) return;
// 在卡片位置显示3D模型
this.arSession.add3DModel({
id: `card_${card.id}`,
uri: this.getModelForCard(card),
position: card.position,
rotation: card.rotation,
scale: { x: 0.05, y: 0.05, z: 0.05 }
});
// 显示文字
this.showTextLabel(card);
}
private getModelForCard(card: RecognizedCard): string {
const modelMap: Record<string, string> = {
'apple': 'models/fruit_apple.glb',
'banana': 'models/fruit_banana.glb',
'cat': 'models/animal_cat.glb',
'dog': 'models/animal_dog.glb'
// 更多卡片模型...
};
return modelMap[card.word] || 'models/default.glb';
}
private showTextLabel(card: RecognizedCard): void {
if (!this.arSession) return;
this.arSession.addTextLabel({
id: `label_${card.id}`,
text: card.word,
position: {
x: card.position.x,
y: card.position.y + 0.1,
z: card.position.z
},
color: '#FFD700',
fontSize: 0.1,
backgroundColor: '#00000080'
});
}
}
export const arRenderService = ARRenderService.getInstance();
2. 卡片识别服务
// CardRecognitionService.ets
import image from '@ohos.multimedia.image';
import objectRecognition from '@ohos.ai.objectRecognition';
class CardRecognitionService {
private static instance: CardRecognitionService;
private recognizer: objectRecognition.ObjectRecognizer;
private constructor() {
this.recognizer = objectRecognition.createRecognizer();
}
public static getInstance(): CardRecognitionService {
if (!CardRecognitionService.instance) {
CardRecognitionService.instance = new CardRecognitionService();
}
return CardRecognitionService.instance;
}
public async recognizeCard(image: image.Image): Promise<RecognizedCard | null> {
const config: objectRecognition.RecognitionConfig = {
featureType: objectRecognition.FeatureType.FEATURE_TYPE_TEXT,
processMode: objectRecognition.ProcessMode.PROCESS_MODE_FAST
};
return new Promise((resolve, reject) => {
this.recognizer.recognize(image, config, (err, result) => {
if (err) {
reject(err);
} else {
resolve(this.processRecognitionResult(result));
}
});
});
}
private processRecognitionResult(rawData: any): RecognizedCard | null {
if (!rawData || !rawData.objects || rawData.objects.length === 0) {
return null;
}
// 找出最可能是识字卡的对象
const card = rawData.objects.find((obj: any) =>
obj.confidence > 0.7 && this.isLearningCard(obj.text)
);
if (!card) return null;
return {
id: generateId(),
word: this.normalizeWord(card.text),
confidence: card.confidence,
position: card.position,
rotation: card.rotation,
timestamp: Date.now()
};
}
private isLearningCard(text: string): boolean {
const learningWords = ['苹果', '香蕉', '猫', '狗', '书', '车', '房子', '树'];
return learningWords.includes(this.normalizeWord(text));
}
private normalizeWord(word: string): string {
// 简化处理,实际可能需要更复杂的文本规范化
return word.trim().replace(/[.!?\\-]/g, '');
}
public async loadCardDatabase(): Promise<void> {
const cards = await this.getDefaultCards();
await this.recognizer.setDatabase(cards);
}
private async getDefaultCards(): Promise<LearningCard[]> {
// 简化实现,实际应从资源或网络加载
return [
{ word: '苹果', image: 'cards/apple.png', model: 'fruit_apple' },
{ word: '香蕉', image: 'cards/banana.png', model: 'fruit_banana' },
{ word: '猫', image: 'cards/cat.png', model: 'animal_cat' },
{ word: '狗', image: 'cards/dog.png', model: 'animal_dog' }
// 更多卡片...
];
}
}
export const cardRecognitionService = CardRecognitionService.getInstance();
3. 学习进度服务
// LearningProgressService.ets
import distributedData from '@ohos.data.distributedData';
class LearningProgressService {
private static instance: LearningProgressService;
private kvManager: distributedData.KVManager;
private kvStore: distributedData.KVStore;
private constructor() {
this.initKVStore();
}
private async initKVStore(): Promise<void> {
const config = {
bundleName: 'com.example.arLiteracy',
userInfo: { userId: 'currentChild' }
};
this.kvManager = distributedData.createKVManager(config);
this.kvStore = await this.kvManager.getKVStore('learning_progress', {
createIfMissing: true
});
this.kvStore.on('dataChange', (data) => {
this.handleRemoteUpdate(data);
});
}
public static getInstance(): LearningProgressService {
if (!LearningProgressService.instance) {
LearningProgressService.instance = new LearningProgressService();
}
return LearningProgressService.instance;
}
public async recordCardLearning(card: RecognizedCard): Promise<void> {
const progress = await this.getProgress();
if (!progress.learnedCards.some(c => c.word === card.word)) {
progress.learnedCards.push({
word: card.word,
firstLearned: Date.now(),
lastReviewed: Date.now(),
reviewCount: 1
});
} else {
const learnedCard = progress.learnedCards.find(c => c.word === card.word);
if (learnedCard) {
learnedCard.lastReviewed = Date.now();
learnedCard.reviewCount++;
}
}
await this.kvStore.put('progress', JSON.stringify(progress));
}
public async getProgress(): Promise<LearningProgress> {
const value = await this.kvStore.get('progress');
return value ? JSON.parse(value) : { learnedCards: [] };
}
public async getLearnedWords(): Promise<string[]> {
const progress = await this.getProgress();
return progress.learnedCards.map(card => card.word);
}
public async syncProgressToDevice(deviceId: string): Promise<void> {
const progress = await this.getProgress();
const ability = await featureAbility.startAbility({
bundleName: 'com.example.arLiteracy',
abilityName: 'ProgressSyncAbility',
deviceId
});
await ability.call({
method: 'receiveProgress',
parameters: [progress]
});
}
private handleRemoteUpdate(data: distributedData.ChangeInfo): void {
if (data.deviceId === deviceInfo.deviceId) return;
if (data.key === 'progress') {
const progress = JSON.parse(data.value);
EventBus.emit('progressUpdated', progress);
}
}
}
export const progressService = LearningProgressService.getInstance();
三、主界面实现
1. AR识别界面
// ARCameraView.ets
@Component
struct ARCameraView {
@State recognizedCards: RecognizedCard[] = [];
@State currentCard: RecognizedCard | null = null;
@State isTracking: boolean = false;
@State surfaceId: string = '';
aboutToAppear() {
this.initAR();
}
build() {
Stack() {
// AR相机预览
XComponent({
id: 'arCameraPreview',
type: 'surface',
libraryname: 'libar.so',
controller: this.arController
})
.onLoad(() => {
this.surfaceId = this.arController.getXComponentSurfaceId();
arRenderService.initAR(this.surfaceId);
})
.width('100%')
.height('100%')
// 识别到的卡片列表
if (this.recognizedCards.length > 0) {
Position() {
Column() {
ForEach(this.recognizedCards, (card) => {
CardItem({ card })
.onClick(() => this.focusCard(card))
})
}
.position({ x: '80%', y: '20%' })
}
}
// 当前卡片内容
if (this.currentCard) {
Position() {
CardDetailView({ card: this.currentCard })
.position({ x: '50%', y: '80%' })
}
}
// 控制按钮
Position() {
Button(this.isTracking ? '停止识别' : '开始识别')
.onClick(() => this.toggleTracking())
.position({ x: '50%', y: '90%' })
}
}
}
private async initAR(): Promise<void> {
await arRenderService.initAR(this.surfaceId);
await cardRecognitionService.loadCardDatabase();
EventBus.on('cardRecognized', (card) => {
this.onCardRecognized(card);
});
}
private toggleTracking(): void {
if (this.isTracking) {
arRenderService.stopTracking();
} else {
arRenderService.startTracking();
}
this.isTracking = !this.isTracking;
}
private onCardRecognized(card: RecognizedCard): void {
// 去重
if (!this.recognizedCards.some(c => c.word === card.word)) {
this.recognizedCards = [...this.recognizedCards, card];
}
// 记录学习进度
progressService.recordCardLearning(card);
// 朗读单词
ttsService.speak(card.word);
}
private focusCard(card: RecognizedCard): void {
this.currentCard = card;
arRenderService.focusOnCard(card);
}
}
@Component
struct CardItem {
private card: RecognizedCard;
build() {
Column() {
Image(this.getCardImage())
.width(80)
.height(80)
.borderRadius(8)
Text(this.card.word)
.fontSize(16)
.margin({ top: 4 })
}
.padding(8)
.backgroundColor('#FFFFFF')
.borderRadius(8)
.shadow({ radius: 4, color: '#00000020' })
}
private getCardImage(): string {
const imageMap: Record<string, string> = {
'苹果': 'resources/cards/apple.png',
'香蕉': 'resources/cards/banana.png',
'猫': 'resources/cards/cat.png',
'狗': 'resources/cards/dog.png'
};
return imageMap[this.card.word] || 'resources/cards/default.png';
}
}
@Component
struct CardDetailView {
private card: RecognizedCard;
build() {
Column() {
Text(this.card.word)
.fontSize(24)
.fontWeight(FontWeight.Bold)
.fontColor('#FFD700')
Text(this.getPinyin())
.fontSize(16)
.margin({ top: 4 })
Button('朗读')
.onClick(() => ttsService.speak(this.card.word))
.margin({ top: 8 })
}
.padding(16)
.backgroundColor('#00000080')
.borderRadius(8)
}
private getPinyin(): string {
const pinyinMap: Record<string, string> = {
'苹果': 'píng guǒ',
'香蕉': 'xiāng jiāo',
'猫': 'māo',
'狗': 'gǒu'
};
return pinyinMap[this.card.word] || '';
}
}
2. 学习记录界面
// ProgressView.ets
@Component
struct ProgressView {
@State progress: LearningProgress = { learnedCards: [] };
@State selectedCategory: string = '全部';
aboutToAppear() {
this.loadProgress();
EventBus.on('progressUpdated', () => this.loadProgress());
}
build() {
Column() {
Text('学习记录')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ top: 16 })
// 分类筛选
Picker({ range: this.getCategories(), selected: this.getCategoryIndex() })
.onChange((index: number) => {
this.selectedCategory = this.getCategories()[index];
})
.margin({ top: 16 })
// 学习统计
Row() {
Text(`已学习: ${this.progress.learnedCards.length}个词语`)
.fontSize(16)
Text(`复习次数: ${this.getTotalReviews()}`)
.fontSize(16)
.margin({ left: 16 })
}
.margin({ top: 16 })
// 学习日历
LearningCalendar({ progress: this.progress })
.margin({ top: 16 })
// 已学词语列表
if (this.progress.learnedCards.length === 0) {
Text('还没有学习记录')
.fontSize(16)
.margin({ top: 32 })
} else {
List({ space: 10 }) {
ForEach(this.getFilteredCards(), (card) => {
ListItem() {
LearnedCardItem({ card })
}
})
}
.layoutWeight(1)
}
}
.padding(16)
}
private async loadProgress(): Promise<void> {
this.progress = await progressService.getProgress();
}
private getCategories(): string[] {
return ['全部', '水果', '动物', '物品', '其他'];
}
private getCategoryIndex(): number {
return this.getCategories().indexOf(this.selectedCategory);
}
private getFilteredCards(): LearnedCard[] {
const categoryMap: Record<string, string[]> = {
'水果': ['苹果', '香蕉', '橙子', '西瓜'],
'动物': ['猫', '狗', '鸟', '鱼'],
'物品': ['书', '车', '房子', '树']
};
if (this.selectedCategory === '全部') {
return this.progress.learnedCards;
}
return this.progress.learnedCards.filter(card =>
categoryMap[this.selectedCategory]?.includes(card.word)
);
}
private getTotalReviews(): number {
return this.progress.learnedCards.reduce((sum, card) => sum + card.reviewCount, 0);
}
}
@Component
struct LearnedCardItem {
private card: LearnedCard;
build() {
Row() {
Image(this.getCardImage())
.width(60)
.height(60)
.borderRadius(8)
Column() {
Text(this.card.word)
.fontSize(18)
.fontWeight(FontWeight.Bold)
Text(`复习次数: ${this.card.reviewCount}`)
.fontSize(14)
.fontColor('#666666')
.margin({ top: 4 })
Text(this.formatDate(this.card.lastReviewed))
.fontSize(12)
.fontColor('#999999')
.margin({ top: 4 })
}
.margin({ left: 12 })
.layoutWeight(1)
Button('复习')
.onClick(() => this.reviewCard())
.width(80)
}
.padding(12)
}
private getCardImage(): string {
const imageMap: Record<string, string> = {
'苹果': 'resources/cards/apple.png',
'香蕉': 'resources/cards/banana.png',
'猫': 'resources/cards/cat.png',
'狗': 'resources/cards/dog.png'
};
return imageMap[this.card.word] || 'resources/cards/default.png';
}
private formatDate(timestamp: number): string {
const date = new Date(timestamp);
return `${date.getMonth() + 1}月${date.getDate()}日`;
}
private reviewCard(): void {
router.push({ url: `pages/ar?word=${this.card.word}` });
}
}
@Component
struct LearningCalendar {
private progress: LearningProgress;
build() {
Column() {
Text('学习日历')
.fontSize(18)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 8 })
// 简化实现,实际应显示完整日历
Row() {
ForEach(this.getRecentDays(), (day) => {
Column() {
Text(day.day.toString())
.fontSize(14)
if (day.learnedCount > 0) {
Circle()
.width(8)
.height(8)
.backgroundColor('#4CAF50')
.margin({ top: 4 })
}
}
.margin({ right: 8 })
})
}
}
.padding(16)
.backgroundColor('#FFFFFF')
.borderRadius(8)
}
private getRecentDays(): { day: number; learnedCount: number }[] {
const now = new Date();
const days: { day: number; learnedCount: number }[] = [];
for (let i = 6; i >= 0; i--) {
const date = new Date(now);
date.setDate(date.getDate() - i);
const day = date.getDate();
const learnedCount = this.progress.learnedCards.filter(card => {
const cardDate = new Date(card.lastReviewed);
return cardDate.toDateString() === date.toDateString();
}).length;
days.push({ day, learnedCount });
}
return days;
}
}
3. 词语详情界面
// WordDetailView.ets
@Component
struct WordDetailView {
@State word: string = '';
@State details: WordDetail | null = null;
@State relatedWords: WordDetail[] = [];
onInit() {
this.word = router.getParams()?.word || '';
}
aboutToAppear() {
this.loadWordDetails();
}
build() {
Column() {
if (!this.details) {
LoadingProgress()
.width(50)
.height(50)
.margin({ top: 32 })
} else {
Text(this.details.word)
.fontSize(32)
.fontWeight(FontWeight.Bold)
Text(this.details.pinyin)
.fontSize(20)
.margin({ top: 8 })
Image(this.details.image)
.width(150)
.height(150)
.margin({ top: 16 })
Text(this.details.definition)
.fontSize(16)
.margin({ top: 16 })
Divider()
.margin({ top: 16 })
Text('相关词语')
.fontSize(20)
.fontWeight(FontWeight.Bold)
.margin({ top: 16 })
if (this.relatedWords.length === 0) {
Text('暂无相关词语')
.fontSize(16)
.margin({ top: 8 })
} else {
Scroll({ scrollable: ScrollDirection.Horizontal }) {
Row() {
ForEach(this.relatedWords, (word) => {
RelatedWordItem({ word })
.margin({ right: 8 })
})
}
.padding(8)
}
}
Button('AR展示')
.onClick(() => this.showInAR())
.margin({ top: 16 })
}
}
.padding(16)
}
private async loadWordDetails(): Promise<void> {
this.details = await dictionaryService.getWordDetails(this.word);
this.relatedWords = await dictionaryService.getRelatedWords(this.word);
}
private showInAR(): void {
router.push({ url: `pages/ar?word=${this.word}` });
}
}
@Component
struct RelatedWordItem {
private word: WordDetail;
build() {
Column() {
Image(this.word.image)
.width(80)
.height(80)
.borderRadius(8)
Text(this.word.word)
.fontSize(16)
.margin({ top: 4 })
}
.padding(8)
.backgroundColor('#FFFFFF')
.borderRadius(8)
.shadow({ radius: 4, color: '#00000020' })
.onClick(() => {
router.push({ url: `pages/word?word=${this.word.word}` });
})
}
}
四、高级功能实现
1. 多设备学习同步
// LearningSyncService.ets
import deviceManager from '@ohos.distributedHardware.deviceManager';
class LearningSyncService {
private static instance: LearningSyncService;
private constructor() {}
public static getInstance(): LearningSyncService {
if (!LearningSyncService.instance) {
LearningSyncService.instance = new LearningSyncService();
}
return LearningSyncService.instance;
}
public async syncProgressToDevice(deviceId: string): Promise<void> {
const progress = await progressService.getProgress();
const ability = await featureAbility.startAbility({
bundleName: 'com.example.arLiteracy',
abilityName: 'ProgressSyncAbility',
deviceId
});
await ability.call({
method: 'receiveProgress',
parameters: [progress]
});
}
public async syncAllDataToNewDevice(deviceId: string): Promise<void> {
const progress = await progressService.getProgress();
const words = await dictionaryService.getAllWords();
const ability = await featureAbility.startAbility({
bundleName: 'com.example.arLiteracy',
abilityName: 'FullSyncAbility',
deviceId
});
await ability.call({
method: 'receiveFullData',
parameters: [progress, words]
});
}
public async requestProgressFromDevice(deviceId: string): Promise<LearningProgress> {
const ability = await featureAbility.startAbility({
bundleName: 'com.example.arLiteracy',
abilityName: 'ProgressRequestAbility',
deviceId
});
const result = await ability.call({
method: 'getProgress',
parameters: []
});
return JSON.parse(result);
}
}
export const learningSyncService = LearningSyncService.getInstance();
2. 语音交互服务
// VoiceInteractionService.ets
import voiceInteraction from '@ohos.ai.voiceInteraction';
class VoiceInteractionService {
private static instance: VoiceInteractionService;
private voiceAssistant: voiceInteraction.VoiceAssistant;
private isListening: boolean = false;
private constructor() {
this.voiceAssistant = voiceInteraction.createVoiceAssistant();
}
public static getInstance(): VoiceInteractionService {
if (!VoiceInteractionService.instance) {
VoiceInteractionService.instance = new VoiceInteractionService();
}
return VoiceInteractionService.instance;
}
public async init(): Promise<void> {
await this.voiceAssistant.init();
await this.registerCommands();
}
private async registerCommands(): Promise<void> {
const commands = [
{
name: 'read_word',
patterns: ['读一下', '朗读', '这是什么'],
action: 'read'
},
{
name: 'next_word',
patterns: ['下一个', '换一个', '继续'],
action: 'next'
},
{
name: 'spell_word',
patterns: ['怎么拼', '拼写', '拼音'],
action: 'spell'
}
];
await this.voiceAssistant.setCommands(commands);
this.voiceAssistant.on('command', (command) => {
this.handleCommand(command);
});
}
public startListening(): void {
if (this.isListening) return;
this.voiceAssistant.startListening();
this.isListening = true;
}
public stopListening(): void {
if (!this.isListening) return;
this.voiceAssistant.stopListening();
this.isListening = false;
}
private handleCommand(command: voiceInteraction.VoiceCommand): void {
switch (command.action) {
case 'read':
if (this.currentWord) {
ttsService.speak(this.currentWord);
}
break;
case 'next':
wordService.nextWord();
break;
case 'spell':
if (this.currentWord) {
const pinyin = dictionaryService.getPinyin(this.currentWord);
ttsService.speak(pinyin);
}
break;
}
}
}
export const voiceService = VoiceInteractionService.getInstance();
3. 文字转语音服务
// TTSService.ets
import tts from '@ohos.multimedia.tts';
class TTSService {
private static instance: TTSService;
private ttsEngine: tts.TTSEngine;
private constructor() {
this.ttsEngine = tts.createTTSEngine();
}
public static getInstance(): TTSService {
if (!TTSService.instance) {
TTSService.instance = new TTSService();
}
return TTSService.instance;
}
public async init(): Promise<void> {
await this.ttsEngine.init();
await this.ttsEngine.setVoice('child'); // 使用儿童友好的声音
}
public async speak(text: string): Promise<void> {
return new Promise((resolve, reject) => {
this.ttsEngine.speak(text, {
onStart: () => console.log('开始朗读'),
onFinish: () => resolve(),
onError: (err) => reject(err)
});
});
}
public async spellWord(word: string): Promise<void> {
const pinyin = this.getPinyin(word);
await this.speak(pinyin);
}
private getPinyin(word: string): string {
const pinyinMap: Record<string, string> = {
'苹果': 'píng guǒ',
'香蕉': 'xiāng jiāo',
'猫': 'māo',
'狗': 'gǒu'
// 更多词语的拼音...
};
return pinyinMap[word] || word;
}
}
export const ttsService = TTSService.getInstance();
五、总结
本AR儿童识字卡应用实现了以下核心价值:
- 互动学习:通过AR技术让识字过程更加生动有趣
- 多感官体验:结合视觉、听觉和触觉增强记忆
- 智能识别:准确识别识字卡片并展示相关内容
- 多设备协同:家长可以远程查看学习进度
- 学习分析:记录学习情况并提供个性化建议
扩展方向:
- 增加更多识字卡片和3D模型
- 开发识字游戏和挑战
- 集成家长控制功能
- 增加手写识别练习
注意事项:
1. 需要申请ohos.permission.CAMERA权限
2. AR功能需要设备支持
3. 语音识别准确率受环境噪音影响
4. 多设备协同需保持网络连接
5. 首次使用建议完成引导设置
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)