这个前端组件几年后可能很常用

AI会不会取代前端开发?

让我们一同审视这个在技术圈内外引发热烈讨论的话题。多数人持有的立场倾向于认为AI并不具备完全取代前端开发工程师的潜力------至少在短期内不会。这主要是因为AI尚未达到完全理解复杂需求并能持续优化代码的智能水平。然而,我的观点略显悲观,我相信,虽然AI不至于直接取代整个前端职能,却必将引起劳动市场的剧烈变动,大量前端岗位将因此不复存在。

仔细考虑一下,前端开发的核心任务是构建用户界面,提供人机互动的渠道。随着AI技术进步,这种传统的交互方式------通过点击和输入------可能很快就会变得过时。若AI技术发展到足够成熟,让我们通过平易近人的自然语言来与软件直接沟通,用户的操作体验将大为简化,几乎零学习成本地高效完成任务。举个例子,之前我在使用Word处理文档时不断与首行对齐功能抗争,耗费大量的时间在排版上,这是多么低效和令人沮丧的事情。假若AI足够智能,我只需简单地命令一声"帮我把段首行对齐",所有调整便会顺理成章地完成。在这种情形下,Word那繁杂密布的用户界面是否便可精简,乃至部分功能被废弃?这是否意味着前端职位的减少?

再者,像"小爱"与"小度"这样的智能音箱,将来可能会负责处理我们大多数的查询需求。随着机器人技术的发展不断加速,这样的交互模式很有可能成为主流,当然,这同样导致了对传统前端角色需求的显著下降。

在一个诸多交互都可通过简单对话解决的未来,前端页面应当如何设计才显得更加合理呢?我深信,虽说人类以理性见长,但更是富有感性的生物种类。没有人愿意在使用软件时,只与一条冷冰冰的电波线对话。若是能与一个形象生动、亲切动人的虚拟助手交互,那会大大增强用户体验。尤其是如果这个虚拟人格不仅有着丰富的表情和动作,更能够感知用户的情绪、姿态并作出智能互动,那将真正使用户体验达到一个新的高度。

正因如此,我受到了浓厚的兴趣驱动,决定开发一个简易而功能强大的助理机器人组件。它不仅包含一个与用户进行互动的3D模型,并允许定制这个模型以适应不同的场景和需求,这个3D模型还能利用摄像头捕捉用户的面部表情、身体动作等,实现真正的交互式体验。

开始开发

这部分介绍助理机器人组件的实现。请大家结合代码(assistant-robot)看, 想看线上demo的可以看我的个人网站

先制作一个3D模型

因为开发者使用这个组件时大概率会使用自定义的3D模型,所以只要做一个简单的3D模型用于开发和作为默认3D模型就可以了。

  1. 先把身体做出来:
  2. 做一个材质:

效果是这样的:

  1. 加上眼睛和嘴巴:

5. 加上骨骼:

7. 做一个简单的hello动画和idle动画:

开发3D助手和交互

AssistantModel 类是 assistant-robot 库中实现3D助手可视化和交互的部分。它应用webGL技术创造出一个可互动的机器人助手,使得Web页面更加生动和人性化。借助该类,开发者可以自定义3D模型及模型的行为和反馈,提供给用户独特且富有吸引力的交互体验。以下是其主要功能以及每项功能的实现方式:

1. 初始化3D环境与助手模型

功能描述: AssistantModel 类的首要任务是创建3D环境并加载3D助手模型。它设置了摄像机、场景、渲染器以及必要的光照,以便为助手模型提供一个真实的显示效果。
实现方式:

  • 使用 THREE.PerspectiveCamera 初始化摄像机,确定用户的视角。
  • THREE.Scene 用于创建一个场景,在其中添加助手模型和光源。
  • THREE.WebGLRenderer 用于渲染上述场景,它将计算后的图像显示到Canvas上。
  • 光源的设置,例如 THREE.AmbientLightTHREE.DirectionalLight,用于为3D世界提供足够的亮度和阴影效果,以增强真实感。

2. 助手模型管理

