用户需求.md 5.9 KB

整体目标

  • 用户整体想开发一个语音交互的APP,用户可以通过跟动画IP进行对话交流,从而提高英语水平

应用整体的数据流

  • 用户通过浏览器进行语音输入
  • 用户语音实时调用后端的wss服务
  • wss服务实时的将语音调用阿里qwen3模型的API,需要调用三个qwen3模型服务,分别为STT大模型、文本大模型、TTS大模型
  • 然后将TTS返回音频数据通过WSS服务返回给浏览器,浏览器播放给用户听,浏览器调用设备的声音外放功能

细节要求

  • 动画IP形象有三个状态:分别为等、听、说。
  • 动画IP形象的‘等’的状态为:用户没有说话时候
  • 动画IP形象的‘听’的状态为:用户说话期间的时候
  • 动画IP形象的‘说’的状态为:后端WSS服务返回音频,浏览器播放的时候
    • 说的时候,动画IP形象存在情感表达。情感表达是在跟用户对话过程中,后端的wss服务在调用文本大模型生成返回文本时,针对于返回的文本用什么情感来表达。同时在调用TTS大模型时,也需要指导生成语音应用用什么情感表达
  • 实时交互:当麦克风,网络wss服务等条件都准备好后,用户点击按钮进行拾音,放开按钮拾音结束。播放后端wss服务返回的语音
  • 用户点击【录音】按钮后,会出现两个按钮,一个按钮表示用户发送这次请求,一个按钮表示用户取消这次请求
    • 但是为了效率,我们前台还是实时将语音传给后台服务,当用户点击发送按钮,表示用户已经录音结束了。当用户点击取消按钮,表示用户不要上次的音频请求,服务将这个请求丢弃,不返回音频给前端浏览器播放

技术要求

  • 用户对交流回复的时延要求很高,希望能在0.3秒内就能听到动画IP的音频播放。
  • 将用户的语音流实时传输给后端wss服务,wss服务实时调用STT大模型,经过文本大模型、TTS大模型等实时返回音频后,实时的传递给浏览器进行播报
  • 兼容性要求:此应用支持PC端和移动的各种浏览器
  • 前端应用支持使用https进行访问
  • 前端浏览器跟后端服务通过WSS协议进行交互

大模型资料

  • qwen模型的api-key sk-1c11338d4c

  • STT大模型调用demo案例 实时语音识别可以识别麦克风中传入的语音并输出识别结果,达到“边说边出文字”的效果。 运行Python示例前,需要通过pip install pyaudio命令安装第三方音频播放与采集套件。 文件格式:支持pcm、pcm编码的wav、mp3、ogg封装的opus、ogg封装的speex、aac、amr这几种格式。推荐pcm和wav 音频采样位数: 16 bit。

import pyaudio
from dashscope.audio.asr import (Recognition, RecognitionCallback,
                                 RecognitionResult)
# 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将apiKey替换为自己的API Key
# import dashscope
# dashscope.api_key = "apiKey"
mic = None
stream = None
class Callback(RecognitionCallback):
    def on_open(self) -> None:
        global mic
        global stream
        print('RecognitionCallback open.')
        mic = pyaudio.PyAudio()
        stream = mic.open(format=pyaudio.paInt16,
                          channels=1,
                          rate=16000,
                          input=True)

    def on_close(self) -> None:
        global mic
        global stream
        print('RecognitionCallback close.')
        stream.stop_stream()
        stream.close()
        mic.terminate()
        stream = None
        mic = None

    def on_event(self, result: RecognitionResult) -> None:
        print('RecognitionCallback sentence: ', result.get_sentence())


callback = Callback()
recognition = Recognition(model='paraformer-realtime-v2',
                          format='pcm',
                          sample_rate=16000,
                          callback=callback)
recognition.start()

while True:
    if stream:
        data = stream.read(3200, exception_on_overflow=False)
        recognition.send_audio_frame(data)
    else:
        break

recognition.stop()
  • 文本大模型 文本大模型使用的是通义千问-Flash,

    import os
    from openai import OpenAI
    client = OpenAI(
    # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )
    completion = client.chat.completions.create(
    # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
    model="qwen-plus",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "你是谁?"},
    ],
    # Qwen3模型通过enable_thinking参数控制思考过程(开源版默认True,商业版默认False)
    # 使用Qwen3开源版模型时,若未启用流式输出,请将下行取消注释,否则会报错
    # extra_body={"enable_thinking": False},
    )
    print(completion.model_dump_json())
    
    • tts大模型调用demo案例 ```shell

      DashScope SDK 版本不低于 1.23.1

      import os import dashscope

    text = "那我来给大家推荐一款T恤,这款呢真的是超级好看,这个颜色呢很显气质,而且呢也是搭配的绝佳单品,大家可以闭眼入,真的是非常好看,对身材的包容性也很好,不管啥身材的宝宝呢,穿上去都是很好看的。推荐宝宝们下单哦。" response = dashscope.audio.qwen_tts.SpeechSynthesizer.call( # 仅支持qwen-tts系列模型,请勿使用除此之外的其他模型 model="qwen3-tts-flash", # 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:api_key="sk-xxx" api_key=os.getenv("DASHSCOPE_API_KEY"), text=text, voice="Cherry", ) print(response) ```