Sunoで作った曲、まとめて保存する方法【無料・コピペだけ】

こはる
こはる

Sunoで曲をいっぱい作ったんだけど、保存がすっごく面倒なの
にゃ〜:「わかるよ、ほのか。1曲ずつクリックしていくの、地味にしんどいよね。実はそれ、まとめて解決できるんだ」


ダウンロードへの新たなアプローチ(公式HPより)

2026年9月3日より、お客様のプランに応じて以下のダウンロード制限を導入いたします。

無料:最大7回(生涯)の試用版ダウンロード
PRO:月間20ダウンロードまでプレミア
プレミア:月間60ダウンロード


Suno(スーノ)は、文章を入力するだけでAIが曲を作ってくれるサービスです。
たくさん曲を作れるようになると、今度は「保存」が地味に大変になってきます。

この記事では、無料のツールを使って曲をまとめて保存する方法を、順番にわかりやすく説明します。
難しいプログラムの知識は一切いりません。
コピーして貼り付けるだけです。


実はこの「ツール」を使うと、まとめて保存できます

ダウンロードはここをクリック

取扱説明書

Suno一括ダウンローダー

Sunoで作った曲を、
1曲ずつ保存する手間をなくすための小さな道具の使い方です。
チェックを入れて、
ボタンを押すだけ。

先にこれだけ設定しておくと快適です。
使うたびに「⁠ど⁠こ⁠に⁠保⁠存⁠す⁠る⁠?⁠」と聞かれるのが面倒なときは、
アドレスバーにchrome://settings/downloadsと入力して開き、
「⁠ダ⁠ウ⁠ン⁠ロ⁠ー⁠ド⁠前⁠に⁠各⁠フ⁠ァ⁠イ⁠ル⁠の⁠保⁠存⁠場⁠所⁠を⁠確⁠認⁠す⁠る⁠」をOFFにする。
(Sunoを使い終わったらONに戻すのがおすすめ)

ABOUTこれは何?

Suno(AI作曲サイト)のマイページから、自分が作った曲をまとめて保存するツールです。

WAV(高音質)またはMP3(軽い)を選べて、
「⁠い⁠い⁠ね⁠」した曲だけを対象にすることもできます。

!自分のSunoアカウントの曲を、
自分で保存するための道具です。
他の人の曲を勝手に大量取得したり、
Sunoのルールに反する使い方はしないでください。

00準備するもの

  • パソコン(Windows)
  • Google Chrome
  • Tampermonkey(無料の拡張機能)

01Tampermonkeyを入れる(はじめの1回だけ)

  1. 1Chromeを開く
  2. 2検索で「⁠T⁠a⁠m⁠p⁠e⁠r⁠m⁠o⁠n⁠k⁠e⁠y⁠」と調べて、
    Chromeウェブストアのページを開く
  3. 3「⁠C⁠h⁠r⁠o⁠m⁠e⁠に⁠追⁠加⁠」を押す
  4. 4確認画面が出たら「⁠拡⁠張⁠機⁠能⁠を⁠追⁠加⁠」を押す
    ✓ブラウザの右上に、
    小さいアイコンが増えていれば成功です。

Tampermonkey(※Chromeに機能を追加できる無料アプリ)って何?

Tampermonkey(タンパーモンキー)とは、Chromeというブラウザに、
ちょっとした便利機能を追加できる無料のアプリのことです。
今回は、この上で動く「保存を自動化する小さなプログラム」を使います。

「変なものを入れて大丈夫?」その不安、よくわかります

拡張機能と聞くと、「怪しいものだったらどうしよう」と心配になる気持ち、とてもよくわかります。実際、知らないものを何でも入れるのは危険です。

このツールが安全な理由

  • パスワードやメールアドレスなど、個人情報を入力する場面は一切ありません
  • 通信先はSuno公式のサイトだけで、他のところへ情報が送られることはありません
  • すべての操作は、あなた自身のSunoアカウントの中だけで完結します

02ツールを登録する(はじめの1回だけ)

  1. 拡張機能の「⁠T⁠a⁠m⁠p⁠e⁠r⁠m⁠o⁠n⁠k⁠e⁠y⁠」を左クリック

Tampermonkeyアイコンをクリックして開いたメニュー

