diff --git a/jeecg-boot/jeecg-boot-module-cms/pom.xml b/jeecg-boot/jeecg-boot-module-cms/pom.xml
index 3c4d0f6..d432482 100644
--- a/jeecg-boot/jeecg-boot-module-cms/pom.xml
+++ b/jeecg-boot/jeecg-boot-module-cms/pom.xml
@@ -36,6 +36,33 @@
-
+
+
+
+
+ com.hynnet
+ jacob
+ 1.18
+
+
+
+ com.googlecode.soundlibs
+ mp3spi
+ 1.9.5.4
+
+
+
+ org.jflac
+ jflac-codec
+ 1.5.2
+
+
+
+ org
+ jaudiotagger
+ 2.0.3
+
+
+
diff --git a/jeecg-boot/jeecg-boot-module-cms/src/main/java/org/jeecg/modules/cms/spack/JacobSpeakController.java b/jeecg-boot/jeecg-boot-module-cms/src/main/java/org/jeecg/modules/cms/spack/JacobSpeakController.java
new file mode 100644
index 0000000..5ac9071
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-cms/src/main/java/org/jeecg/modules/cms/spack/JacobSpeakController.java
@@ -0,0 +1,145 @@
+package org.jeecg.modules.cms.spack;
+
+import com.jacob.activeX.ActiveXComponent;
+import com.jacob.com.Dispatch;
+import com.jacob.com.Variant;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @ClassName -> JacobTest
+ * @Description
+ * @Author 龙岭
+ * @Date 2021-01-08 11:44
+ * @Version 1.0
+ * @MONTH 01
+ */
+@Api(tags = "文本转语言-语音合成")
+@RestController
+@RequestMapping("/tts")
+@Slf4j
+public class JacobSpeakController {
+
+
+ @ApiOperation(value = "语音合成", notes = "语音合成")
+ @GetMapping(value = "/speak")
+ public Result speak(@RequestParam(name = "text") String text) {
+ ActiveXComponent ax = null;
+ try {
+ ax = new ActiveXComponent("Sapi.SpVoice");
+
+ // 运行时输出语音内容
+ Dispatch spVoice = ax.getObject();
+ // 音量 0-100
+ ax.setProperty("Volume", new Variant(100));
+ // 语音朗读速度 -10 到 +10
+ ax.setProperty("Rate", new Variant(-2));
+ // 执行朗读
+ Dispatch.call(spVoice, "Speak", new Variant(text));
+
+ // 下面是构建文件流把生成语音文件
+
+ ax = new ActiveXComponent("Sapi.SpFileStream");
+ Dispatch spFileStream = ax.getObject();
+
+ ax = new ActiveXComponent("Sapi.SpAudioFormat");
+ Dispatch spAudioFormat = ax.getObject();
+
+ // 设置音频流格式
+ Dispatch.put(spAudioFormat, "Type", new Variant(22));
+ // 设置文件输出流格式
+ Dispatch.putRef(spFileStream, "Format", spAudioFormat);
+ // 调用输出 文件流打开方法,创建一个.wav文件
+ Dispatch.call(spFileStream, "Open", new Variant("./text.wav"), new Variant(3), new Variant(true));
+ // 设置声音对象的音频输出流为输出文件对象
+ Dispatch.putRef(spVoice, "AudioOutputStream", spFileStream);
+ // 设置音量 0到100
+ Dispatch.put(spVoice, "Volume", new Variant(100));
+ // 设置朗读速度
+ Dispatch.put(spVoice, "Rate", new Variant(-2));
+ // 开始朗读
+ Dispatch.call(spVoice, "Speak", new Variant(text));
+
+ // 关闭输出文件
+ Dispatch.call(spFileStream, "Close");
+ Dispatch.putRef(spVoice, "AudioOutputStream", null);
+
+ spAudioFormat.safeRelease();
+ spFileStream.safeRelease();
+ spVoice.safeRelease();
+ ax.safeRelease();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return Result.OK();
+
+ }
+
+ /**
+ * 语音转文字并播放
+ *
+ * @param text
+ */
+ public static void textToSpeech(String text) {
+ ActiveXComponent ax = null;
+ try {
+ ax = new ActiveXComponent("Sapi.SpVoice");
+
+ // 运行时输出语音内容
+ Dispatch spVoice = ax.getObject();
+ // 音量 0-100
+ ax.setProperty("Volume", new Variant(100));
+ // 语音朗读速度 -10 到 +10
+ ax.setProperty("Rate", new Variant(-2));
+ // 执行朗读
+ Dispatch.call(spVoice, "Speak", new Variant(text));
+
+ // 下面是构建文件流把生成语音文件
+
+ ax = new ActiveXComponent("Sapi.SpFileStream");
+ Dispatch spFileStream = ax.getObject();
+
+ ax = new ActiveXComponent("Sapi.SpAudioFormat");
+ Dispatch spAudioFormat = ax.getObject();
+
+ // 设置音频流格式
+ Dispatch.put(spAudioFormat, "Type", new Variant(22));
+ // 设置文件输出流格式
+ Dispatch.putRef(spFileStream, "Format", spAudioFormat);
+ // 调用输出 文件流打开方法,创建一个.wav文件
+ Dispatch.call(spFileStream, "Open", new Variant("./text.wav"), new Variant(3), new Variant(true));
+ // 设置声音对象的音频输出流为输出文件对象
+ Dispatch.putRef(spVoice, "AudioOutputStream", spFileStream);
+ // 设置音量 0到100
+ Dispatch.put(spVoice, "Volume", new Variant(100));
+ // 设置朗读速度
+ Dispatch.put(spVoice, "Rate", new Variant(-2));
+ // 开始朗读
+ Dispatch.call(spVoice, "Speak", new Variant(text));
+
+ // 关闭输出文件
+ Dispatch.call(spFileStream, "Close");
+ Dispatch.putRef(spVoice, "AudioOutputStream", null);
+
+ spAudioFormat.safeRelease();
+ spFileStream.safeRelease();
+ spVoice.safeRelease();
+ ax.safeRelease();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void main(String[] args) {
+ textToSpeech("测试语音测试语音测试语音");
+ }
+
+}
diff --git a/jeecg-boot/jeecg-boot-module-cms/src/main/java/org/jeecg/modules/cms/webmagic/controller/NewsWebMagicController.java b/jeecg-boot/jeecg-boot-module-cms/src/main/java/org/jeecg/modules/cms/webmagic/controller/NewsWebMagicController.java
index 565a87b..2da69ca 100644
--- a/jeecg-boot/jeecg-boot-module-cms/src/main/java/org/jeecg/modules/cms/webmagic/controller/NewsWebMagicController.java
+++ b/jeecg-boot/jeecg-boot-module-cms/src/main/java/org/jeecg/modules/cms/webmagic/controller/NewsWebMagicController.java
@@ -3,6 +3,7 @@ package org.jeecg.modules.cms.webmagic.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.cms.webmagic.service.NewsPageProcessor;
import org.jeecg.modules.cms.webmagic.service.NewsPipeline;
import org.springframework.beans.factory.annotation.Autowired;
@@ -25,7 +26,7 @@ public class NewsWebMagicController {
@ApiOperation(value = "国际学院-新联动态爬虫", notes = "国际学院-新联动态爬虫")
@GetMapping(value = "/crawl")
- public void crawl() {
+ public Result crawl() {
String page1 = "http://sie.huanghuai.edu.cn/index.php/item-list-category-13151.shtml";
String pageOther = "http://sie.huanghuai.edu.cn/index.php/item-list-category-13151-page-";
String url = "";
@@ -63,5 +64,6 @@ public class NewsWebMagicController {
// log.error("定时抓取数据线程执行异常", ex);
// }
// }
+ return Result.OK();
}
}
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/static/jacob-1.18-x64.rar b/jeecg-boot/jeecg-boot-module-system/src/main/resources/static/jacob-1.18-x64.rar
new file mode 100644
index 0000000..d8a58b0
Binary files /dev/null and b/jeecg-boot/jeecg-boot-module-system/src/main/resources/static/jacob-1.18-x64.rar differ
diff --git a/jeecg-boot/package-lock.json b/jeecg-boot/package-lock.json
new file mode 100644
index 0000000..1467730
--- /dev/null
+++ b/jeecg-boot/package-lock.json
@@ -0,0 +1,24 @@
+{
+ "name": "jeecg-boot",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "speak-tts": "^2.0.8"
+ }
+ },
+ "node_modules/speak-tts": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmmirror.com/speak-tts/-/speak-tts-2.0.8.tgz",
+ "integrity": "sha512-VY6Q6mRjdou6bF+x0LspvM7GJhBxHx8CLyGPTNQQ7jrztiGutyI4QNZn0cA17c4uk0FnFbA4PaMI3skeZ6PiFg=="
+ }
+ },
+ "dependencies": {
+ "speak-tts": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmmirror.com/speak-tts/-/speak-tts-2.0.8.tgz",
+ "integrity": "sha512-VY6Q6mRjdou6bF+x0LspvM7GJhBxHx8CLyGPTNQQ7jrztiGutyI4QNZn0cA17c4uk0FnFbA4PaMI3skeZ6PiFg=="
+ }
+ }
+}
diff --git a/jeecg-boot/package.json b/jeecg-boot/package.json
new file mode 100644
index 0000000..92b0691
--- /dev/null
+++ b/jeecg-boot/package.json
@@ -0,0 +1,5 @@
+{
+ "dependencies": {
+ "speak-tts": "^2.0.8"
+ }
+}
diff --git a/jeecg-boot/text.wav b/jeecg-boot/text.wav
new file mode 100644
index 0000000..5dfaa5e
Binary files /dev/null and b/jeecg-boot/text.wav differ