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