功能描述: 该类加载特定的3D模型,并使其成为用户交互的主体。它管理助手的动作和表情,让用户视觉上感受到助手的"活力"。 实现方式:

  • 通过 THREE.GLTFLoader 来加载 .glb.gltf 格式的模型文件。
  • 使用 THREE.AnimationMixer 进行动画混合,管理模型的动画剪辑。
  • THREE.Clock 用于控制动画的时间。
ts 复制代码
    const loader = new GLTFLoader();
    loader.load(
      modelUrl,
      (gltf: any) => {
        const model = gltf.scene;
        model.position.set(...(position || MODEL_CONFIG.position));
        model.rotation.set(...(rotation || MODEL_CONFIG.rotation));
        this.model = model;
        this.mixer = new AnimationMixer(model);
        this.clips = gltf.animations;
        this.scene.add(model);
        this.startIdleAction();
        this.animate();
      },
      () => {},
      (errorMessage: any) => {
        console.warn(errorMessage);
      }
    );

3. 动作与表情播放

功能描述: AssistantModel 类能够触发和控制模型的具体动作,如挥手、点头等. 实现方式:

  • 动作播放是通过 AnimationAction 对象来实现的,它可以对指定的动画剪辑 (AnimationClip) 进行播放、暂停、停止等操作。
  • 动作控制包括设置动画循环方式(如 THREE.LoopOnceTHREE.LoopRepeat),以及动画速度和播放次数。
ts 复制代码
  /**
   * make the robot play a action
   * @param name name of the action
   * @param config config of the action
   */
  play(
    name: string,
    {
      loop = false,
      weight = 1,
      timeScale = 1,
      repetitions = Infinity,
    }: IActionConfig = {}
  ) {
    if (!this.clips || !this.mixer) return;

    const clip = AnimationClip.findByName(this.clips, name);
    if (!clip) return;
    const action = this.mixer.clipAction(clip);

    action.enabled = true;
    action.setLoop(loop ? LoopRepeat : LoopOnce, repetitions);
    action.setEffectiveTimeScale(2 || timeScale);
    action.setEffectiveWeight(weight);
    const repetTime = loop ? action.repetitions : 1; // default repet 1 time
    // halt idle action before play new action
    this.haltIdleAction(
      ((action.getClip().duration * repetTime) / action.timeScale) * 1000 // the time to halt.
    );
    action.reset();
    action.play();
  }

用户面部识别开发

UserDetector 类是 assistant-robot 库中聚焦于用户交互体验的关键组成部分。通过利用现代的面部识别技术,这个类能够提供实时的面部追踪和表情识别,从而允许3D助手模型以真实感十足的方式与用户互动。无论是在用户参与度、沉浸感体验还是智能响应上,UserDetector 都是提升虚拟助手实用性和吸引力的有效工具。目前仅实现了用户面部位置的追踪,以下是该类的主要功能以及它们实现的方法。

面部位置检测

功能描述: 实时检测用户面部的位置,让3D助手模型的视线随用户的移动而移动。

实现方式:

  • 使用摄像头采集用户面部信息
  • 使用@tensorflow-models/face-detection模型,识别用户面部表情和位置信息。
  • 捕捉到的面部位置数据会被传递给3D模型的控制系统,使模型能够调整头部方向以模仿对用户的眼神追踪。
ts 复制代码
  // create the face detector
  async createDetector() {
    try {
      this.detector = await faceDetection.createDetector(
        faceDetection.SupportedModels.MediaPipeFaceDetector,
        {
          runtime: "mediapipe",
          modelType: "short",
          maxFaces: 1,
          solutionPath: this.options.solutionPath
            ? this.options.solutionPath
            : `https://cdn.jsdelivr.net/npm/@mediapipe/face_detection@${mpFaceDetection.VERSION}`,
        }
      );

      return;
    } catch (e) {
      console.warn(e);
      this.setStatus(EUserDetectorStatus.faceDetectorCreateError);
    }
  }

  // get faces from the video tag
  async getFaces() {
    if (!this.video.paused && this.detector) {
      return await this.detector.estimateFaces(this.video, {
        flipHorizontal: false,
      });
    } else {
      return [];
    }
  }

