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篇

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【物联网技术与应用】实验15:电位器传感器实验

实验15 电位器传感器实验 【实验介绍】 电位器可以帮助控制Arduino板上的LED闪烁的时间间隔。 【实验组件】 ● Arduino Uno主板* 1 ● 电位器模块* 1 ● USB电缆*1 ● 面包板* 1 ● 9V方型电池* 1 ● 跳线若干 【实验原理】 模拟电位器是模拟电子元件&#xff0c;模…

【YOLO】(基础篇一)YOLO介绍

YOLO YOLO&#xff08;You Only Look Once&#xff09;是一种用于实时物体检测的算法&#xff0c;由Joseph Redmon等人提出。它能够同时进行物体分类和定位&#xff0c;并且因其速度和效率而广受赞誉。 工作原理 假设我们要对这张猫的图片完成目标检测&#xff0c;需要框选出…

Linux-----进程处理(文件IO资源使用)

下面代码是通过父进程和子进程对同一个文件IO资源进行操作&#xff0c;父进程和子进程都对这个进程进行写入操作&#xff0c;我们都知道这两个进程实际上是并发的&#xff0c;所以需要一个同步机制来去操作同一个资源&#xff08;后面再深入去说明同步的api&#xff0c;这里使用…

golang标准库SSH操作示例

文章目录 前言一、了解SSH二、重要知识点1.安装ssh库2.ssh库重要知识牢记 三、模拟连接远程服务器并执行命令四、SSH与os/exec标准库下执行命令的几种方式对比五、SSH库下三种执行命令方式演示5.1. session.CombinedOutput()示例5.2. session.Run()示例5.3. session.Start()、s…

替代传统FTP传输,镭速大数据传输系统实现安全高效数据流转!

信息技术的快速进步让大数据成为了企业决策的关键支撑&#xff0c;但同时也带来了巨大的挑战。企业在运营过程中产生的数据量急剧增加&#xff0c;这对数据传输的速度、安全性和效率提出了更高的要求。然而&#xff0c;传统的FTP传输方式在处理大规模数据时显得力不从心&#x…

MyBatis如何处理延迟加载?

大家好&#xff0c;我是锋哥。今天分享关于【MyBatis如何处理延迟加载&#xff1f;】面试题。希望对大家有帮助&#xff1b; MyBatis如何处理延迟加载&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 支持 延迟加载&#xff08;Lazy Loading&am…

Matlab环形柱状图

数据准备&#xff1a; 名称 数值 Aa 21 Bb 23 Cc 35 Dd 47 保存为Excel文件后&#xff1a; % Load data from Excel file filename data.xlsx; % Ensure the file is in the current folder or provide full path dataTable readtable(filena…

论文研读:AnimateDiff—通过微调SD,用图片生成动画

1.概述 AnimateDiff 设计了3个模块来微调通用的文生图Stable Diffusion预训练模型, 以较低的消耗实现图片到动画生成。 论文名&#xff1a;AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning 三大模块&#xff1a; 视频域适应…

洛谷 P1014:Cantor 表

【题目来源】https://www.luogu.com.cn/problem/P1014https://www.acwing.com/problem/content/5510/【题目描述】 现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。 他是用下面这一张表来证明这一命题的&#xff1a; 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 …

【网络安全零基础入门】PHP环境搭建、安装Apache、安装与配置MySQL(非常详细)零基础入门到精通,收藏这一篇就够(01)_php安装配置教程

这是大白给粉丝朋友准备的网络安全零基础入门第八章PHP入门的知识章节里的环境搭建。 喜欢的朋友们&#xff0c;记得给大白点赞支持和收藏一下&#xff0c;关注我&#xff0c;学习黑客技术。 一、php简介 php定义&#xff1a;一种服务器端的 HTML脚本/编程语言&#xff0c;是…

RBTree(红黑树)

