在快节奏的现代生活中,听写技能仍然是学习语言和提升认知能力的重要环节。然而,传统的听写练习往往枯燥乏味,且效率不高。现在,随着人工智能技术的发展,大模型听写工具的问世,为传统听写带来了革命性的变革。
大模型听写利用先进的语音识别技术,能够实时准确地将口语转换为文字,不仅提高了听写的准确率,还极大地提升了效率。与传统听写相比,大模型听写具有以下显著优势:
-
高效率:传统听写需要手动记录每一个单词,而大模型听写可以自动完成这一过程,节省了大量时间。
-
高准确性:人工智能算法能够准确识别不同的口音和语速,减少了人为错误。
-
个性化学习:大模型听写可以根据用户的学习进度和需求,提供个性化的听写材料和反馈。
-
互动性强:许多大模型听写工具配备了互动功能,如语音评估、即时反馈等,使学习过程更加生动有趣。
-
随时随地学习:只需一部智能手机或电脑,就可以随时随地进行听写练习,突破了时间和空间的限制。
-
数据追踪与分析:大模型听写工具可以记录用户的学习数据,帮助用户了解自己的学习进度和薄弱环节,从而更有针对性地进行复习。
-
多语言支持:对于多语言学习者来说,大模型听写支持多种语言的听写练习,是提升外语听力和写作能力的理想选择。
-
环境友好:数字化的听写练习减少了纸张的使用,更加环保。
-
易于分享与合作:用户可以将自己的听写结果轻松分享给他人,或者与他人在线合作完成听写任务。
-
持续更新与优化:随着技术的不断进步,大模型听写工具会持续更新和优化,为用户提供更好的学习体验。
总之,大模型听写以其高效、准确、便捷的特点,正在逐渐取代传统听写,成为现代人提升语言能力和认知水平的新选择。无论你是学生、教师还是终身学习者,都可以从大模型听写中受益,让学习变得更加轻松愉快。
<template>
<div class="Mult-container" style="padding: 10px;margin-bottom:50px; ">
<!--聊天窗口开始 -->
<div style="height: 150px;">
<textarea v-model="text"
style="height: 460px;width: 100%;padding: 20px; border: none;border-top: 1px solid #ccc;border-bottom: 1px solid #ccc;outline: none">
</textarea>
</div>
<div style="text-align: left;padding-right: 10px;margin-top: 340px;">
<el-button type="primary" size="medium" @click="voiceSend"><i class="el-icon-microphone"></i>多语转文字
</el-button>
<el-button type="danger" size="medium" @click="stopVoice">停止朗读
</el-button>
</div>
</div>
</template>
<script>
// 初始化录音工具,注意目录
let recorder = new Recorder("../../recorder")
recorder.onStart = () => {
console.log("开始录音了")
}
recorder.onStop = () => {
console.log("结束录音了")
}
// 发送中间帧和最后一帧
recorder.onFrameRecorded = ({isLastFrame, frameBuffer}) => {
if (!isLastFrame && wsFlag) { // 发送中间帧
const params = {
"header": {
"status": 1,
"app_id": ""
},
"payload": {
"audio": {
"audio": toBase64(frameBuffer),
"sample_rate": 16000,
"encoding": "raw"
}
}
}
wsTask.send(JSON.stringify(params)) // 执行发送
} else {
if (wsFlag) {
const params = {
"header": {
"status": 2,
"app_id": ""
},
"payload": {
"audio": {
"audio": "",
"sample_rate": 16000,
"encoding": "raw"
}
}
}
console.log("发送最后一帧", params, wsFlag)
wsTask.send(JSON.stringify(params)) // 执行发送
}
}
}
function toBase64(buffer) {
let binary = "";
let bytes = new Uint8Array(buffer);
let len = bytes.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
};
let wsFlag = false;
let wsTask = {};
export default {
name: "Mult",
data() {
return {
user: localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : {}, // 获取本地存储用户
text: "",
URL: 'wss://iat.cn-huabei-1.xf-yun.com/v1', // 听写地址
resultText: "",
resultTextTemp: "",
}
},
methods: {
async stopVoice() {
if (await this.consumeBalance(this.user, "停止朗读")) {
// 执行具体能力
recorder.stop();
this.$message.success("录音朗读停止!")
}
},
async voiceSend() { // 开始语音识别要做的动作
if (await this.consumeBalance(this.user, "多语转文字")) {
// 执行具体能力
this.resultText = "";
this.resultTextTemp = "";
await this.wsInit();
}
}
,
// 建立ws连接
async wsInit() {
// this.iat = "";
this.$message.success("请您说出语音内容~")
let _this = this;
if (typeof (WebSocket) == 'undefined') {
console.log('您的浏览器不支持ws...')
} else {
console.log('您的浏览器支持ws!!!')
let reqeustUrl = await _this.getWebSocketUrl()
wsTask = new WebSocket(reqeustUrl);
// ws的几个事件,在vue中定义
wsTask.onopen = function () {
console.log('ws已经打开...')
wsFlag = true
let params = {
"header": {
"status": 0,
"app_id": atob(_this.user.appid),
},
"parameter": {
"iat": {
"domain": "slm",
"language": "mul_cn",
"accent": "mandarin",
"result": {
"encoding": "utf8",
"compress": "raw",
"format": "json"
}
}
},
"payload": {
"audio": {
"audio": "",
"sample_rate": 16000,
"encoding": "raw"
}
}
}
console.log("发送第一帧数据...")
wsTask.send(JSON.stringify(params)) // 执行发送
// 下面就可以循环发送中间帧了
// 开始录音
console.log("开始录音")
recorder.start({
sampleRate: 16000,
frameSize: 1280,
});
}
wsTask.onmessage = function (message) { // 调用第二个API 自动把语音转成文本
console.log('收到数据===' + JSON.stringify(message.data))
let parsedMessage = JSON.parse(message.data);
let code = parsedMessage.header.code;
let status = parsedMessage.header.status;
if (code !== 0) {
console.log(`请求错误:${code}`);
recorder.stop();
wsTask.close();
wsFlag = false
} else {
let payload = parsedMessage.payload;
if (payload) {
let text = payload.result.text;
let decodedString = atob(text);
let bytes = new Uint8Array(decodedString.length);
for (let i = 0; i < decodedString.length; i++) {
bytes[i] = decodedString.charCodeAt(i);
}
let decoder = new TextDecoder('utf-8');
let utf8String = decoder.decode(bytes);
console.log(utf8String)
let utf8JsonObject = JSON.parse(utf8String)
let textWs = utf8JsonObject.ws;
textWs.forEach(i => {
i.cw.forEach(j => {
_this.resultTextTemp = j.w;
_this.resultText += _this.resultTextTemp;
});
});
console.log(_this.resultText);
_this.text = _this.resultText || "";
}
if (status === 2) {
recorder.stop();
wsTask.close();
wsFlag = false
}
}
}
// 关闭事件
wsTask.onclose = function () {
console.log('ws已关闭...')
}
wsTask.onerror = function () {
console.log('发生错误...')
}
}
}
,
// 获取鉴权地址与参数
getWebSocketUrl() {
return new Promise((resolve, reject) => {
// 请求地址根据语种不同变化
var url = this.URL;
var host = this.URL.host;
var apiKeyName = "api_key";
var date = new Date().toGMTString();
var algorithm = "hmac-sha256";
var headers = "host date request-line";
var signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v1 HTTP/1.1`;
var signatureSha = CryptoJS.HmacSHA256(signatureOrigin, atob(this.user.apisecret));
var signature = CryptoJS.enc.Base64.stringify(signatureSha);
var authorizationOrigin =
`${apiKeyName}="${atob(this.user.apikey)}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`;
var authorization = base64.encode(authorizationOrigin);
url = `${url}?authorization=${authorization}&date=${encodeURI(date)}&host=${host}`;
console.log(url)
resolve(url); // 主要是返回地址
});
}
}
}
</script>
<!--scoped 不能加-->
<style>
</style>