クリックするとこのメニューが開く

  1. 「⁠ダ⁠ッ⁠シ⁠ュ⁠ボ⁠ー⁠ド⁠」をクリック
  2. 「⁠+⁠」ボタンをクリックして「⁠新⁠規⁠ス⁠ク⁠リ⁠プ⁠ト⁠を⁠追⁠加⁠」

ダッシュボード右上の+ボタンと「新規スクリプトを追加」のツールチップ

この「+」を押すと新規スクリプトが作れる

新規ユーザースクリプトの空のエディター画面

開いたら真っ白なエディター画面になる

  1. エディター内をクリックして
    Ctrl + Aで全選択して削除(DEL)
  2. 下の「⁠コ⁠ピ⁠ー⁠」ボタンでコードを全部コピーして、
    貼り付ける
  3. Ctrl + Sで保存する

// ==UserScript==
// @name         Suno Bulk Downloader
// @namespace    local.suno.tools
// @version      9.1.0
// @description  Sunoのライブラリから選択した曲を、曲名のファイル名でWAV/MP3一括ダウンロードする
// @match        https://suno.com/*
// @match        https://www.suno.com/*
// @grant        GM_addStyle
// @grant        GM_download
// @grant        unsafeWindow
// @run-at       document-idle
// ==/UserScript==

