VUE+SPRINGBOOT从0-1打造前后端-前后台系统-通用语音合成

发布于:2025-08-16 ⋅ 阅读:(24) ⋅ 点赞:(0)

文字转语音(Text-to-Speech, TTS)技术在现代应用中扮演着越来越重要的角色,从智能客服到有声读物,从语音导航到内容播报,TTS技术大大丰富了人机交互的方式。本文将详细介绍如何基于WebSocket协议和讯飞开放平台,构建一个功能完善的实时文字转语音系统。

一、系统概述

本TTS系统主要具有以下功能特点:

  1. 支持多种发音人选择(包括不同性别、年龄和场景的语音)

  2. 实时语音合成与播放

  3. 合成音频下载功能

  4. 支持中英文文本合成

  5. 可选的背景音乐功能

  6. 文本发音标注功能(如多音字标注)

系统前端采用Vue.js框架结合Element UI组件库实现,后端通过WebSocket与讯飞TTS服务进行实时通信。

二、系统架构设计

2.1 前端架构

前端采用典型的Vue.js单页面应用结构:

  • 视图层:使用Vue模板语法构建用户界面

  • 组件化:将功能模块封装为可复用的组件

  • 状态管理:使用Vue的响应式系统管理应用状态

  • UI框架:基于Element UI提供美观的界面组件

2.2 通信架构

系统采用WebSocket协议与讯飞TTS服务进行实时通信,相比传统的HTTP请求,WebSocket具有以下优势:

  1. 全双工通信:客户端和服务器可以同时发送和接收数据

  2. 低延迟:建立连接后无需重复握手

  3. 高效性:适合实时音频数据传输

2.3 音频处理流程

  1. 前端将用户输入的文本和参数通过WebSocket发送到讯飞TTS服务

  2. 讯飞服务实时返回合成的音频数据(Base64编码)

  3. 前端解码音频数据并通过Web Audio API播放

  4. 用户可选择下载合成后的WAV格式音频文件

三、核心功能实现

3.1 发音人选择界面

系统提供了丰富的发音人选择,界面采用Element UI的卡片和栅格布局实现:

<el-row :gutter="10" style="border-bottom: 1px dashed grey">
  <el-col :span="4">
    <el-card style="height: 102px;">
      <img src="../css_assets/1.png" style="width: 15%">
      <div style="display: inline-block;vertical-align: top;margin-left: 20px;width: 120px;">
        男声小俊<br>
        <span style="padding-left: 5px;padding-right: 5px;font-size: 12px;background-color: dodgerblue;color: white">
          广告场景
        </span>
        <span style="margin-left: 10px;font-size: 12px;color: #409EFF;">成年男声</span>
        <br>
        <el-radio v-model="radio" label="x4_xiaojun">使用</el-radio>
      </div>
    </el-card>
  </el-col>
  <!-- 更多发音人选项... -->
</el-row>

发音人按照性别和场景进行分类展示,每种发音人都有对应的场景标签和性别标识,方便用户选择最适合当前使用场景的语音。

3.2 文本输入与处理

系统提供文本输入区域,支持以下特性:

<el-input type="textarea" v-model="ttsText" rows="15"
          style="font-family: 'Microsoft YaHei';font-size: medium;font-weight: bold"
          :maxlength="2000" show-word-limit placeholder="请输入不超过2000个汉字的文本进行合成">
</el-input>
  • 最大支持2000个字符的输入

  • 实时字数统计显示

  • 支持多音字标注(如"我行[=hang2]推出")

  • 根据选择的发音人自动切换示例文本(中英文)

3.3 WebSocket连接与通信

系统核心功能是通过WebSocket与讯飞TTS服务进行通信:

doWsWork() {
  let bgs = this.bgMusic ? 1 : 0;
  const url = this.getWebSocketUrl(atob(this.user.apikey), atob(this.user.apisecret));
  
  // 创建WebSocket连接
  if ("WebSocket" in window) {
    this.ttsWS = new WebSocket(url);
  } else if ("MozWebSocket" in window) {
    this.ttsWS = new MozWebSocket(url);
  } else {
    alert("浏览器不支持WebSocket");
    return;
  }
  
  // 连接建立后的处理
  this.ttsWS.onopen = (e) => {
    console.log("链接成功...")
    audioPlayer.start({
      autoPlay: true,
      sampleRate: 16000,
      resumePlayDuration: 1000
    });
    
    // 准备并发送请求参数
    let text = this.ttsText;
    let tte = document.getElementById("tte") ? "unicode" : "UTF8";
    let params = {
      common: { app_id: atob(this.user.appid) },
      business: {
        aue: "raw",
        auf: "audio/L16;rate=16000",
        vcn: this.radio,
        bgs: bgs,
        tte,
      },
      data: {
        status: 2,
        text: this.encodeText(text, tte),
      },
    };
    this.ttsWS.send(JSON.stringify(params));
  };
  
  // 接收服务器返回的音频数据
  this.ttsWS.onmessage = (e) => {
    let jsonData = JSON.parse(e.data);
    if (jsonData.code !== 0) {
      console.error(jsonData);
      return;
    }
    
    // 将音频数据传递给播放器
    audioPlayer.postMessage({
      type: "base64",
      data: jsonData.data.audio,
      isLastData: jsonData.data.status === 2,
    });
    
    // 合成完成,关闭连接
    if (jsonData.code === 0 && jsonData.data.status === 2) {
      this.ttsWS.close();
    }
  };
  
  // 错误处理
  this.ttsWS.onerror = (e) => {
    console.error(e);
  };
  
  // 连接关闭处理
  this.ttsWS.onclose = (e) => {
    console.log(e + "链接已关闭");
  };
}

