中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

做簡(jiǎn)圖的網(wǎng)站網(wǎng)絡(luò)營(yíng)銷專業(yè)代碼

做簡(jiǎn)圖的網(wǎng)站,網(wǎng)絡(luò)營(yíng)銷專業(yè)代碼,boombox wordpress,wordpress ssl插件主要的功能就是將文本轉(zhuǎn)為語音,可以播放。 看了看官方提供的demo,嗯....沒看懂。最后還是去網(wǎng)上找的。 網(wǎng)上提供的案例,很多都是有局限性的,我找的那個(gè)他只能讀取第一段數(shù)據(jù),剩下的不讀取。 科大訊飛的接口&#xf…

主要的功能就是將文本轉(zhuǎn)為語音,可以播放。

看了看官方提供的demo,嗯....沒看懂。最后還是去網(wǎng)上找的。

網(wǎng)上提供的案例,很多都是有局限性的,我找的那個(gè)他只能讀取第一段數(shù)據(jù),剩下的不讀取。

科大訊飛的接口,返回的是一個(gè)數(shù)組,因?yàn)樾枰铣傻奈谋径?#xff0c;所以將數(shù)據(jù)切割成多份,然后返回的。

例子:

封裝了個(gè)方法,直接調(diào)用方法就可以了。

import CryptoJS from 'crypto-js';
import { Base64 } from 'js-base64';
import { message } from 'ant-design-vue';let APPID = '';
let API_SECRET = '';
let API_KEY = '';// 正確的URL
function getWebSocketUrl(apiKey, apiSecret) {let url = 'wss://tts-api.xfyun.cn/v2/tts';const host = 'tts-api.xfyun.cn';const date = new Date().toGMTString();const algorithm = 'hmac-sha256';const headers = 'host date request-line';const signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v2/tts HTTP/1.1`;const signatureSha = CryptoJS.HmacSHA256(signatureOrigin, apiSecret);const signature = CryptoJS.enc.Base64.stringify(signatureSha);const authorizationOrigin = `api_key="${apiKey}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`;const authorization = btoa(authorizationOrigin);url = `${url}?authorization=${authorization}&date=${date}&host=${host}`;return url;
}// 文本編碼
function encodeText(text, encoding) {switch (encoding) {case 'utf16le': {const buf = new ArrayBuffer(text.length * 4);const bufView = new Uint16Array(buf);// eslint-disable-next-line no-plusplusfor (let i = 0, strlen = text.length; i < strlen; i++) {bufView[i] = text.charCodeAt(i);}return buf;}case 'buffer2Base64': {let binary = '';const bytes = new Uint8Array(text);const len = bytes.byteLength;// eslint-disable-next-line no-plusplusfor (let i = 0; i < len; i++) {binary += String.fromCharCode(bytes[i]);}return window.btoa(binary);}case 'base64&utf16le': {return this.encodeText(this.encodeText(text, 'utf16le'), 'buffer2Base64');}default: {return Base64.encode(text);}}
}// eslint-disable-next-line no-shadow
function TextToSpeechConfig(APPID, vcn, speed, volume, pitch, tte, text) {// 私有方法:生成參數(shù)對(duì)象function generateParams() {return {common: {app_id: APPID,},business: {aue: 'lame',auf: 'audio/L16;rate=16000',sfl: 1,vcn,speed,volume,pitch,bgs: 1,tte,},data: {status: 2,text: encodeText(text, tte === 'unicode' ? 'base64&utf16le' : ''), // 假設(shè) encodeText 是一個(gè)已定義的函數(shù)},};}// 公共方法,暴露給外部調(diào)用以獲取參數(shù)對(duì)象return generateParams();
}export default class TTSWSS {static _instance; // 使用下劃線表示這是一個(gè)內(nèi)部使用的屬性text = '';vcn = '';speed = '';volume = '';pitch = '';tte = 'UTF8';ttsWS = null;static getInstance(text, vcn, speed, volume, pitch) { // 單例模式// if (!TTSWSS._instance) {//   TTSWSS._instance = new TTSWSS(text, vcn, speed, volume, pitch);// }TTSWSS._instance = new TTSWSS(text, vcn, speed, volume, pitch);return TTSWSS._instance;}constructor(text, vcn, speed, volume, pitch) {this.text = text;this.vcn = vcn;this.speed = speed;this.volume = volume;this.pitch = pitch;const url = getWebSocketUrl(API_KEY, API_SECRET);if ('WebSocket' in window) { // 構(gòu)造函數(shù)時(shí)就創(chuàng)建websocket對(duì)象this.ttsWS = new WebSocket(url);} else if ('MozWebSocket' in window) {this.ttsWS = new WebSocket(url);} else {// alert('瀏覽器不支持WebSocket');message.error('瀏覽器不支持WebSocket');}}setText(text) {this.text = text;}setTextVCN(vcn) {this.vcn = vcn;}setSpeed(speed) {this.speed = speed;}setVolume(volume) {this.volume = volume;}// setTte(istte=false){//   this.tte = istte==true ? "unicode" : "UTF8"// }connectWebSocket() {this.ttsWS.onopen = () => {// console.log(TextToSpeechConfig(APPID, this.vcn, this.speed, this.volume, this.pitch, this.tte, this.text), '請(qǐng)求參數(shù)');this.ttsWS.send(JSON.stringify(TextToSpeechConfig(APPID, this.vcn, this.speed, this.volume, this.pitch, this.tte, this.text)));};this.ttsWS.onerror = () => {// console.error(e);};this.ttsWS.onclose = () => {// console.log(e);};}disconnectWebSocket() {TTSWSS._instance = null;this.ttsWS.close(); // 關(guān)閉 WebSocket 連接this.ttsWS = null; // 清空 WebSocket 對(duì)象// console.log('WebSocket disconnected');}send_newMessage = text => {const params = {common: {app_id: APPID,},business: {aue: 'lame',sfl: 1,auf: 'audio/L16;rate=16000',vcn: this.vcn,speed: this.speed,volume: this.volume,pitch: this.pitch,bgs: 1,tte: 'UTF8',},data: {status: 2,text: encodeText(text, this.tte === 'unicode' ? 'base64&utf16le' : ''),},};this.ttsWS.send(JSON.stringify(params));};getMessage() {const that = this.ttsWS;const messages = []; // 用于存儲(chǔ)所有消息return new Promise((resolve, reject) => {that.onmessage = e => {const jsonData = JSON.parse(e.data);// 合成失敗if (jsonData.code !== 0) {// eslint-disable-next-line prefer-promise-reject-errorsreject({ message: '失敗', data: jsonData });return; // 退出當(dāng)前處理}// 存儲(chǔ)成功的消息messages.push({message: '成功',type: 'base64',data: jsonData.data.audio,isLastData: jsonData.data.status === 2,});// 如果接收到最后一條數(shù)據(jù),解析所有消息并關(guān)閉連接if (jsonData.data.status === 2) {that.close();resolve(messages); // 返回所有消息}};});}TTS_close_reset() {this.ttsWS?.close();// audioPlayer.reset();}static resetInstance() {TTSWSS._instance = null; // 清空實(shí)例// console.log('TTSWSS instance has been reset.');}
}
export function setConfig(params) {APPID = params?.APPID;API_SECRET = params?.APISecret;API_KEY = params?.APIKey;
}

?使用:

import TTWss from '@/utils/voice/index.js';const audio_url = ref('');
const ttsinstance = ref(null); // 初始化為 null
const voiceLoading = ref(false); // 加載音頻中function playVoice() {voiceLoading.value = true;ttsinstance?.value?.disconnectWebSocket();ttsinstance.value = null;audio_url.value = null; // 清空音頻 URLconst { text } = props; // 這里是要轉(zhuǎn)成語音的文字,我這個(gè)是寫在組件里面的用props接收的,所以要這樣寫,到時(shí)候替換成自己要合成的文字就行// 創(chuàng)建 TTS 實(shí)例ttsinstance.value = TTWss.getInstance(text, 'xiaoyan', 50, 50, 50);// 連接 WebSocketttsinstance.value.connectWebSocket();// 獲取消息ttsinstance.value.getMessage().then(result => {// 這里需要特殊處理,因?yàn)榉祷氐臄?shù)據(jù)是數(shù)組,所以要先將數(shù)組中的數(shù)據(jù)拿出來,放在每項(xiàng)里面的data中,然將不要先拼接,而是要先解碼,然后將解碼后的數(shù)據(jù)在拼接起來,這樣就是一整段完整的錄音文件了。const allData = result.map(it => atob(it.data));const binaryString = allData.join('');const len = binaryString.length;const bytes = new Uint8Array(len);for (let i = 0; i < len; i++) {bytes[i] = binaryString.charCodeAt(i);}const blob = new Blob([bytes], { type: 'audio/mp3' }); // 根據(jù)音頻格式修改MIME類型const url = URL.createObjectURL(blob);audio_url.value = url; // 將生成的 URL 賦值給 audio_url// 這里展開后可以直接下載// const aTag = document.createElement('a');// aTag.href = url;// aTag.download = 'audio_file_name.mp3'; // 設(shè)置文件名// aTag.style.display = 'none';// document.body.appendChild(aTag);// aTag.click();// document.body.removeChild(aTag);// 播放音頻playItem(url);voiceLoading.value = false;}).catch(err => {// console.log('失敗', err);message.error(err);voiceLoading.value = false;});
}let currentAudio = null;
function playItem(url) {// 如果當(dāng)前有音頻在播放,則停止它if (currentAudio) {currentAudio.pause();currentAudio.currentTime = 0; // 可選:重置播放時(shí)間}currentAudio = new Audio(url);currentAudio.play().then(() => {// console.log('音頻播放開始');}).catch(error => {// console.error('音頻播放失敗', error);message.error(error);});// 釋放對(duì)象URL(可選)currentAudio.addEventListener('ended', () => {URL.revokeObjectURL(url);currentAudio = null; // 音頻結(jié)束后清空實(shí)例});
}

HTML:

<img:src="PlayVoice"alt=""class="icon-img"@click.stop="playVoice"/>

http://www.risenshineclean.com/news/41412.html

相關(guān)文章:

  • 一個(gè)公司設(shè)計(jì)網(wǎng)站怎么做近三天發(fā)生的大事
  • 網(wǎng)站建設(shè)最新教程網(wǎng)絡(luò)營(yíng)銷外包收費(fèi)
  • 網(wǎng)站優(yōu)化三要素視頻推廣平臺(tái)
  • 小程序 網(wǎng)站 開發(fā)廈門百度推廣開戶
  • 深圳建站推廣公司b站視頻推廣網(wǎng)站
  • 河南省建設(shè)監(jiān)理協(xié)會(huì)網(wǎng)站網(wǎng)站推廣的途徑和方法
  • 著名的國(guó)外設(shè)計(jì)網(wǎng)站廣州優(yōu)化防控措施
  • 網(wǎng)站開發(fā)如何讓圖片加載的更快第一推廣網(wǎng)
  • 做網(wǎng)站對(duì)客戶有什么幫助外包網(wǎng)絡(luò)推廣公司
  • wap網(wǎng)站適配競(jìng)價(jià)托管外包
  • 微信小程序是免費(fèi)的嗎seo工程師是什么職業(yè)
  • 怎么用網(wǎng)站后臺(tái)做輪播圖打開百度網(wǎng)站
  • 廣州哪家做網(wǎng)站價(jià)格好百度熱搜榜排名
  • 六安網(wǎng)站推廣獲客app第一接單網(wǎng)app地推和拉新
  • wex5 wordpressseo整站優(yōu)化公司持續(xù)監(jiān)控
  • 專業(yè)網(wǎng)站設(shè)計(jì)服務(wù)seo關(guān)鍵字優(yōu)化軟件
  • 企業(yè)網(wǎng)站做seo輿情報(bào)告范文
  • 寧波北侖網(wǎng)站建設(shè)上海seo外包
  • 建網(wǎng)站域名注冊(cè)后需要網(wǎng)絡(luò)營(yíng)銷所學(xué)課程
  • 專業(yè)做域名的網(wǎng)站線上營(yíng)銷平臺(tái)
  • 張家港網(wǎng)站建設(shè)門店推廣下載app賺錢
  • 武漢企業(yè)做網(wǎng)站找哪家好收錄排名好的發(fā)帖網(wǎng)站
  • 清河做網(wǎng)站哪家好怎么請(qǐng)專業(yè)拓客團(tuán)隊(duì)
  • 網(wǎng)站開發(fā)員鄭州seo培訓(xùn)班
  • 做網(wǎng)站哪家公司比較好網(wǎng)站流量排行
  • 武漢做商城網(wǎng)站建設(shè)寧波seo排名優(yōu)化哪家好
  • 廣州網(wǎng)站關(guān)鍵詞排名鄭州網(wǎng)站關(guān)鍵詞排名技術(shù)代理
  • 緊抓政府網(wǎng)站集約化建設(shè)免費(fèi)網(wǎng)站注冊(cè)com
  • dede古典網(wǎng)站模板什么關(guān)鍵詞能搜到資源
  • 怎樣做網(wǎng)站首頁圖片變換網(wǎng)店?duì)I銷策劃方案