Suno Api V4模型无水印开发「综合实战开发自己的音乐网站」 —— 「Suno Api系列」第14篇

历史文章

Suno AI API接入 - 将AI音乐接入到自己的产品中,支持120并发任务

Suno Api V4模型无水印开发「灵感模式」 —— 「Suno Api系列」第1篇

Suno Api V4模型无水印开发「自定义模式」 —— 「Suno Api系列」第2篇

Suno Api V4模型无水印开发「AI生成歌词」 —— 「Suno Api系列」第3篇

Suno Api V4模型无水印开发「续写」 —— 「Suno Api系列」第4篇

Suno Api V4模型无水印开发「获取整首歌」 —— 「Suno Api系列」第5篇

Suno Api V4模型无水印开发「高清音频WAV下载」 —— 「Suno Api系列」第6篇

Suno Api V4模型无水印开发「人声伴奏分离」 —— 「Suno Api系列」第7篇

Suno Api V4模型无水印开发「人声伴奏分离 – 自定义音频」 —— 「Suno Api系列」第8篇

Suno Api V4模型无水印开发「人声伴奏分离 – 网络地址」 —— 「Suno Api系列」第9篇

Suno Api V4模型无水印开发「视频封面编辑」 —— 「Suno Api系列」第10篇

Suno Api V4模型无水印开发「上传参考音频 - 方式一:通过二进制流的方式」 —— 「Suno Api系列」第11篇

Suno Api V4模型无水印开发「上传参考音频 - 方式二:通过URL的方式」 —— 「Suno Api系列」第12篇

Suno Api V4模型无水印开发「分页获取音乐列表」 —— 「Suno Api系列」第13篇

导读

讲了这么多节的Suno API接口,最后还是来实现一下做一个简单的音乐网站。

具体的一个基本效果如下:

一、准备工作

在动手之前,我们需要确保已经准备好了必要的环境和工具:

Vue和Node.js环境:确保你的开发环境中已经配置好了Vue和Node.js,这将是我们构建前端和后端的基础。

文本编辑器或IDE:选择你熟悉和喜欢的文本编辑器,如VS Code、Sublime Text等。

Suno AI音乐API密钥:这是我们生成音乐所需的关键。

申请和使用

「已经有API的,可以跳过此步骤」

要使用Suno AI API,首先可以先登录到站点:

https://suno4.cn/#/?i=8NCBS8_WXTT

点击头像昵称旁边的… ,点击API接入

然后获取请求所需要的凭证:

如果你尚未登录或注册,会自动跳转到登录页面邀请您来注册和登录,登录注册之后会自动返回当前页面。

接口文档

接口文档地址:

https://doc.apipost.net/docs/3769af043c83000?locale=zh-cn

好了,现在,我们获得了Suno API,下面就可以来快速的搭建AI音乐生成平台了。

二、搭建前端和后端

1. 创建Vue项目

为了更清晰地组织前端和后端代码,我们将项目目录结构分为两个主要部分:frontend和backend。以下是具体的目录结构和说明:

suno-music-site/

├── backend/

│ ├── node_modules/

│ ├── package.json

│ ├── package-lock.json

│ └── server.js

├── frontend/

│ ├── node_modules/

│ ├── public/

│ ├── src/

│ │   ├── assets/

│ │   ├── components/

│ │   ├── App.vue

│ │   ├── main.js

│ ├── package.json

│ ├── package-lock.json

│ └── vue.config.js

└── README.md

创建一个 suno-music-site 目录。

2. 创建后端

创建后端目录和文件,在项目根目录下创建 backend 目录,并进入该目录:

mkdir backend

cd backend

初始化Node.js项目

在backend目录下初始化Node.js项目:

npm init -y

安装Express和其他依赖

安装Express和所需的依赖包:

npm install express body-parser node-fetch

创建server.js

在backend目录下创建server.js文件,并添加以下代码:

