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> |
<template> |
||||||
<div> |
<div> |
||||||
<a-input-search |
<!-- <a-input |
||||||
v-model="userNames" |
v-model="userNames" |
||||||
placeholder="请先选择用户" |
placeholder="请点击选择用户" |
||||||
readOnly |
readOnly |
||||||
unselectable="on" |
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-button slot="enterButton" :disabled="disabled">选择用户</a-button> |
||||||
</a-input-search> |
</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> |
</div> |
||||||
</template> |
</template> |
||||||
|
|
||||||
<script> |
<script> |
||||||
import JSelectUserByDepModal from './modal/JSelectUserByDepModal' |
import JSelectUserByDepModal from './modal/JSelectUserByDepModal' |
||||||
|
|
||||||
export default { |
export default { |
||||||
name: 'JSelectUserByDep', |
name: 'JSelectUserByDep', |
||||||
components: {JSelectUserByDepModal}, |
components: { JSelectUserByDepModal }, |
||||||
props: { |
props: { |
||||||
modalWidth: { |
modalWidth: { |
||||||
type: Number, |
type: Number, |
||||||
default: 1250, |
default: 1250, |
||||||
required: false |
required: false, |
||||||
}, |
}, |
||||||
value: { |
value: { |
||||||
type: String, |
type: String, |
||||||
required: false |
required: false, |
||||||
}, |
}, |
||||||
disabled: { |
disabled: { |
||||||
type: Boolean, |
type: Boolean, |
||||||
required: false, |
required: false, |
||||||
default: false |
default: false, |
||||||
}, |
}, |
||||||
multi: { |
multi: { |
||||||
type: Boolean, |
type: Boolean, |
||||||
default: true, |
default: false, |
||||||
required: false |
required: false, |
||||||
}, |
}, |
||||||
backUser: { |
backUser: { |
||||||
type: Boolean, |
type: Boolean, |
||||||
default: false, |
default: false, |
||||||
required: false |
required: false, |
||||||
} |
}, |
||||||
}, |
}, |
||||||
data() { |
data() { |
||||||
return { |
return { |
||||||
userIds: "", |
userIds: '', |
||||||
userNames: "" |
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] |
|
||||||
}) |
|
||||||
} |
} |
||||||
this.$emit('back', info) |
}, |
||||||
} |
mounted() { |
||||||
} |
this.userIds = this.value |
||||||
}, |
}, |
||||||
onSearchDepUser() { |
watch: { |
||||||
this.$refs.selectModal.showModal() |
value(val) { |
||||||
}, |
this.userIds = val |
||||||
selectOK(rows, idstr) { |
}, |
||||||
console.log("当前选中用户", rows) |
}, |
||||||
console.log("当前选中用户ID", idstr) |
// model: { |
||||||
if (!rows) { |
// prop: 'value', |
||||||
this.userNames = '' |
// event: 'change', |
||||||
this.userIds = '' |
// }, |
||||||
} else { |
methods: { |
||||||
let temp = '' |
initComp(userNames) { |
||||||
for (let item of rows) { |
this.userNames = userNames |
||||||
temp += ',' + item.realname |
}, |
||||||
} |
//返回选中的用户信息 |
||||||
this.userNames = temp.substring(1) |
backDeparInfo() { |
||||||
this.userIds = idstr |
if (this.backUser === true) { |
||||||
} |
if (this.userIds && this.userIds.length > 0) { |
||||||
this.$emit("change", this.userIds) |
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> |
</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