Unity之使用火山引擎实现音频剪辑提问,流式语音回复

执行流程

  1. 输入音频文件,调用语音模型API,输出语音识别文字;
  2. 输入识别文字,调用语言模型API,输出回复文字(流式);
  3. 输入回复文字,调用语音模型API,输出音频数据(流式);
  4. 输入音频数据,通过流式AudioClip播放音频。

音频提问,流式语音回复

Unity之使用火山引擎实现语音识别

Unity之使用火山引擎实现文字提问流式回复

Unity之使用火山引擎实现流式语音合成

整合上述功能,实现音频提问,流式语音回复。

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
/// <summary>
/// 语音提问
/// </summary>
public class VoiceQuestion : MonoBehaviour
{
    [Header("语音转文字")]
    [SerializeField] SpeechRecognition speechRecognition;

    [Header("文字转语音")]
    [SerializeField] TextToSpeechOut textToSpeech;

    [Header("文字提问")]
    [SerializeField] TextQuestions textQuestions;
    List<Message> messages;
    StringBuilder thinkContentBuffer;
    Message assistantMessage;
    [Header("进行语音合成最少字符")]
    [SerializeField] int minTTSSendLength = 4;
    StringBuilder ttsSendBuffer;

    [Header("使用附加提示词")]
    [SerializeField] bool addtionPrompt;
    [Header("附加提示词")]
    [SerializeField] string prompt;

    public event Action OnTextAnswerCompleted;
    public event Action OnError;

    void Awake()
    {
        messages = new List<Message>();
        thinkContentBuffer = new StringBuilder();
        ttsSendBuffer = new StringBuilder();
        textQuestions.onReceive += OnReceiveAnswer;
        textQuestions.onCompleted += OnReceiveAnswerCompleted;
        textQuestions.OnError += OnReceiveAnswerError;
    }

    //1.输入提问音频
    public void InputQuestionAudio(AudioClip audioClip, bool newDialogue = true)
    {
        Debug.Log("语音转文字 开始");
        if (newDialogue)
        {
            messages.Clear();
            Debug.Log("清除历史对话");
        }
        speechRecognition.Request(audioClip, OnGetAudioToText);
    }

    //2.问题音频转文字后
    void OnGetAudioToText(bool sucess, string content)
    {
        Debug.Log("语音转文字 结束");
        if (sucess)
        {
            Debug.Log("文字提问 开始");
            if (addtionPrompt)
                content += prompt;
            thinkContentBuffer.Clear();

            messages.Add(new Message()
            {
                role = "user",
                content = content,
            });
            assistantMessage = new Message()
            {
                role = "assistant",
            };
            textQuestions.Request(messages);
        }
        else
        {
            Debug.LogError("语音转文字 失败");
            OnError?.Invoke();
        }
    }

    //3.接收回复文本
    void OnReceiveAnswer(string part, bool stop)
    {
        Debug.Log("接收回复文本");
        thinkContentBuffer.Append(part);
        if (part.Contains("*"))
            part = part.Replace("*", "");
        if (part.Contains("#"))
            part = part.Replace("#", "");

        ttsSendBuffer.Append(part);

        if (ttsSendBuffer.Length >= minTTSSendLength || stop)
        {
            var content = ttsSendBuffer.ToString();
            ttsSendBuffer.Clear();
            textToSpeech.ReadText(content);
        }
    }

    //4.接收回复文本结束
    void OnReceiveAnswerCompleted()
    {
        Debug.Log("文本提问 结束");
        assistantMessage.content = thinkContentBuffer.ToString();
        thinkContentBuffer.Clear();
        messages.Add(assistantMessage);
        textToSpeech.EndReadText();
        OnTextAnswerCompleted?.Invoke();
    }

    void OnReceiveAnswerError()
    {
        OnError?.Invoke();
    }

    void OnDestroy()
    {
        if (textQuestions)
        {
            textQuestions.OnError -= OnReceiveAnswerError;
            textQuestions.onReceive -= OnReceiveAnswer;
            textQuestions.onCompleted -= OnReceiveAnswerCompleted;
        }
        messages?.Clear();
        thinkContentBuffer?.Clear();
    }
}
相关推荐
美狐美颜SDK开放平台3 小时前
视频美颜SDK是什么?直播APP开发中美颜功能实现方式介绍
深度学习·架构·实时互动·音视频·视频美颜sdk
Behaviour3 小时前
Unity UI循环列表UIScrollViewContent实现
ui·unity·c#·游戏引擎
美狐美颜sdk6 小时前
直播APP开发如何实现美颜功能?视频美颜SDK接入流程与技术方案解析
大数据·人工智能·音视频·美颜sdk·美颜api
阿童木写作8 小时前
跨马翻译:AI批量图片翻译工具,视频字幕翻译与智能抠图一站式解决
大数据·人工智能·python·音视频
辰辰观影9 小时前
HDR视频颜色偏黄怎么解决?
音视频
A133455510 小时前
2026网盘视频播放器推荐 支持4K全平台
音视频
quweiie12 小时前
腾讯云视频点播-web上传视频
前端·音视频·腾讯云·上传视频·腾讯云视频点播
揽秀亭长13 小时前
音频转简谱实测:AI扒谱与传统制谱方式有什么区别
人工智能·音视频
ai产品老杨14 小时前
越界检测算法接入 AI 视频分析平台的流程与误报优化指南
人工智能·算法·音视频
_ZHOURUI_H_14 小时前
Unity EasyECS:并不是所有字段都适合 SoA,Unity 项目中应该怎样拆数据
游戏·unity·性能优化·架构·游戏引擎