对话功能实现

LanguageModel 类是一个基类,使用assistant-robot组件时要实现这个类,把真正的业务逻辑放到其中,并传给assistant-robot使其具有业务功能。

为了便于测试和试用, assistant-robot 通过MobileBertModel类(继承自LanguageModel)封装了BERT的移动优化版本,提供了简单的语言问答能力,同时保持较小的模型尺寸以便在浏览器环境中运行。以下是关于 MobileBertModel 类的功能描述及其实现方式。

实现方式:

  • MobileBertModel 类使用的是Google开发的Mobile BERT模型 ------ 一个针对移动设备和限制性计算环境优化的轻量级变体。该模型通过减少参数数量和简化网络结构,实现了运行速度的显著提升和内存要求的降低。

  • 利用TensorFlow.js或ONNX.js等JavaScript库将预训练的机器学习模型导入至前端环境执行。

  • MobileBertModel 类提供一个构造器,允许开发者传入一个模型URL,用于加载托管在远端服务器或本地的模型。

  • MobileBertModel 中实现了 findAnswers 抽象方法,该方法接受一个字符串类型的问题作为参数,返回一个Promise,解析出的Promise值是生成的答案。

ts 复制代码
  // to load real language model
  async init() {
    this.status = ELanguageModelStatus.loading;
    try {
      const config = this.modelUrl ? { modelUrl: this.modelUrl } : undefined;
      this.model = await qna.load(config);
      this.loaded();
    } catch (e) {
      console.warn(e);
      this.status = ELanguageModelStatus.error;
    }
  }

  /**
   * ask model question
   * @param question question to ask
   * @returns answer of the question
   */
  async findAnswers(question: string) {
    if (this.model) {
      const answers = await this.model.findAnswers(question, this.passage);
      const answer = findHighestScoreItem(answers);
      return !answer ? "" : answer.text;
    }
    return "";
  }

OperationManager 类功能与实现

assistant-robot 库中,OperationManager 类是用于管理和实施用户与助手界面操作的类。该类负责渲染操作界面,并处理与之相关的用户输入和指令。以下是关于 OperationManager 类的功能及其实现方式的具体介绍。

操作栏呈现

功能描述: 创建并显示一个供用户输入的操作框和一个按钮,用户可以通过这个操作框与助手进行交互。

实现方式:

  • 在构造器中,OperationManager 类将接受一个 DOM 元素作为操作界面容器。
  • 使用工具函数 parseHTML 创建 HTML 按钮 (btnDom) 和输入框 (inputDom),并添加到DOM容器中。
  • 类设置中可以接收配置,如操作栏样式的自定义类名 (operationBoxClassName) 来允许修改默认样式。

操作输入的处理

功能描述: 当用户在操作框内输入文本并提交后,类会捕捉这个操作,并使用回调函数来处理输入。

实现方式:

  • 属性 onAsk 被定义为一个回调函数,当用户输入问答并点击操作按钮时会被调用。
  • 用户输入通过 inputDom.value 获得,将作为参数传递到 onAsk 函数去执行相应的查询或命令。

操作菜单的管理

功能描述: 关于操作列表的动态构建和管理,以及用户点击某个操作时的相应处理。

实现方式:

  • 配置对象中的 operationList 属性包含菜单项的配置及元数据(IOperation)。
  • menuBtnDom 创建一个操作菜单触发按钮,menuDom 初始化菜单项目列表。
  • 用户点击菜单项时,由 onMenuClick 属性定义的回调函数会根据点击的 key 来执行相应操作。

Assistant 类功能与实现

Assistant 类作为 assistant-robot 库的对外接口,提供了一整套功能丰富的API用于开发者创建和管理3D助手。通过这些功能,助手可以更自然地与用户进行互动,包括回答问题和做出一系列的动作。

功能概述

Assistant 类通过提供一系列的方法,让开发者能够在页面中实例化和控制助手机器人。主要功能包括初始化、问答交互、文字(语音)输出以及动作控制。

