Springboot3+Vue3实现副业(创业)智能语音项目开发(完结)
使用Spring Boot 3 + Vue 3 实现副业(创业)智能语音项目开发
随着人工智能技术的飞速发展,智能语音助手已成为许多企业和个人创业者的新宠。本文将详细介绍如何使用Spring Boot 3和Vue 3构建一个智能语音项目,涵盖从项目设计到开发、测试和部署的全过程。
1. 项目概述
1.1 项目背景
智能语音助手可以帮助用户通过语音指令完成各种任务,如查询天气、播放音乐、设置闹钟等。该项目的目标是开发一个基于Web的智能语音助手,用户可以通过语音与助手互动,获取所需的信息和服务。
1.2 技术栈
- 后端:Spring Boot 3
- 前端:Vue 3
- 语音识别:使用Google Speech-to-Text API
- 语音合成:使用Google Text-to-Speech API
- 数据库:MySQL
- 消息队列:RabbitMQ
- 部署:Docker + Kubernetes
2. 项目设计
2.1 系统架构
- 前端:Vue 3应用,负责用户界面和语音交互。
- 后端:Spring Boot 3应用,处理业务逻辑和API请求。
- 语音识别:使用Google Speech-to-Text API将语音转换为文本。
- 语音合成:使用Google Text-to-Speech API将文本转换为语音。
- 数据库:MySQL,存储用户数据和历史记录。
- 消息队列:RabbitMQ,处理异步任务和消息传递。
3. 环境搭建
3.1 后端环境
- 安装Java 17:Spring Boot 3要求使用Java 17。
- sh深色版本sudo apt updatesudo apt install openjdk-17-jdk
- 安装Maven:
- sh深色版本sudo apt install maven
- 创建Spring Boot项目:
- 使用Spring Initializr创建项目,选择Spring Boot 3.0.0,添加Web、MySQL、RabbitMQ等依赖。
- 生成项目并导入IDE(如IntelliJ IDEA)。
3.2 前端环境
- 安装Node.js:
- sh深色版本sudo apt updatesudo apt install nodejs npm
- 安装Vue CLI:
- sh深色版本npm install -g @vue/cli
- 创建Vue 3项目:
- sh深色版本vue create voice-assistantcd voice-assistant
4. 后端开发
4.1 配置应用
- application.properties:
- properties深色版本spring.datasource.url=jdbc:mysql://localhost:3306/voice_assistant?useSSL=false&serverTimezone=UTCspring.datasource.username=root
spring.datasource.password=rootspring.rabbitmq.host=localhostspring.rabbitmq.port=5672spring.rabbitmq.username=guestspring.rabbitmq.password=guestgoogle.speech.api.key=YOUR_GOOGLE_SPEECH_API_KEYgoogle.tts.api.key=YOUR_GOOGLE_TTS_API_KEY - 依赖管理:
- xml深色版本 \ org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-data-jpaorg.springframework.bootspring-boot-starter-amqpmysqlmysql-connector-javacom.google.cloudgoogle-cloud-speech2.1.0com.google.cloudgoogle-cloud-texttospeech2.1.0
4.2 语音识别
- SpeechService.java:
- java深色版本import com.google.cloud.speech.v1.RecognitionConfig;import com.google.cloud.speech.v1.RecognitionAudio;import com.google.cloud.speech.v1.SpeechClient;import com.google.cloud.speech.v1.SpeechRecognitionAlternative;import com.google.cloud.speech.v1.SpeechRecognitionResult;import com.google.protobuf.ByteString;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.util.List;public class SpeechService { private final String apiKey; public SpeechService(String apiKey) { this.apiKey = apiKey; } public String recognizeSpeech(String filePath) throws IOException { try (SpeechClient speechClient = SpeechClient.create()) { Path path = Path.of(filePath); byte[] data = Files.readAllBytes(path); ByteString audioBytes = ByteString.copyFrom(data); RecognitionConfig config = RecognitionConfig.newBuilder() .setEncoding(RecognitionConfig.AudioEncoding.LINEAR16) .setSampleRateHertz(16000) .setLanguageCode("en-US") .build(); RecognitionAudio audio = RecognitionAudio.newBuilder() .setContent(audioBytes) .build(); List responses = speechClient.recognize(config, audio).getResultsList(); StringBuilder sb = new StringBuilder(); for (SpeechRecognitionResult result : responses) { List alternatives = result.getAlternativesList(); for (SpeechRecognitionAlternative alternative : alternatives) { sb.append(alternative.getTranscript()); } } return sb.toString(); } }}
- SpeechController.java:
- java深色版本import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import java.io.IOException;@RestControllerpublic class SpeechController { @Autowired private SpeechService speechService; @PostMapping("/recognize") public String recognizeSpeech(@RequestParam("file") MultipartFile file) throws IOException { String filePath = "temp_audio.wav"; file.transferTo(new java.io.File(filePath)); return speechService.recognizeSpeech(filePath); }}
4.3 语音合成
- TextToSpeechService.java:
- java深色版本import com.google.cloud.texttospeech.v1.AudioConfig;import com.google.cloud.texttospeech.v1.AudioEncoding;import com.google.cloud.texttospeech.v1.SsmlVoiceGender;import com.google.cloud.texttospeech.v1.SynthesisInput;import com.google.cloud.texttospeech.v1.TextToSpeechClient;import com.google.cloud.texttospeech.v1.VoiceSelectionParams;import com.google.protobuf.ByteString;import java.io.FileOutputStream;import java.io.IOException;public class TextToSpeechService { private final String apiKey; public TextToSpeechService(String apiKey) { this.apiKey = apiKey; } public String synthesizeSpeech(String text, String outputPath) throws IOException { try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) { SynthesisInput input = SynthesisInput.newBuilder() .setText(text) .build(); VoiceSelectionParams voice = VoiceSelectionParams.newBuilder() .setLanguageCode("en-US") .setSsmlGender(SsmlVoiceGender.NEUTRAL) .build(); AudioConfig audioConfig = AudioConfig.newBuilder() .setAudioEncoding(AudioEncoding.MP3) .build(); com.google.cloud.texttospeech.v1.SynthesizeSpeechResponse response = textToSpeechClient.synthesizeSpeech(input, voice, audioConfig); ByteString audioContents = response.getAudioContent(); try (FileOutputStream out = new FileOutputStream(outputPath)) { out.write(audioContents.toByteArray()); } return outputPath; } }}
- TextToSpeechController.java:
- java深色版本import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import java.io.IOException;@RestControllerpublic class TextToSpeechController { @Autowired private TextToSpeechService textToSpeechService; @PostMapping("/synthesize") public String synthesizeSpeech(@RequestParam("text") String text) throws IOException { String outputPath = "output.mp3"; return textToSpeechService.synthesizeSpeech(text, outputPath); }}
5. 前端开发
5.1 项目结构
深色版本voice-assistant/├── public/├── src/
│ ├── assets/
│ ├── components/
│ │ └── VoiceAssistant.vue
│ ├── App.vue
│ ├── main.js
│ └── router/
│ └── index.js├── package.json└── vite.config.js
5.2 主要组件
- VoiceAssistant.vue:
- vue深色版本', formData) .then(response => { recognizedText.value = response.data; }); }; }; const synthesizeSpeech = () => { axios.post('http://localhost:8080/synthesize', { text: recognizedText.value }) .then(response => { const audioUrl = URL.createObjectURL(response.data); audioPlayer.value.src = audioUrl; audioPlayer.value.play(); }); }; return { startRecording, stopRecording, synthesizeSpeech, audioPlayer, recognizedText }; }};.voice-assistant { text-align: center; margin-top: 50px;}
- App.vue:
- vue深色版本#app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px;}
- main.js:
- javascript深色版本import { createApp } from 'vue';import App from './App.vue';import router from './router';createApp(App).use(router).mount('#app');
- router/index.js:
- javascript深色版本import { createRouter, createWebHistory } from 'vue-router';import VoiceAssistant from '../components/VoiceAssistant.vue';const routes = [ { path: '/', name: 'VoiceAssistant', component: VoiceAssistant }];const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes});export default router;
6. 测试
6.1 后端测试
- 启动Spring Boot应用:
- sh深色版本./mvnw spring-boot:run
- 测试API:
- 使用Postman或curl测试/recognize和/synthesize接口。
6.2 前端测试
- 启动Vue应用:
- sh深色版本npm run serve
- 测试功能:
7. 部署
7.1 Docker化
- 创建Dockerfile:
- dockerfile深色版本# Spring Boot应用FROM eclipse-temurin:17-jreCOPY target/voice-assistant.jar /app.jarCMD ["java", "-jar", "/app.jar"]# Vue应用FROM node:16-alpine AS buildWORKDIR /app
COPY ./frontend/package*.json ./RUN npm installCOPY ./frontend .RUN npm run buildFROM nginx:alpineCOPY --from=build /app/dist /usr/share/nginx/htmlEXPOSE 80CMD ["nginx", "-g", "daemon off;"] - 构建Docker镜像:
- sh深色版本docker build -t voice-assistant-backend .docker build -t voice-assistant-frontend -f frontend/Dockerfile .
- 运行Docker容器:
- sh深色版本docker run -d -p 8080:8080 voice-assistant-backenddocker run -d -p 80:80 voice-assistant-frontend
7.2 Kubernetes部署
- 创建Kubernetes资源配置文件:
- yaml深色版本apiVersion: apps/v1kind: Deploymentmetadata: name: voice-assistant-backendspec: replicas: 3 selector: matchLabels: app: voice-assistant-backend template: metadata: labels: app: voice-assistant-backend spec: containers: - name: voice-assistant-backend image: your-docker-repo/voice-assistant-backend:latest ports: - containerPort: 8080---apiVersion: v1kind: Servicemetadata: name: voice-assistant-backendspec: type: LoadBalancer ports: - port: 8080 selector: app: voice-assistant-backend---apiVersion: apps/v1kind: Deploymentmetadata: name: voice-assistant-frontendspec: replicas: 3 selector: matchLabels: app: voice-assistant-frontend template: metadata: labels: app: voice-assistant-frontend spec: containers: - name: voice-assistant-frontend image: your-docker-repo/voice-assistant-frontend:latest ports: - containerPort: 80---apiVersion: v1kind: Servicemetadata: name: voice-assistant-frontendspec: type: LoadBalancer ports: - port: 80 selector: app: voice-assistant-frontend
- 部署到Kubernetes:
- sh深色版本kubectl apply -f kubernetes.yaml
8. 总结
通过本文的介绍,你已经学会了如何使用Spring Boot 3和Vue 3构建一个智能语音项目。从项目设计到开发、测试和部署,每一步都进行了详细的讲解。希望本文能够帮助你在副业或创业的道路上迈出坚实的一步。