const express = require('express');const bodyParser = require('body-parser');const fetch = require('node-fetch').default; // 使用CommonJS版本的node-fetchconst cors = require('cors'); // 引入cors中间件const app = express();const PORT = 3000;app.use(cors()); // 使用cors中间件app.use(bodyParser.json());app.post('/generate-music', async (req, res) => {  const { prompt } = req.body;  const options = {    method: "post",    headers: {      "accept": "application/json",      "authorization": "Bearer xxxxxxxxxxx",      "content-type": "application/json"    },    body: JSON.stringify({      "prompt": prompt    })  };  try {    const response = await fetch("https://xxx.xxx.xxx/_open/suno/music/generate", options);    const data = await response.json();            res.json(data);  } catch (error) {    console.error(error);    res.status(500).json({ error: 'An error occurred' });  }});app.listen(PORT, () => {  console.log(`Server is running on http://localhost:${PORT}`);});

3. 创建前端

回到项目根目录,创建frontend目录,并进入该目录:

cd ..

mkdir frontend

cd frontend

创建Vue项目

使用Vue CLI创建Vue项目:

vue create .

选择默认配置或根据你的需要进行配置。

编写前端代码

我们创建一个简单的界面来接收用户输入并显示生成的音乐。

在frontend/src目录下,修改App.vue文件,添加以下代码:

<template>  <div id="app">    <header>      <h1>AI Music Generator</h1>    </header>    <main>      <div class="input-container">        <input type="text" v-model="musicTitle" placeholder="Enter a prompt for the music">        <button @click="handleGenerateMusic" :disabled="loading">生成音乐</button>      </div>            <div v-if="loading" class="loading">        Music is being generated for you, please wait...      </div>      <div v-if="musicGenerated" class="music-container">        <div v-for="music in generatedMusic" :key="music.id" class="music-item">          <h2>{{ music.title }}</h2>          <img :src="music.image_url" alt="Music Image">          <p class="lyric">{{ music.lyric }}</p>          <audio controls class="audio" @play="stopOtherMedia($event)">            <source :src="music.audio_url" type="audio/mpeg">            Your browser does not support the audio element.          </audio>          <video controls class="video" @play="stopOtherMedia($event)">            <source :src="music.video_url" type="video/mp4">            Your browser does not support the video element.          </video>        </div>      </div>      <div v-if="showModal" class="modal">        <div class="modal-content">          <p>{{ modalMessage }}</p>        </div>      </div>    </main>  </div></template><script>import axios from 'axios';export default {  data() {    return {      musicTitle: '',      musicGenerated: false,      generatedMusic: [],      loading: false,      currentPlayingMedia: null,      showModal: false,      modalMessage: ''    };  },  mounted() {    document.title = "XiaoZhi AI Music Generator";  },  methods: {    handleGenerateMusic() {      if (!this.musicTitle) {        this.showModalMessage('请输入生成音乐的提示语');        return;      }      this.generateMusic();    },    generateMusic() {      this.loading = true;      this.musicGenerated = false;      axios.post('http://localhost:3000/generate-music', { prompt: this.musicTitle })        .then(response => {          this.loading = false;          this.musicGenerated = true;          this.generatedMusic = response.data.data;        })        .catch(error => {          this.loading = false;          console.error('Error generating music:', error);        });    },    stopOtherMedia(event) {      if (this.currentPlayingMedia && this.currentPlayingMedia !== event.target) {        this.currentPlayingMedia.pause();        this.currentPlayingMedia.currentTime = 0;      }      this.currentPlayingMedia = event.target;    },    showModalMessage(message) {      this.modalMessage = message;      this.showModal = true;      setTimeout(() => {        this.showModal = false;      }, 2000);    }  }}</script><style scoped>#app {  font-family: Avenir, Helvetica, Arial, sans-serif;  text-align: center;  color: #2c3e50;  margin-top: 60px;}header {  background-color: #42b983;  padding: 20px;  color: white;}main {  margin: 20px;  max-width: 80%;  margin: 20px auto;}.input-container {  display: flex;  flex-direction: row;  justify-content: center;  align-items: center;  margin-bottom: 20px;}input[type="text"] {  padding: 7px;  margin-right: 10px;  font-size: 1em;  flex: 1;  max-width: 600px;}button {  padding: 8px 20px;  background-color: #007bff;  color: #fff;  border: none;  cursor: pointer;  font-size: 1em;  border-radius: 4px;}button:disabled {  background-color: #d3d3d3;  cursor: not-allowed;}button:hover:not(:disabled) {  background-color: #0056b3;}.loading {  font-size: 1.2em;  color: #42b983;  margin-top: 20px;}.music-container {  display: flex;  flex-wrap: wrap;  gap: 20px;}.music-item {  flex: 1;  min-width: 300px;  max-width: 45%;  margin-top: 20px;  padding: 20px;  border: 1px solid #ddd;  border-radius: 8px;  background-color: #f9f9f9;  text-align: left;}.lyric {  font-size: 1.2em;  margin: 10px 0;  white-space: pre-line;}.audio {  width: 100%;  margin-top: 10px;}.video {  width: 100%;  height: auto;  margin-top: 10px;}.modal {  position: fixed;  top: 0;  left: 0;  width: 100%;  height: 100%;  display: flex;  justify-content: center;  align-items: center;  background-color: rgba(0, 0, 0, 0.5);}.modal-content {  background-color: white;  padding: 20px;  border-radius: 5px;  text-align: center;  font-size: 1.2em;}@media (max-width: 600px) {  .input-container {    flex-direction: column;  }    input[type="text"] {    margin-right: 0;    margin-bottom: 10px;    max-width: 100%;           }  .music-item {    max-width: 100%;  }}@media (min-width: 601px) {  .video {    width: 100%;    margin: 10px auto;  }}</style>