实现方式:

  • 创建一个 Assistant 实例时,会传入一个 DOM 元素作为助手机器人显示的容器。

  • 可以通过配置对象 IAssistantRobotConfig 自定义助手的一些行为和外观。

  • 实现 ask(question: string) 方法,它接受一个字符串参数作为问题。返回一个 Promise<string>,Promise返回的是语言模型的回答。

  • assistantSay(text: string) 方法能够让机器人机器人展示文字(或发出声音后面会做),并做出动作。

  • assistantPlay(name: string, config?: IActionConfig) 方法让机器人播放一个动作,name 参数指定所要播放的动作名称,而 config 提供了该动作的额外配置选项。如果有自定义的3D模型和动作,可以将它们与此方法结合,控制模型具体执行哪些预定义的动作或动画。

ts 复制代码
  /**
   * ask the assistant robot a question
   * @param question question to ask
   */
  ask = async (question: string) => {
    this.emit(EAssistantEvent.ask, question);
    if (
      this.languageModel &&
      this.languageModel.status === ELanguageModelStatus.ready
    ) {
      try {
        const answer = await this.languageModel.findAnswers(question);
        if (answer) {
          this.assistantSay(answer);
        }
      } catch (e) {
        console.warn(e);
      }
    }
  };

  /**
   * make the robot say something
   * @param text what the robot should say
   */
  assistantSay(text: string) {
    this.emit(EAssistantEvent.say);
    this.assistantModel.say(text);
  }

  /**
   * make the robot play a action
   * @param name name of the action
   * @param config config of the action
   */
  assistantPlay(name: string, config?: IActionConfig) {
    this.assistantModel.play(name, config);
  }

  //make the 3d model of the robot to look at user
  async lookAtUser() {
    const faceAngle = await this.userDetector.getFaceAngle();
    if (faceAngle.length > 1) {
      this.assistantModel.rotate(...faceAngle);
    }
    requestAnimationFrame(() => this.lookAtUser());
  }

结语

目前,assistant-robot 尚未具备语音功能,这是我在做的下一个功能------让用户能够通过语言自然地与助手进行沟通,这会极大提高用户互动体验。另外它将能够捕捉和解析用户的表情,将这些宝贵的情感数据实时反馈,这将极大地丰富用户体验,使得助理不仅仅是一个静态的响应系统,而是一个能够感知用户情绪并做出相应动作的智能伙伴。

完成这些关键功能后,一个功能完备的AI时代与用户交互的组件就基本完成了,开发者使用它后可以很容易的实现与用户的交互部分然后集中精力实现业务逻辑。

最后欢迎使用、pr和star, 项目地址:github.com/ymrdf/assis...

相关推荐
Json____几秒前
学法减分交管12123模拟练习小程序源码前端和后端和搭建教程
前端·后端·学习·小程序·uni-app·学法减分·驾考题库
Chef_Chen13 分钟前
从0开始学习机器学习--Day22--优化总结以及误差作业(上)
人工智能·学习·机器学习
上趣工作室13 分钟前
vue2在el-dialog打开的时候使该el-dialog中的某个输入框获得焦点方法总结
前端·javascript·vue.js
家里有只小肥猫13 分钟前
el-tree 父节点隐藏
前端·javascript·vue.js
fkalis14 分钟前
【海外SRC漏洞挖掘】谷歌语法发现XSS+Waf Bypass
前端·xss
Mr.简锋17 分钟前
opencv常用api
人工智能·opencv·计算机视觉
DevinLGT1 小时前
6Pin Type-C Pin脚定义:【图文讲解】
人工智能·单片机·嵌入式硬件
宋一诺331 小时前
机器学习—高级优化方法
人工智能·机器学习
龙的爹23331 小时前
论文 | The Capacity for Moral Self-Correction in LargeLanguage Models
人工智能·深度学习·机器学习·语言模型·自然语言处理·prompt
Mr.简锋1 小时前
opencv视频读写
人工智能·opencv·音视频