(function () {
  'use strict';

  const API_BASE = 'https://studio-api-prod.suno.com/api/gen';
  const CDN_BASE = 'https://cdn1.suno.ai';
  const POLL_INTERVAL = 2000;  // WAV変換完了を待つ間隔
  const POLL_MAX = 45;         // 最大待ち回数(約90秒)
  const BETWEEN_SONGS = 1000;  // 次の曲へ進むまでの待ち

  GM_addStyle(`
    #sbd-panel h4 { margin:0 0 8px; font-size:13px; font-weight:600; display:flex; justify-content:space-between; align-items:center; cursor:move; user-select:none; }
    #sbd-panel select, #sbd-panel button { width:100%; padding:7px; margin-top:6px; cursor:pointer;
      background:#2d6cdf; color:#fff; border:0; border-radius:6px; font-size:13px; }
    #sbd-panel select { background:#2a2a2a; }
    #sbd-panel button:disabled { background:#555; cursor:default; }
    #sbd-panel button.sbd-sub { background:#3a3a3a; }
    #sbd-opt { display:flex; align-items:center; gap:6px; margin-top:8px; font-size:12px; cursor:pointer; }
    #sbd-list { margin-top:8px; max-height:220px; overflow:auto; border:1px solid #333; border-radius:6px; }
    #sbd-list label { display:flex; gap:6px; align-items:flex-start; padding:5px 6px; border-bottom:1px solid #2a2a2a; font-size:12px; cursor:pointer; }
    #sbd-list label:last-child { border-bottom:none; }
    #sbd-list input { margin-top:2px; }
    #sbd-list .sbd-liked { color:#4ea1ff; }
    #sbd-listctl { display:flex; gap:6px; margin-top:6px; }
    #sbd-listctl button { margin-top:0; padding:5px; font-size:11px; }
    #sbd-log { margin-top:8px; max-height:140px; overflow:auto; font-size:11px; color:#aaa; white-space:pre-wrap; }
  `);

  const panel = document.createElement('div');
  panel.id = 'sbd-panel';
  // Sunoのページ側CSSや拡張機能のフィルタに潰されないよう、
  // レイアウトに関わる指定はインラインstyleへ !important で直接書き込む。
  // 既定位置は右下から少し左。Suno右下の音量スライダーと重ならないようにする。
  const forcedStyles = {
    position: 'fixed', right: '110px', bottom: '100px', 'z-index': '2147483647',
    background: '#181818', color: '#eee', font: '13px/1.5 system-ui,sans-serif',
    border: '1px solid #444', 'border-radius': '10px', padding: '12px', width: '300px',
    'box-shadow': '0 6px 24px rgba(0,0,0,.5)', display: 'block', visibility: 'visible', opacity: '1',
  };
  Object.entries(forcedStyles).forEach(([p, v]) => panel.style.setProperty(p, v, 'important'));
  panel.innerHTML = `
    <h4 title="ドラッグで移動できます">Suno Bulk Downloader <span style="font-weight:400;color:#888;">v9.1.0</span><span id="sbd-min" style="cursor:pointer;font-weight:400;">—</span></h4>
    <div id="sbd-body">
      <select id="sbd-format">
        <option value="wav" selected>WAV</option>
        <option value="mp3">MP3</option>
      </select>
      <label id="sbd-opt"><input type="checkbox" id="sbd-likedonly"> いいねした曲だけ</label>
      <button id="sbd-scan" class="sbd-sub">曲をスキャン</button>
      <div id="sbd-list"></div>
      <div id="sbd-listctl">
        <button id="sbd-all" class="sbd-sub">全選択</button>
        <button id="sbd-none" class="sbd-sub">全解除</button>
      </div>
      <button id="sbd-run" disabled>一括ダウンロード</button>
      <button id="sbd-stop" class="sbd-sub" style="display:none;">中止</button>
      <div id="sbd-log">ライブラリ画面で「曲をスキャン」を押してください。</div>
    </div>
  `;

  // Suno側のReactが再描画するとbody直下の後付け要素が消えることがあるため、
  // html直下に付け、消されたら復元する。
  function ensurePanelAttached() {
    if (!document.documentElement.contains(panel)) document.documentElement.appendChild(panel);
  }
  ensurePanelAttached();
  new MutationObserver(ensurePanelAttached).observe(document.documentElement, { childList: true });

  const $ = (sel) => panel.querySelector(sel);
  const logEl = $('#sbd-log');
  const listEl = $('#sbd-list');
  const runBtn = $('#sbd-run');
  const stopBtn = $('#sbd-stop');
  const scanBtn = $('#sbd-scan');
  const formatSel = $('#sbd-format');
  const likedOnly = $('#sbd-likedonly');

  $('#sbd-min').addEventListener('click', () => {
    const body = $('#sbd-body');
    body.style.display = body.style.display === 'none' ? '' : 'none';
  });

  // ---- パネルの移動(見出しをドラッグ) --------------------------------------
  // 画面下部の再生バーや音量スライダーと重なった時に避けられるようにする。
  // 位置は localStorage に保存し、次回以降も維持する。
  const POS_KEY = 'sbd-panel-pos';

  function applyPosition(left, top) {
    const w = panel.offsetWidth || 300;
    const h = panel.offsetHeight || 200;
    const x = Math.min(Math.max(0, left), window.innerWidth - w);
    const y = Math.min(Math.max(0, top), window.innerHeight - Math.min(h, 80));
    panel.style.setProperty('left', `${x}px`, 'important');
    panel.style.setProperty('top', `${y}px`, 'important');
    panel.style.setProperty('right', 'auto', 'important');
    panel.style.setProperty('bottom', 'auto', 'important');
  }

  try {
    const saved = JSON.parse(localStorage.getItem(POS_KEY) || 'null');
    if (saved && typeof saved.left === 'number') applyPosition(saved.left, saved.top);
  } catch (e) { /* 保存値が壊れていれば既定位置のまま */ }

  const header = $('h4');
  header.addEventListener('mousedown', (e) => {
    if (e.target.id === 'sbd-min') return;  // 最小化ボタンはドラッグ対象外
    e.preventDefault();
    const rect = panel.getBoundingClientRect();
    const dx = e.clientX - rect.left;
    const dy = e.clientY - rect.top;

    const onMove = (ev) => applyPosition(ev.clientX - dx, ev.clientY - dy);
    const onUp = () => {
      document.removeEventListener('mousemove', onMove, true);
      document.removeEventListener('mouseup', onUp, true);
      const r = panel.getBoundingClientRect();
      try {
        localStorage.setItem(POS_KEY, JSON.stringify({ left: r.left, top: r.top }));
      } catch (e2) { /* 保存できなくても動作に支障はない */ }
    };
    document.addEventListener('mousemove', onMove, true);
    document.addEventListener('mouseup', onUp, true);
  });

  const log = (msg) => { logEl.textContent = msg + '\n' + logEl.textContent; };
  const sleep = (ms) => new Promise((r) => setTimeout(r, ms));

  let rows = [];       // { moreBtn, labelText, liked, checked }
  let aborted = false;

  // ---- 曲の検出 ------------------------------------------------------------

  // 各曲行の「…」ボタン。Sunoは data-context-menu-trigger="true" を付与している。
  function findMoreButtons() {
    return Array.from(document.querySelectorAll('button[data-context-menu-trigger="true"]'));
  }

  // 曲名ではない汎用ラベルを弾く
  const GENERIC_LABELS = new Set([
    'その他のオプション', 'リミックス', '編集', '公開', 'シェア', 'ダウンロード', '管理',
    'キューに追加', 'プレイリストに追加', 'ソングラジオ', 'ゴミ箱へ移動', 'ボイス',
  ]);
  function isGenericLabel(t) {
    if (!t) return true;
    if (GENERIC_LABELS.has(t)) return true;
    if (/^\d+:\d+$/.test(t)) return true;  // 再生時間
    if (/^v\d/i.test(t)) return true;      // バージョン表記
    return false;
  }

  function rowOf(btn) {
    return btn.closest('.clip-row') || btn.closest('[role="group"][aria-label]');
  }

  // 曲名は曲行(.clip-row)の aria-label に入っている
  function guessLabel(btn, index) {
    const row = rowOf(btn);
    const rowLabel = row?.getAttribute('aria-label')?.trim();
    if (rowLabel && !isGenericLabel(rowLabel)) return rowLabel;
    const alt = row?.querySelector('img[alt]')?.getAttribute('alt')?.trim();
    if (alt && !isGenericLabel(alt)) return alt.replace(/\s*artwork$/i, '');
    return `曲 #${index + 1}`;
  }

  // いいね済み判定。押されているボタンだけ hxc-btn-variant-primary になる
  // (未押下は hxc-btn-variant-standard-legacy)。
  function isLiked(btn) {
    const row = rowOf(btn);
    if (!row) return false;
    for (const b of row.querySelectorAll('button[aria-label]')) {
      const label = b.getAttribute('aria-label') || '';
      const isLikeBtn = /いいね/.test(label) ? !/よくない/.test(label) : /\blike\b/i.test(label) && !/dislike/i.test(label);
      if (!isLikeBtn) continue;
      if (b.getAttribute('aria-pressed') === 'true') return true;
      if (/hxc-btn-variant-primary/.test(b.className)) return true;
    }
    return false;
  }

  function renderList() {
    listEl.innerHTML = rows
      .map((r, i) => `<label><input type="checkbox" data-i="${i}" ${r.checked ? 'checked' : ''}/> <span>${r.liked ? '<span class="sbd-liked">♥</span> ' : ''}${r.labelText}</span></label>`)
      .join('');
    listEl.querySelectorAll('input').forEach((cb) => {
      cb.addEventListener('change', (e) => {
        rows[Number(e.target.dataset.i)].checked = e.target.checked;
        updateButtons();
      });
    });
  }

  function updateButtons() {
    runBtn.disabled = !rows.some((r) => r.checked);
  }

  function scan() {
    const buttons = findMoreButtons();
    // 曲行の配下にあるものだけが対象。フォルダのカードは .clip-row を持たない。
    const inClipRow = buttons.filter((btn) => btn.closest('.clip-row'));
    let found = inClipRow.map((btn, i) => ({
      moreBtn: btn,
      labelText: guessLabel(btn, i),
      liked: isLiked(btn),
      checked: true,
    }));

    const likedCount = found.filter((r) => r.liked).length;
    if (likedOnly.checked) found = found.filter((r) => r.liked);

    rows = found;
    renderList();
    updateButtons();

    if (rows.length === 0) {
      log(likedOnly.checked
        ? `いいねした曲が見つかりません(表示中の ${inClipRow.length} 曲中 0 件)。`
        : '曲が見つかりません。フォルダの中に入り、曲が一覧表示された状態でスキャンしてください。');
      return;
    }
    log(`${rows.length} 曲を検出しました(表示中 ${inClipRow.length} 曲 / うち♥ ${likedCount} 件)。`);
  }

  // ---- 曲IDの取得 ----------------------------------------------------------

  const UUID_RE = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i;

  function extractClipId(btn) {
    const row = rowOf(btn);
    if (!row) return null;
    const link = row.querySelector('a[href*="/song/"]')?.getAttribute('href');
    const fromLink = link?.match(UUID_RE);
    if (fromLink) return fromLink[0];
    const fromData = row.querySelector('[data-clip-id]')?.getAttribute('data-clip-id')?.match(UUID_RE);
    if (fromData) return fromData[0];
    for (const img of row.querySelectorAll('img[src]')) {
      const m = img.getAttribute('src').match(UUID_RE);
      if (m) return m[0];
    }
    const m = row.outerHTML.match(UUID_RE);
    return m ? m[0] : null;
  }

  // ---- 保存 ----------------------------------------------------------------

  function sanitizeFileName(name) {
    return (name || '').replace(/[\\/:*?"<>|]/g, '_').replace(/\s+/g, ' ').trim().slice(0, 120);
  }

  // 同名の曲が複数あるため、実行中に使った名前は連番で衝突を避ける
  const usedNames = new Set();
  function uniqueName(base, ext) {
    let name = `${base}.${ext}`;
    let n = 2;
    while (usedNames.has(name)) name = `${base} (${n++}).${ext}`;
    usedNames.add(name);
    return name;
  }

  async function downloadViaFetch(url, name) {
    let res;
    try {
      res = await fetch(url);
    } catch (e) {
      return { ok: false, error: `通信エラー(${e && e.message ? e.message : e})` };
    }
    if (!res.ok) return { ok: false, error: `HTTP ${res.status}` };
    const blob = await res.blob();
    const objUrl = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = objUrl;
    a.download = name;
    document.body.appendChild(a);
    a.click();
    a.remove();
    setTimeout(() => URL.revokeObjectURL(objUrl), 10000);
    return { ok: true, size: blob.size };
  }

  function downloadViaGM(url, name) {
    return new Promise((resolve) => {
      GM_download({
        url, name, saveAs: false,
        onload: () => resolve({ ok: true }),
        onerror: (e) => resolve({ ok: false, error: (e && (e.error || e.details)) || 'error' }),
        ontimeout: () => resolve({ ok: false, error: 'timeout' }),
      });
    });
  }

  // ---- 音源URLの取得 -------------------------------------------------------
  // WAV: 画面のダウンロード操作と同じ手順を、同じログイン済みセッションで実行する。
  //   1) POST /api/gen/{id}/convert_wav/  変換を開始
  //   2) GET  /api/gen/{id}/wav_file/     → { wav_file_url }
  // MP3: 変換不要で、CDN上のファイルをそのまま取得する。

  // 認証トークンはページのClerkセッションから正規に取得する
  async function getAuthToken() {
    const w = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window;
    try {
      return (await w.Clerk?.session?.getToken?.()) || null;
    } catch (e) {
      return null;
    }
  }

  async function fetchWavUrl(clipId) {
    const token = await getAuthToken();
    if (!token) return { error: '認証トークンを取得できません(ログイン状態を確認してください)' };
    const headers = { Authorization: `Bearer ${token}` };

    const conv = await fetch(`${API_BASE}/${clipId}/convert_wav/`, { method: 'POST', headers });
    if (!conv.ok && conv.status !== 204) return { error: `変換開始に失敗 HTTP ${conv.status}` };

    for (let i = 0; i < POLL_MAX; i++) {
      if (aborted) return { error: '中止' };
      const res = await fetch(`${API_BASE}/${clipId}/wav_file/`, { headers });
      if (res.ok) {
        const json = await res.json().catch(() => null);
        if (json && json.wav_file_url) return { url: json.wav_file_url };
      } else if (res.status === 402 || res.status === 403) {
        return { error: `HTTP ${res.status}(プランの制限の可能性)` };
      }
      await sleep(POLL_INTERVAL);
    }
    return { error: '変換待ちがタイムアウトしました' };
  }

  async function resolveAudioUrl(clipId, format) {
    if (format === 'mp3') return { url: `${CDN_BASE}/${clipId}.mp3` };
    return await fetchWavUrl(clipId);
  }

  async function run() {
    const targets = rows.filter((r) => r.checked);
    if (targets.length === 0) return;
    const format = formatSel.value;      // 'wav' | 'mp3'
    aborted = false;
    runBtn.disabled = true;
    scanBtn.disabled = true;
    stopBtn.style.display = '';
    log(`一括ダウンロード開始: ${targets.length} 曲(${format.toUpperCase()})`);

    let done = 0;
    try {
      for (let i = 0; i < targets.length; i++) {
        if (aborted) { log('中止しました。'); break; }
        const row = targets[i];
        const id = extractClipId(row.moreBtn);
        if (!id) {
          log(`(${i + 1}/${targets.length}) スキップ: 「${row.labelText}」— 曲IDを特定できません`);
          continue;
        }
        log(`(${i + 1}/${targets.length}) 「${row.labelText}」— 取得中...`);
        const { url, error } = await resolveAudioUrl(id, format);
        if (!url) {
          log(`  失敗: 「${row.labelText}」— ${error} / ID=${id.slice(0, 8)}`);
          continue;
        }
        const name = uniqueName(sanitizeFileName(row.labelText) || id, format);
        let res = await downloadViaFetch(url, name);
        if (!res.ok) {
          const alt = await downloadViaGM(url, name);
          if (alt.ok) res = alt;
          else res = { ok: false, error: `${res.error} / GM:${alt.error}` };
        }
        if (res.ok) {
          done++;
          log(`  保存: ${name}${res.size ? ` (${Math.round(res.size / 1024 / 1024)}MB)` : ''} / ID=${id.slice(0, 8)}`);
        } else {
          log(`  失敗: ${name} — ${res.error}`);
        }
        await sleep(BETWEEN_SONGS);
      }
      log(`一括ダウンロード終了: ${done} 曲を保存しました。`);
    } finally {
      stopBtn.style.display = 'none';
      scanBtn.disabled = false;
      updateButtons();
    }
  }

  scanBtn.addEventListener('click', scan);
  runBtn.addEventListener('click', run);
  stopBtn.addEventListener('click', () => { aborted = true; log('中止を要求しました...'); });
  likedOnly.addEventListener('change', () => { if (rows.length > 0) scan(); });
  $('#sbd-all').addEventListener('click', () => { rows.forEach((r) => (r.checked = true)); renderList(); updateButtons(); });
  $('#sbd-none').addEventListener('click', () => { rows.forEach((r) => (r.checked = false)); renderList(); updateButtons(); });
})();

03使い方

STEP 1

Sunoを開く

suno.comにアクセスして、
いつも通りログインする。
自分の曲が並んでいる画面(ライブラリ)を開く。
画面のどこかに黒いパネルが出てくれば準備完了。
出てこない場合はページを1回リロードする。

STEP 2

好みを選ぶ

WAV(音が良いが時間がかかる・⁠容量大)かMP3(早い・⁠軽い)を選ぶ。
「⁠い⁠い⁠ね⁠し⁠た⁠曲⁠だ⁠け⁠」にチェックを入れると、
♥した曲だけが対象になる。WAVとMP3を選ぶプルダウンメニューを開いた実際の画面

STEP 3

スキャンする

「⁠曲⁠を⁠ス⁠キ⁠ャ⁠ン⁠」ボタンを押す。
今、
画面に表示されている曲の一覧が、
パネルの中にリストで出てくる。

!一度にスキャンできるのは画面に表示されている分だけ
それより多い曲を保存したいときは、
画面を下にスクロールしてから、
もう一度「⁠曲⁠を⁠ス⁠キ⁠ャ⁠ン⁠」を押す(=再スキャン)。
この時、「⁠5⁠〜⁠6⁠曲⁠分⁠く⁠ら⁠い⁠」少なめにスクロールして再スキャンすると、
前回とのダブりが少なくなる。
ダブった曲が出てしまっても、
そのままチェックを外せば重複保存を防げる。

STEP 4

曲を選ぶ

最初は全部チェックが入っている。
いらない曲はチェックを外す。
「⁠全⁠選⁠択⁠」「⁠全⁠解⁠除⁠」ボタンでまとめて切り替えもできる。スキャンした曲の一覧にチェックが入っている実際の画面

STEP 5

ダウンロード

「⁠一⁠括⁠ダ⁠ウ⁠ン⁠ロ⁠ー⁠ド⁠」ボタンを押して、
あとは待つだけ。
1曲ずつ順番に保存される。
途中で止めたいときは「⁠中⁠止⁠」ボタンを押す。
保存先はパソコンの「⁠ダ⁠ウ⁠ン⁠ロ⁠ー⁠ド⁠」フォルダで、
曲名がそのままファイル名になる(同名がある場合は自動で番号が付く)。

FAQこんなときは

パネルが再生バーや音量ボタンと重なって邪魔

パネルのタイトル部分(「⁠S⁠u⁠n⁠o⁠ ⁠B⁠u⁠l⁠k⁠ ⁠D⁠o⁠w⁠n⁠l⁠o⁠a⁠d⁠e⁠r⁠」の文字のところ)を、
マウスでつかんで好きな場所にドラッグできます。
動かした位置は覚えてくれます。パネルを一時的に小さくしたい

タイトルの右はしにある「⁠―⁠」を押すと、
たたんで小さくなります。「⁠曲⁠を⁠ス⁠キ⁠ャ⁠ン⁠」しても0件と出る

フォルダの中に入って、
曲が並んだ画面になってからもう一度スキャンしてください。保存する前に「⁠ど⁠こ⁠に⁠保⁠存⁠す⁠る⁠?⁠」と毎回聞かれて面倒

Chromeのアドレスバーにchrome://settings/downloadsと入力して開き、
「⁠ダ⁠ウ⁠ン⁠ロ⁠ー⁠ド⁠前⁠に⁠各⁠フ⁠ァ⁠イ⁠ル⁠の⁠保⁠存⁠場⁠所⁠を⁠確⁠認⁠す⁠る⁠」をOFFにすると聞かれなくなります。
Sunoを使い終わったらONに戻すのがおすすめです。WAVのダウンロードが失敗する

ログに理由が出るので確認してください。
プランの制限(Pro限定機能など)の場合があります。

気をつけてほしいこと

  • ・⁠自分のアカウントの曲だけに使う。他人の曲を大量取得する目的では使わない
  • ・⁠短時間にものすごい数(数百曲など)を一気に処理すると、
    アカウントに負荷がかかる可能性がある。
    少しずつ使うのがおすすめ
  • ・⁠このツールはSunoの画面が変わると動かなくなることがある。
    その場合は作った人に相談する
  • ・⁠個人情報(パスワードやメールアドレスなど)を入力する場面はどこにもない。
    もし入力を求める画面が出てきたら、
    それはこのツールではない何か別のものなので注意する

🌸RUNWAY AI 紹介コードのご案内🌸

にゃー
にゃー

紹介コードcapeta-jbwg0wを受け取ったら、次の手順で簡単に有効化できます。

1️⃣ 新しい Runway アカウントにサインアップ
まずはアカウントを作成してください。

2️⃣ アカウントの認証を完了
メールに届いた認証リンクをクリックして完了です。

3️⃣ 紹介コードを入力
次の画面で紹介コードを入力し、「続行」を選択してください。

4️⃣ 有料プランにご加入
あなたとお友達の両方が、少なくとも2か月間有料プランを続けると、1,000クレジットがプレゼントされます✨

紹介コードを使えば、お互いにちょっぴりお得にスタートできます。
ぜひこの機会に、あなたらしいクリエイティブをRunwayで楽しんでください🎨💖

Runwayの世界へGO!!

Runway MLではクレジットを消費することで、Kling3・Veo3.1・WAN2.6・Sora 2 Pro
さらにNano Banana Pro (4K)まで使えます。
2026/06/01からUnlimitedプランがMAXプランに移行されました。
このため、無制限モードが9500クレジット付与される形に変更されてしまいました。
Unlimitedプランの弱点である、生成速度の遅さが改善されると思えば・・・改悪だと思います。

RUNWAYは、クレジット消費が大きいので、Kiling などで720Pなどの動画を
1秒ごとに2クレジット支払って4K化するような使い方や
VEOの動画をウオーターマークをつけないで生成するなどの使い方が良いかと思います。


スマホからログインすると10~25クレジットをランダムで獲得できます。
端末を変更し、ipadなどからログインするとWで獲得できるように見えますが
実際は最初に獲得した分子しか反映されないようです。
獲得クレジット24Hで消滅しますので、すぐに使用しましょう。
PCからでは、クレジットは獲得できません

V2.5 TURBO 720P 5秒の動画生成 15クレジット
1080P 25クレジットで1回生成できます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎬 50%ボーナス獲得の「2ステップ手順」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━

スマホ版⇩(PC版は下にスクロールして) 
【STEP 1】
この「特別登録リンク」をクリックして、無料アカウント登録を完了

【STEP 2】
これをクリックして【 7BX46RFTVWXM 】Klingに移動。
サブスクに登録します。

①コピー(念の為)
②「Open app」クリック
これで「招待コード」が適応されます


PC版
【STEP 1】
この「特別登録リンク」をクリックして、無料アカウント登録を完了

【STEP 2】

これをクリックして【 7BX46RFTVWXM 】Klingに移動。
サブスクに登録します。

下記のようになっているか確認してください

プランのところに+50%と表示されているか確認してから決算してください。

下記のような場合は、招待コードを【 7BX46RFTVWXM 】コピペしてください⇩


💡 補足・注意点
・Kling AIでの「有料課金が初めての方」限定の特典です。
・付与されたボーナスクレジットの有効期限は30日間となります。
・課金履歴の有無は、決済画面の「Credit Activity」から確認できます。

最大5000クレジットまでなので
ウルトラプランだと通常の26,000+5,000クレジットとなります。


招待コードが反映されると「+50%」のように表示されます。⇩

カード情報入力画面では、+50%など表示されません。
適応されているがどうかは、⇧の画面で確認して、次に進もましょう。

にゃー
にゃー

招待コードを使用してもらえると
私には500クレジット入ります。
応援よろしくお願いします。

KILING AIの世界へGO!!
先ずは「特別登録リンク」からFreeプランに登録してください。



Audible
Audibleで、通勤読書を始めませんか?
あのビジネス書も聞くだけなので、車や電車でサクッとスキルアップ可能です。
今なら数十万の対象作品聴き放題(1,500円/月)が初回30日間無料
オーディオBOOKを手軽に楽しんでみませんか。

にゃー
にゃー

私は、疲れたときは仕事帰りに、ライトノベルを聞きながら帰宅することが多いです。
小説は、疲れた心をリラックスさせ癒やします。
自宅につくまでに気持ちを切り替えれば、今までとは世界が変わってくるでしょう。

無職転生 ~異世界行ったら本気だす」はおすすめです。
26巻で完結したと思っていたのですが、その後を描く物語集『蛇足編』が始まってるではありませんか
通勤時間が楽しくなるかも♪

最弱テイマーはゴミ拾いの旅を始めました」も、おすすめです。
Audibleの聴き放題プランに加入すると0円で聴き放題ですよ。



にゃー
にゃー

応援お願いします。
Amazonプライムは会員だけの割引やセールも魅力です。
アニメ音楽ライブをみてリラックスしませんか

月額600円 または 年額5,900円(税込)を選ぶことが出来ます。

AmazonプライムVIDEOをのぞいてみる
「Amazonプライムに登録すると、
お昼休みに映画やドラマを見ることが出来ます。
さらに、限定セールでお得に気になっていた商品を購入し、好きな音楽をききながら、生成AI関係の本も楽しめます。

今なら月額600円のサービスが、30日間無料で試せるので、ぜひこの機会に体験してください!

Amazonプライムに月額600円で加入すると、以下のようなサービスが「すべてセット」で使えます。

  • Amazonプライムビデオ(Prime Video):映画やアニメなどの対象作品が見放題になるサービス(SVOD:定額制動画配信と言います)。
  • 配送特典:お急ぎ便(早く届くサービス)や、日時指定便が無料になります。
  • Amazon Music Prime:対象の音楽がシャッフル再生で聴き放題(サブスク:月額制のサービス)。
  • Prime Reading:対象の電子書籍(本やマンガ)が読み放題。
  • Amazon Photos:写真を無制限に保存できるクラウド(インターネット上の自分専用の保存スペース)。


にゃー
にゃー

アンケート
記事をもっと読みやすくしたいので、気軽な感想を教えてほしいです。

空白OK。無理のない範囲で、 差し支えなければご入力ください。
空白OK。返信をご希望する場合ご記入ください
空白でもOKです。
チェックボックスになっています
どれかクリックしてください

にゃー
にゃー

お問い合わせは、ここに書いてください

お問い合わせ
【任意】恐れ入りますが、差し支えなければお名前をご記入ください。
【任意】ご返信をご希望の際は、恐れ入りますがメールアドレスをご記入ください。

テキストのコピーはできません。