Merge branch 'master' of http://182.92.169.222:3000/yu/CostumingPlatform
commit
7dc8c0e9a7
16 changed files with 381 additions and 123 deletions
@ -1,111 +1,145 @@ |
||||
<template> |
||||
<div> |
||||
<a-input-search |
||||
<!-- <a-input |
||||
v-model="userNames" |
||||
placeholder="请先选择用户" |
||||
placeholder="请点击选择用户" |
||||
readOnly |
||||
unselectable="on" |
||||
@search="onSearchDepUser"> |
||||
@search="onSearchDepUser" |
||||
:disabled="disabled" |
||||
@click="onSearchDepUser" |
||||
> |
||||
<a-icon slot="enterButton" type="cluster" title="部门选择控件" /> |
||||
</a-input> --> |
||||
<a-input-search v-model="userNames" placeholder="请先选择用户" readOnly unselectable="on" @search="onSearchDepUser"> |
||||
<a-button slot="enterButton" :disabled="disabled">选择用户</a-button> |
||||
</a-input-search> |
||||
<j-select-user-by-dep-modal ref="selectModal" :modal-width="modalWidth" :multi="multi" @ok="selectOK" :user-ids="value" @initComp="initComp"/> |
||||
<j-select-user-by-dep-modal |
||||
ref="selectModal" |
||||
:modal-width="modalWidth" |
||||
:multi="multi" |
||||
@ok="selectOK" |
||||
:user-ids="value" |
||||
@initComp="initComp" |
||||
/> |
||||
<!-- :user-ids="value" --> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import JSelectUserByDepModal from './modal/JSelectUserByDepModal' |
||||
import JSelectUserByDepModal from './modal/JSelectUserByDepModal' |
||||
|
||||
export default { |
||||
name: 'JSelectUserByDep', |
||||
components: {JSelectUserByDepModal}, |
||||
props: { |
||||
modalWidth: { |
||||
type: Number, |
||||
default: 1250, |
||||
required: false |
||||
}, |
||||
value: { |
||||
type: String, |
||||
required: false |
||||
}, |
||||
disabled: { |
||||
type: Boolean, |
||||
required: false, |
||||
default: false |
||||
}, |
||||
multi: { |
||||
type: Boolean, |
||||
default: true, |
||||
required: false |
||||
}, |
||||
backUser: { |
||||
type: Boolean, |
||||
default: false, |
||||
required: false |
||||
} |
||||
}, |
||||
data() { |
||||
return { |
||||
userIds: "", |
||||
userNames: "" |
||||
} |
||||
}, |
||||
mounted() { |
||||
this.userIds = this.value |
||||
}, |
||||
watch: { |
||||
value(val) { |
||||
this.userIds = val |
||||
} |
||||
}, |
||||
model: { |
||||
prop: 'value', |
||||
event: 'change' |
||||
}, |
||||
methods: { |
||||
initComp(userNames) { |
||||
this.userNames = userNames |
||||
}, |
||||
//返回选中的用户信息 |
||||
backDeparInfo(){ |
||||
if(this.backUser===true){ |
||||
if(this.userIds && this.userIds.length>0){ |
||||
let arr1 = this.userIds.split(',') |
||||
let arr2 = this.userNames.split(',') |
||||
let info = [] |
||||
for(let i=0;i<arr1.length;i++){ |
||||
info.push({ |
||||
value: arr1[i], |
||||
text: arr2[i] |
||||
}) |
||||
export default { |
||||
name: 'JSelectUserByDep', |
||||
components: { JSelectUserByDepModal }, |
||||
props: { |
||||
modalWidth: { |
||||
type: Number, |
||||
default: 1250, |
||||
required: false, |
||||
}, |
||||
value: { |
||||
type: String, |
||||
required: false, |
||||
}, |
||||
disabled: { |
||||
type: Boolean, |
||||
required: false, |
||||
default: false, |
||||
}, |
||||
multi: { |
||||
type: Boolean, |
||||
default: false, |
||||
required: false, |
||||
}, |
||||
backUser: { |
||||
type: Boolean, |
||||
default: false, |
||||
required: false, |
||||
}, |
||||
}, |
||||
data() { |
||||
return { |
||||
userIds: '', |
||||
userNames: '', |
||||
} |
||||
this.$emit('back', info) |
||||
} |
||||
} |
||||
}, |
||||
onSearchDepUser() { |
||||
this.$refs.selectModal.showModal() |
||||
}, |
||||
selectOK(rows, idstr) { |
||||
console.log("当前选中用户", rows) |
||||
console.log("当前选中用户ID", idstr) |
||||
if (!rows) { |
||||
this.userNames = '' |
||||
this.userIds = '' |
||||
} else { |
||||
let temp = '' |
||||
for (let item of rows) { |
||||
temp += ',' + item.realname |
||||
} |
||||
this.userNames = temp.substring(1) |
||||
this.userIds = idstr |
||||
} |
||||
this.$emit("change", this.userIds) |
||||
} |
||||
}, |
||||
mounted() { |
||||
this.userIds = this.value |
||||
}, |
||||
watch: { |
||||
value(val) { |
||||
this.userIds = val |
||||
}, |
||||
}, |
||||
// model: { |
||||
// prop: 'value', |
||||
// event: 'change', |
||||
// }, |
||||
methods: { |
||||
initComp(userNames) { |
||||
this.userNames = userNames |
||||
}, |
||||
//返回选中的用户信息 |
||||
backDeparInfo() { |
||||
if (this.backUser === true) { |
||||
if (this.userIds && this.userIds.length > 0) { |
||||
let arr1 = this.userIds.split(',') |
||||
let arr2 = this.userNames.split(',') |
||||
let info = [] |
||||
for (let i = 0; i < arr1.length; i++) { |
||||
info.push({ |
||||
value: arr1[i], |
||||
text: arr2[i], |
||||
}) |
||||
} |
||||
this.$emit('back', info) |
||||
} |
||||
} |
||||
}, |
||||
onSearchDepUser() { |
||||
this.$refs.selectModal.showModal() |
||||
}, |
||||
selectOK(rows, idstr) { |
||||
//修改 |
||||
let temp = '' |
||||
console.log('当前选中用户', rows) |
||||
console.log('当前选中用户ID', idstr) |
||||
//修改if(!rows) |
||||
if (!rows && rows.length <= 0) { |
||||
this.userNames = '' |
||||
this.userIds = '' |
||||
} else { |
||||
// let temp = '' |
||||
//修改 |
||||
|
||||
for (let item of rows) { |
||||
// |
||||
console.log(item) |
||||
// temp += item.realname |
||||
console.log(temp) |
||||
//修改 |
||||
temp += ' ' + item.realname |
||||
} |
||||
// this.userNames = temp.substring(1) |
||||
|
||||
this.userNames = temp |
||||
console.log(this.userNames) |
||||
this.userIds = idstr |
||||
console.log(rows) |
||||
} |
||||
this.$emit('change', this.userIds) |
||||
//修改 |
||||
// this.$emit('change', this.userNames) |
||||
this.backDeparInfo() |
||||
}, |
||||
}, |
||||
model: { |
||||
prop: 'userNames', |
||||
event: 'change', |
||||
}, |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped> |
||||
<style scoped></style> |
||||
|
||||
</style> |
@ -0,0 +1,137 @@ |
||||
package org.jeecg.modules.tts; |
||||
|
||||
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; |
||||
|
||||
/** |
||||
* |
||||
*/ |
||||
@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(); |
||||
log.info("{}>> 转换异常:{}", text, e.getMessage()); |
||||
return Result.error(text + "转换异常" + e.getMessage()); |
||||
} |
||||
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("测试语音测试语音测试语音"); |
||||
} |
||||
|
||||
} |
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue