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();
    }
}
相关推荐
RTC实战笔记7 天前
Android 实时音视频接入教程:媒体补充增强信息(SEI)
音视频·媒体·rtc
潜创微科技8 天前
HDMI1.3 无线传输芯片方案 空旷 150 米量产级音视频方案
音视频
VidDown8 天前
VidDown 工具站:免费、本地优先的开发者工具箱
javascript·编辑器·音视频·视频编解码·视频
换个昵称都难8 天前
音频格式之WAV
音视频
AI创界者8 天前
PilotTTS 一键整合包(Win/Mac):8G 显存畅跑,实测解锁情绪与副语言的精准控制
人工智能·macos·aigc·音视频
u152109648498 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
VidDown8 天前
显卡处理视频技术详解:从硬解码到 NVENC,GPU 如何让视频处理起飞?
javascript·编辑器·音视频·视频编解码·视频
EasyDSS8 天前
全能音视频平台/私有化音视频系统EasyDSS!直播/点播/会议/集群对讲一站式落地
音视频
Damon_X8 天前
车载音频复习
音视频
3DVisionary8 天前
告别数据中断:XTDIC-VG视频引伸计在金属疲劳测试中3个真实案例
人工智能·音视频·应用案例·xtdic-vg·视频引伸计·疲劳测试·实战复盘