目录 红黑树的概念 红黑树的性质 红黑树节点的定义 红黑树的插入 1. 按照二叉搜索的树规则插入新节点 2. 检测新节点插入后&#xff0c;红黑树的性质是否造到破坏 红黑树的检测 红黑树的删除 红黑树和AVL树的比较 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&…

JS 三种添加元素的方式、区别( write、createElement、innerHTML )

文章目录 1. 区别结论2. write 不同场合的效果3. createElement 和 innerHTML 耗时对比 1. 区别结论 方式说明document.write不建议使用, 使用时要小心, 不同场合, 效果不同document.createElement添加少量元素时建议使用, 结构清晰易读innerHTML添加大量元素时建议使用 2. wr…

300多种复古手工裁剪拼贴艺术时尚字母、数字、符号海报封面Vlog视频MOV+PNG素材

300复古时尚大小写字母、数字、符号拼贴海报封面平面设计Vlog视频标题动画 Overlay - Cut-Out Letters Animations Pack - Animated Letters, Numbers, and Symbols 使用 Cut-Out Letters Animations Pack 提升您的内容&#xff01;包含 300多个高品质动画资源&#xff0c;包括…

SpringCloudAlibaba技术栈-Dubbo

1、什么是Dubbo? 简单来说&#xff0c;dubbo就像是个看不见的手&#xff0c;负责专门从注册中心nacos调用注册到nacos上面的服务的&#xff0c;因为在微服务环境下不同的功能模块可能在不同的服务器上。dubbo调用服务就像是在调用本地的服务一样。 分布式调用与高并发处理 Du…

剪映学习01

1.剪映界面介绍 1.点击左上角的的登录账户可以登录剪映&#xff0c;它可以和抖音账号共用&#xff0c;所以我们剪辑完视频后可以直接从抖音发布。 左侧的导航栏有一些功能&#xff0c;我们点击模板&#xff0c;剪映它会显示当下比较火的模板&#xff0c;如果我们剪视频需要用到…

OpenLinkSaas使用手册-简介

OpenLinkSaas是针对软件研发人员/团队的效能工具。对个人而言是工具加成长导航路线&#xff0c;对团队而言是团队管理和项目管理。 OpenLinkSaas虽然功能众多&#xff0c;但可以按需配置所需功能&#xff0c;也可以制作自己的发行版。 OpenLinkSaas的由来 软件研发是一个比较…

QT调用Sqlite数据库

QT设计UI界面&#xff0c;后台访问数据库&#xff0c;实现数据库数据的增删改查。 零售商店系统 数据库表&#xff1a; 分别是顾客表&#xff0c;订单详情表&#xff0c;订单表&#xff0c;商品表 表内字段详情如下&#xff1a; 在QT的Pro文件中添加sql&#xff0c;然后添加头…

vue3使用vant日历组件(calendar),自定义日历下标的两种方法

在vue3中使用vant日历组件&#xff08;calendar&#xff09;自定义下标的两种方法&#xff0c;推荐使用第二种&#xff1a; 日期下方加小圆点&#xff1a; 一、使用伪元素样式实现(::after伪元素小圆点样式会被覆盖&#xff0c;只能添加一个小圆点) 代码如下&#xff08;示例…

STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器

STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器 1、按键控制 LED 按键:常见的输入设备&#xff0c;按下导通&#xff0c;松手断开 按键抖动:由子按键内部使用的是机械式弹簧片来进行通断的、所以在按下和松手的瞬间会伴随有一连串的抖动 按键控制LED接线图&#xff1a; 要有工程…

2024金融大模型实践方案的概览(附实践资料合集)

金融大模型实践方案的全面总结&#xff1a; 金融大模型应用评测&#xff1a; 在金融评测的五大能力维度中&#xff0c;各模型整体表现基本满足当下场景需求&#xff0c;其中金融安全与价值对齐表现优异&#xff0c;但金融专业认知和多模态处理能力仍存在较大提升空间。 金融大模…