4. 解决跨域问题

在你的项目运行中,可能会出现跨域请求的问题,我们需要解决它。

你可以在现有的 vue.config.js 文件中添加开发服务器代理配置,以解决跨域问题。以下是修改后的 vue.config.js 文件内容:

const { defineConfig } = require('@vue/cli-service')module.exports = defineConfig({  transpileDependencies: true,  devServer: {    proxy: {      '/generate-music': {        target: 'http://localhost:3000',        changeOrigin: true      }    }  }})

这样配置后,当前端发起请求到/generate-music时,代理服务器会将请求转发到运行在 http://localhost:3000 的后端服务,从而解决跨域问题。

如果还无法解决的话,你可能还需要处理一下。由于浏览器安全策略的限制,前端和后端运行在不同的域(例如,localhost 和 192.168.0.235)时,浏览器会阻止跨域请求。我们需要在后端服务器中设置适当的CORS头信息来允许跨域请求。

你可以使用 cors 中间件来解决这个问题。

安装 cors 包:

npm install cors

在 server.js 文件中引入并使用 cors 中间件:

这样,后端服务器将允许来自所有来源的请求。如果你想限制特定来源的请求,可以这样配置 cors 中间件:

app.use(cors({  origin: 'http://192.168.20.235:8081' // 允许的前端URL}));

这样应该能解决CORS问题,并允许前端正常调用后端API。

如果Node.js 无法直接使用 ES 模块(ES Module)加载 node-fetch,因 node-fetch 是一个 ES 模块。解决这个问题的一种方法是将 node-fetch 替换为一个可以在 CommonJS 环境中使用的版本。

你可以安装 node-fetch 的 CommonJS 版本,并修改 server.js 文件中的引入方式。

首先,删除项目中已安装的 node-fetch:

npm uninstall node-fetch

安装 node-fetch 的 CommonJS 版本:

npm install node-fetch@2

在 server.js 文件中,将引入方式修改为动态引入(dynamic import),上面的代码已经修改好了。

三. 运行项目

启动后端服务

在backend目录下,启动后端服务:

node server.js

启动前端服务

在frontend目录下,启动前端服务:

npm run serve

打开浏览器,访问http://localhost:8080(Vue CLI默认端口),你将看到一个简单的界面,输入一个提示词并点击“Generate Music”按钮,即可生成音乐。

默认会生成两首音乐,有 MP3 和 MP4 视频,点击即可播放 AI 生成的音乐。

历史文章

Suno AI API接入 - 将AI音乐接入到自己的产品中,支持120并发任务

Suno Api V4模型无水印开发「灵感模式」 —— 「Suno Api系列」第1篇

Suno Api V4模型无水印开发「自定义模式」 —— 「Suno Api系列」第2篇

Suno Api V4模型无水印开发「AI生成歌词」 —— 「Suno Api系列」第3篇

Suno Api V4模型无水印开发「续写」 —— 「Suno Api系列」第4篇

Suno Api V4模型无水印开发「获取整首歌」 —— 「Suno Api系列」第5篇

Suno Api V4模型无水印开发「高清音频WAV下载」 —— 「Suno Api系列」第6篇

Suno Api V4模型无水印开发「人声伴奏分离」 —— 「Suno Api系列」第7篇

Suno Api V4模型无水印开发「人声伴奏分离 – 自定义音频」 —— 「Suno Api系列」第8篇

Suno Api V4模型无水印开发「人声伴奏分离 – 网络地址」 —— 「Suno Api系列」第9篇

Suno Api V4模型无水印开发「视频封面编辑」 —— 「Suno Api系列」第10篇

Suno Api V4模型无水印开发「上传参考音频 - 方式一:通过二进制流的方式」 —— 「Suno Api系列」第11篇

Suno Api V4模型无水印开发「上传参考音频 - 方式二:通过URL的方式」 —— 「Suno Api系列」第12篇

Suno Api V4模型无水印开发「分页获取音乐列表」 —— 「Suno Api系列」第13篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/943399.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业如何搭建安全的跨网文件安全交换管理系统

在数字化转型的浪潮中&#xff0c;企业对数据的安全性和流动性提出了前所未有的高要求。特别是在网络隔离的情况下&#xff0c;如何实现跨网的安全、高效的文件交换成为了众多企业迫切需要解决的问题。 这不仅是技术上的挑战&#xff0c;还涉及到企业内部管理流程的优化和安全策…

Torch.gather

1.官方文档 2.使用要点 输入index的shape等于输出value的shape输入index的索引值仅替换该index中对应dim的index值最终输出为替换index后在原tensor中的值 最终输出的shape和index的shape相同 根据dim的值 选择将index[i,j,k]这个结果替换input[i,j,k]里面对应的i or j or…

报警推送消息升级的名厨亮灶开源了

简介 AI视频监控平台, 是一款功能强大且简单易用的实时算法视频监控系统。愿景在最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;减少企业级应用约 95%的开发成本&#xff0c;在强大视频算法加…

《解锁 Python 数据挖掘的奥秘》

《解锁 Python 数据挖掘的奥秘》 一、Python 数据挖掘基础&#xff08;一&#xff09;Python 基础与数据挖掘环境搭建&#xff08;二&#xff09;数据挖掘基本流程概述 二、Python 数据挖掘核心技术&#xff08;一&#xff09;数据收集与预处理技术&#xff08;二&#xff09;常…

如何通过 360 驱动大师检查自己电脑上的显卡信息

在深入探讨如何查看显卡信息之前&#xff0c;首先需要了解显卡的基本概念。显卡&#xff08;Graphics Processing Unit, GPU&#xff09;&#xff0c;是计算机中负责处理图形输出到显示器的重要硬件。根据其集成度和性能&#xff0c;显卡通常被分为两类&#xff1a; 集成显卡&…

深度学习目标检测算法之RetinaNet算法

文章目录 前言RetinaNet 算法原理1.RetinaNet 简介2.backbone 部分3.FPN特征金字塔4.分类和预测5.Focal Loss 结束语 &#x1f482; 个人主页:风间琉璃&#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注…

[源码解析] 模型并行分布式训练Megatron (2) --- 整体架构

link [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构 目录 [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构 0x00 摘要0x01 启动 1.1 分布式启动1.2 构造基础 1.2.1 获取模型1.2.2 获取数据集1.2.3 步进函数 1.2.3.1 广播数据0x02 Pretrain0x03 初始化 3.1 …

点击标题滚动到指定模块

vue鼠标点击标题滚动到指定模块&#xff0c;如果滚动页面到指定模块的话标题同样改变颜色 <script> export default {name: ceshi,data() {return {activeSection: 0, // 默认激活第一个标题sections: [{ title: Section 1, content: Content for section 1 },{ title: S…

Kubernetes 镜像拉取策略全解析:如何根据需求选择最佳配置?

在Kubernetes集群里&#xff0c;拉取容器镜像是一个非常关键的步骤。这些镜像包含了应用程序及其所有需要的依赖项&#xff0c;Kubernetes通过拉取这些镜像来启动Pod中的容器。为了提升集群的稳定性、速度和安全性&#xff0c;Kubernetes提供了几种不同的镜像拉取策略。这篇文章…

【碳库】双碳目标下农田温室气体排放估算与模拟(从碳库模拟、机器学习方法、生命周期评价法(LCA)、经验模型和过程模型多个维度)

生态与农业是甲烷&#xff08;CH4&#xff09;、氧化亚氮&#xff08;N2O&#xff09;和二氧化碳&#xff08;CO2&#xff09;等温室气体的主要排放源&#xff0c;占全产业排放的13.5%。农田温室气体又以施肥产生的N2O和稻田生产产生的CH4为主&#xff0c;如何对农田温室气体进…

[计算机网络]OSPF协议

开放最短路径优先OSPF 1&#xff09;OSPF的工作方式 1>和谁交换消息 使用洪泛法&#xff0c;向本自治系统的所有路由器发送消息。 2>交换什么消息 发送的消息就是与本路由器相邻的所有路由器的链路状态&#xff0c;但这只是路由器所知道的部分信息。 链路状态就是说…

mysql进阶

存储引擎 MySQL体系结构&#xff1a; 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表而不是基于库的&#xff0c;所以存储引擎也可以被称为表引擎。 默认存储引擎是InnoDB。 相关操作&#xff1a; -- 查询建表语句 show create table ac…

Unity2021.3.16f1可以正常打开,但是Unity2017.3.0f3却常常打开闪退或者Unity2017编辑器运行起来就闪退掉

遇到问题&#xff1a; 从今年开始&#xff0c;不知道咋回事&#xff0c;电脑上的Unity2017像是变了个人似得&#xff0c;突然特别爱闪退掉&#xff0c;有时候还次次闪退&#xff0c;真是让人无语&#xff0c;一直以来我都怀疑是不是电脑上安装了什么别的软件了&#xff0c;导致…

linux系统上SQLPLUS的重“大”发现

SQL plus版本&#xff1a; [oraclepg-xc2 ~]$ sqlplus -v SQL*Plus: Release 19.0.0.0.0 - Production Version 19.3.0.0.0 操作系统&#xff1a;CentOS Linux 7 (Core) 数据库&#xff1a;Oracle 19c Version 19.3.0.0.0 同样的SQL脚本在windos CMD sqlplus 执行没问题。…

YOLO11改进-注意力-引入自调制特征聚合模块SMFA

本篇文章将介绍一个新的改进机制——SMFA&#xff08;自调制特征聚合模块&#xff09;&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。随着深度学习在计算机视觉中的不断进展&#xff0c;目标检测任务也在快速发展。YOLO系列模型&#xff08;You Onl…

js-000000000000

1、js书写的位置 - 内部 <body> <!-- 习惯把 js 放到 /body 的后面 --> <script> console.log(这是内部 js 的书写位置) alert(内部js) </script> </body> <body><!-- 习惯把 js 放到 /body 的后面 --><script>console.log(这…

Android笔记(四十):ViewPager2嵌套RecyclerView滑动冲突进一步解决

背景 ViewPager2内嵌套横向滑动的RecyclerView&#xff0c;会有滑动冲突的情况&#xff0c;引入官方提供的NestedScrollableHost类可以解决冲突问题&#xff0c;但是有一些瑕疵&#xff0c;滑动横向RecyclerView到顶部&#xff0c;按住它不放手继续往左拖再往右拖&#xff0c;这…

Taro小程序开发性能优化实践

我们团队在利用Taro进行秒送频道小程序的同时&#xff0c;一直在探索性能优化的最佳实践。随着需求的不断迭代&#xff0c;项目中的性能问题难免日积月累&#xff0c;逐渐暴露出来影响用户体验。适逢双十一大促&#xff0c;我们趁着这个机会统一进行了Taro性能优化实践&#xf…

jangow-01-1.0.1靶机

靶机 ip&#xff1a;192.168.152.155 把靶机的网络模式调成和攻击机kali一样的网络模式&#xff0c;我的kali是NAT模式, 在系统启动时(长按shift键)直到显示以下界面 ,我们选第二个&#xff0c;按回车。 继续选择第二个&#xff0c;这次按 e 进入编辑页面 接下来&#xff0c;…

03.HTTPS的实现原理-HTTPS的工作流程

03.HTTPS的实现原理-HTTPS的工作流程 简介1. HTTPS的工作流程1.1. TCP的工作流程1.1.1. 三次握手的详细步骤1.1.2. 三次握手的作用 1.2. HTTPS的工作流程1.2.1. HTTPS与TCP的关系1.2.2. HTTPS的工作流程 2. 公钥和私钥的作用3. 对称密钥的生成和交换4. 对称加密和非对称加密的区…