3.4 音频播放与下载

系统使用专门的音频播放器处理接收到的音频数据:

const audioPlayer = new AudioPlayer("../../player");

// 播放音频
audioPlayer.start({
  autoPlay: true,
  sampleRate: 16000,
  resumePlayDuration: 1000
});

// 下载音频
const blob = audioPlayer.getAudioDataBlob("wav")
let node = document.createElement("a");
node.href = window.URL.createObjectURL(blob);
node.download = `${new Date().getTime()}.wav`;
node.click();
node.remove();

3.5 鉴权与安全

系统采用讯飞开放平台的鉴权机制,确保通信安全:

getWebSocketUrl(apiKey, apiSecret) {
  let url = "wss://tts-api.xfyun.cn/v2/tts";
  let host = location.host;
  let date = new Date().toGMTString();
  let algorithm = "hmac-sha256";
  let headers = "host date request-line";
  let signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v2/tts HTTP/1.1`;
  let signatureSha = CryptoJS.HmacSHA256(signatureOrigin, apiSecret);
  let signature = CryptoJS.enc.Base64.stringify(signatureSha);
  let authorizationOrigin = `api_key="${apiKey}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`;
  let authorization = btoa(authorizationOrigin);
  url = `${url}?authorization=${authorization}&date=${date}&host=${host}`;
  return url;
}

四、关键技术点解析

4.1 WebSocket实时通信

WebSocket协议在本系统中扮演着关键角色,它允许服务器主动向客户端推送数据,非常适合实时音频传输场景。系统建立了完整的WebSocket生命周期管理:

  1. 连接建立:根据鉴权信息创建WebSocket连接

  2. 消息发送:将文本和参数JSON序列化后发送

  3. 消息接收:处理服务器返回的音频数据

  4. 错误处理:捕获并处理通信错误

  5. 连接关闭:合成完成后优雅关闭连接

4.2 音频数据处理

系统接收的音频数据是Base64编码的,需要进行解码和播放控制:

  1. Base64解码:将服务器返回的音频数据解码为二进制

  2. 音频缓冲:管理接收到的音频数据块

  3. 连续播放:确保音频播放的连贯性

  4. 格式转换:支持WAV格式导出

4.3 多音字处理

系统支持多音字标注功能,用户可以通过[=拼音]的方式指定多音字的发音:

我行[=hang2]推出,其中[=hang2]可以标记"行"发hang2声。

这一功能通过讯飞TTS服务的文本编码功能实现,系统会根据标注自动处理多音字发音。

4.4 中英文自动切换

系统会根据选择的发音人自动切换示例文本:

watch: {
  radio(newVal, oldVal) {
    if (newVal == "x4_enus_luna_assist" || newVal == "x4_EnUs_Lindsay_assist" || newVal == "x4_enus_ryan_assist") {
      this.ttsText = "Welcome to use the text-to-speech function...";
    } else {
      this.ttsText = "欢迎使用文字转语音功能...";
    }
  }
}

五、系统优化与扩展

5.1 性能优化

  1. 音频数据缓冲:合理设置缓冲区大小,平衡内存使用和播放流畅性

  2. 连接复用:对于频繁合成场景,可以考虑复用WebSocket连接

  3. 错误重试:实现网络中断后的自动重连机制

5.2 功能扩展

  1. 语音效果调节:增加语速、音调、音量等参数调节

  2. SSML支持:支持语音合成标记语言,实现更精细的控制

  3. 批量合成:支持长文本自动分片和批量合成

  4. 历史记录:保存用户的合成历史,方便重复使用

5.3 用户体验改进

  1. 合成进度显示:实时显示合成进度和剩余时间

  2. 试听功能:为每个发音人提供简短的试听样本

  3. 参数预设:根据不同场景提供参数预设方案

  4. 响应式设计:优化移动端使用体验

六、总结

本文详细介绍了基于WebSocket的实时文字转语音系统的设计与实现。系统充分利用了现代Web技术(Vue.js、WebSocket、Web Audio API等)和讯飞开放平台的强大TTS能力,构建了一个功能完善、用户体验良好的在线语音合成工具。

该系统具有以下特点:

  1. 丰富的发音人选择,覆盖多种场景和语言

  2. 实时高效的语音合成与播放

  3. 完善的音频下载功能

  4. 支持多音字标注等高级功能

  5. 良好的扩展性和优化空间

随着Web技术的不断发展,基于浏览器的TTS应用将会有更广阔的应用前景。未来可以考虑集成更多语音服务提供商,增加语音风格迁移等高级功能,进一步提升系统的实用性和竞争力。


网站公告

今日签到

点亮在社区的每一天
去签到