如何把httpsgenshinvoicetopapispeaker=丹恒&text=$content&format=wav&length=1&noise=05&noisew=09&sdp_ratio=02的链接在本页面播放请示例完整代码为什么我无法获取到已经生成的api链接到本地?而后面的代码缺可以使用跨域?链接已确定在远程服务器的api请求成功了为什么不能直接在我的服务器页面使用呢?我要如何不跨
你遇到的问题是由于跨域导致的,浏览器会阻止从一个源加载的资源与另一个源的脚本进行交互。要解决这个问题,你可以在服务器端设置响应头来允许跨域请求,添加Access-Control-Allow-Origin头,并将其值设置为允许访问的域。
对于本地资源,你可以将资源下载到本地,并在页面上直接使用。以下是完整的示例代码:
<!DOCTYPE html>
<html>
<body>
<div class="rightSide">
<div class="header">
<div class="imgText">
<div class="userimg">
<img src="https://ai.3dlingyu.com/wp-content/uploads/2023/08/12345-1.png" class="cover">
</div>
<h4>鹅鹅导航ChatGPT客服<br><span>在线</span></h4>
</div>
</div>
<div id="chatBox" class="chatBox">
<div class="message frnd_message">
<p>欢迎使用鹅鹅导航ChatGPT客服,有什么问题都可以问我。</span><br><span id="time"></span> </p>
</div>
</div>
<div class="chatbox_input">
<div class="chatbox_input_div">
<input id="chatInput" type="text">
<button id="chatbox_input_send" class="chatbox_input_send">发送</button>
</div>
</div>
</div>
<audio id="audioPlayer" controls></audio>
<script>
document.getElementById('time').innerHTML = new Date().toLocaleString();
var defuleValue = ''
function debounce(fn, delay = 2000) {
let timer
let changeDom = document.getElementById('chatbox_input_send');
return function () {
defuleValue = document.getElementById('chatInput').value;
if (timer) {
clearTimeout(timer);
} else {
changeDom.innerHTML = '正在询问';
changeDom.disabled = true;
document.getElementById('chatInput').value = "";
}
timer = setTimeout(() => {
fn.apply(this, arguments);
timer = null;
}, delay);
}
}
document.getElementById('chatbox_input_send').addEventListener('click', debounce(() => {
this.handleSend(defuleValue);
}));
document.getElementById('chatInput').addEventListener('keydown', function (event) {
if (event.keyCode == "13") {
document.getElementById('chatbox_input_send').click();
}
});
function handleSend(inputValue) {
let inputDom = document.getElementById('chatBox');
if (!inputValue.length) {
alert('请输入您的问题!');
document.getElementById('chatbox_input_send').innerHTML = '发送';
document.getElementById('chatbox_input_send').disabled = false;
defuleValue = "";
return;
}
inputDom.innerHTML = inputDom.innerHTML + '<div class="message my_message"><p>' + inputValue +
'</span><br><span>' + new Date().toLocaleString() + '</span> </p></div>';
const params = {
model: 'rwkv',
messages: [{
role: 'user',
content: inputValue
}],
stream: false,
max_tokens: 200,
temperature: 0.1,
top_p: 0.7,
presence_penalty: 0.7,
frequency_penalty: 0.2,
user_name: "User",
assistant_name: "Assistant",
};
let xhr = new XMLHttpRequest();
xhr.open('POST', `https://rwkv.ai-creator.net/chntuned/v1/chat/completions`);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify(params));
xhr.onload = function () {
let res = JSON.parse(xhr.response);
let content = res.choices[0].message.content;
let audioUrl = `https://genshinvoice.top/api?speaker=丹恒&text=${content}&format=wav&length=1&noise=0.5&noisew=0.9&sdp_ratio=0.2`;
let audioXhr = new XMLHttpRequest();
audioXhr.open('GET', audioUrl);
audioXhr.responseType = 'blob';
audioXhr.onload = function () {
var audioPlayer = document.getElementById('audioPlayer');
audioPlayer.src = URL.createObjectURL(audioXhr.response);
};
audioXhr.send();
inputDom.innerHTML = inputDom.innerHTML +
'<div class="message frnd_message"><p>' + content + '</span><br><span>' +
new Date().toLocaleString() +
'</span> </p></div>';
document.getElementById('chatbox_input_send').innerHTML = '发送';
document.getElementById('chatbox_input_send').disabled = false;
defuleValue = "";
}
}
</script>
</body>
</html>
这个示例将使用XMLHttpRequest来获取远程服务器上的音频文件,并在页面上播放。
对于你提到的为什么下面的代码可以跨域调用,可能是因为你在远程服务器上设置了允许跨域请求的响应头Access-Control-Allow-Origin,所以可以在你的本地服务器上调用它。
原文地址: https://www.cveoy.top/t/topic/i2J5 著作权归作者所有。请勿转载和采集!