diff --git a/README-fr.md b/README-fr.md new file mode 100644 index 0000000..3fd830d --- /dev/null +++ b/README-fr.md @@ -0,0 +1,453 @@ +[English](./README.md) | Français | [简体中文](./README-zh_cn.md) | [繁體中文](./README-zh_hk.md) + +
+ K.G.Studio Logo +
+ +# K.G.Studio — Une DAW basée sur le navigateur avec assistant IA + +
+

◀ Commencer à utiliser K.G.Studio en ligne dans votre navigateur ▶

+
+ +## Nouveau ! + +> ### ✦ [K.G.One Music Studio est disponible dès maintenant.](https://github.com/KGAudioLab/K.G.One) ✦
+> [**K.G.One Music Studio**](https://github.com/KGAudioLab/K.G.One) est une plateforme intégrée, entièrement locale et open source, construite autour de **K.G.Studio** (ce projet). Elle embarque [ACE-Step 1.5](https://github.com/ace-step/ACE-Step-1.5) pour la génération de morceaux complets, [Foundation-1](https://huggingface.co/RoyalCities/Foundation-1) pour la génération de clips audio et de boucles MIDI, ainsi que [python-audio-separator (UVR5)](https://github.com/nomadkaraoke/python-audio-separator) pour la séparation de stems, apportant directement la génération musicale IA accélérée par GPU dans votre flux de production musicale dans le navigateur. + +## Qu'est-ce que K.G.Studio ? + +K.G.Studio est une DAW légère et moderne qui fonctionne entièrement dans le navigateur, avec **K.G.Studio Musician Assistant** en son cœur. Il propose une lecture réaliste des instruments via les samplers Tone.js, un éditeur piano roll, une gestion des pistes et des régions avec annulation/rétablissement complets, la persistance des projets dans OPFS (Origin Private File System), un panneau de configuration personnalisable, et un assistant IA intégré avec exécution d'outils. + +**K.G.Studio Musician Assistant** est un agent d'assistance IA pour l'harmonie, l'arrangement et l'édition de notes, mais pas pour la composition entièrement automatique. + +
+ K.G.One Logo +
+ +> Remarque : les fonctions de génération de morceau complet et de génération de clip audio nécessitent l'intégration de [**K.G.One Music Studio**](https://github.com/KGAudioLab/K.G.One). + +## Dernières mises à jour + +- **2026.05.30** : ajout de la **prise en charge de l'internationalisation (i18n)** — K.G.Studio est désormais disponible en quatre langues : **English**, **Simplified Chinese (简体中文)**, **Traditional Chinese (繁體中文)** et **Français**. La langue active se configure dans **Réglages ⚙️ → Général → Langue**, avec une option `Auto` qui détecte automatiquement la langue de votre navigateur. + +- **2026.05.27** : + - Ajout du **système de pistes globales** : introduction de quatre pistes globales, **Marker**, **Tempo**, **Key Signature** et **Chord** (régions d'étendue avec symboles d'accords). + - Ajout de la fonction **Audio Chord Detection** : ouvrez la fenêtre piano roll pour une région audio ou MIDI, puis cliquez sur « ... » -> **Detect Chords** pour analyser automatiquement l'enregistrement et remplir la Chord Track à l'aide d'un pipeline FFT sans dépendance, avec sensibilité, stabilité et détection des accords de septième configurables. + - Ajout de la fonction **Tempo Detection with Auto-Align Beats** : ouvrez la fenêtre piano roll pour une région audio, puis cliquez sur « ... » -> **Detect Tempo** dans la barre d'outils pour analyser le BPM de l'audio et, si vous le souhaitez, réaligner les régions de la Tempo Track du projet. + - Ajout de **Demucs 4S** comme second modèle local de séparation de stems intégré au navigateur. En plus du modèle UVR-MDX-NET à deux stems existant, le modèle `htdemucs_4s` à quatre stems (~172 MB, vocals / drums / bass / others) est désormais disponible, les deux s'exécutant entièrement dans le navigateur via ONNX Runtime WebGPU. + +- **2026.05.15** : ajout de **modèles IA intégrés au navigateur**. Deux modèles IA peuvent désormais fonctionner entièrement dans le navigateur, sans service externe, sans clé API, et sans serveur K.G.One. **K.G.Studio Musician Assistant** gagne un nouveau fournisseur **Local LLM (Browser)** basé sur **Gemma 4 E4B** via LiteRT-LM avec accélération WebGPU ; le modèle est téléchargé une fois puis mis en cache dans OPFS pour des lancements ultérieurs quasi instantanés, avec longueur de contexte configurable (32 k / 64 k / 128 k tokens) et statistiques de performance d'inférence en direct. La **séparation de stems** fonctionne désormais aussi localement grâce à un modèle ONNX **UVR-MDX-NET-Inst_HQ_3** intégré au navigateur avec accélération WebGPU. Ouvrez le panneau **Music Generator** (bouton ✦), téléchargez le modèle une fois, puis séparez voix et accompagnement entièrement sur votre appareil. Les deux fonctions nécessitent un navigateur compatible WebGPU (Chrome 113+ ou Edge 113+) et un contexte sécurisé (HTTPS ou localhost). Matériel recommandé : un GPU avec au moins 8 GB de VRAM ou un système avec au moins 16 GB de mémoire unifiée. + +- **2026.05.10** : ajout de la **vue en notation musicale (sheet music)**. Le piano roll propose désormais un mode complet de notation standard. Basculez entre les vues Piano Roll et Sheet Music à l'aide du bouton dans la barre d'outils du piano roll. En mode partition, les notes sont gravées via VexFlow avec sélection automatique de la clé (sol ou fa) selon l'instrument actif, affichage de l'armure, groupement automatique des crochets, liaisons entre mesures et quantification configurable pour la résolution des valeurs de notes. Activez **Track Scope** pour afficher toutes les régions MIDI de la piste comme une partition continue plutôt qu'une seule région isolée. + +- **2026.05.09** : ajout de **l'enregistrement audio**. Vous pouvez désormais enregistrer directement depuis votre microphone dans une piste audio. Un aperçu de forme d'onde en direct se développe en temps réel pendant l'enregistrement, et la région est ajoutée à la timeline comme région audio standard à l'arrêt. Ajout également de la **sélection des périphériques audio I/O** dans les paramètres afin de choisir votre entrée micro et votre sortie audio préférées. + +- **2026.05.08** : ajout de **l'automation MIDI**. Vous pouvez dessiner et modifier des courbes de pitch bend et de MIDI CC (CC1 Modulation, CC2 Breath, CC7 Volume, CC11 Expression, CC64 Sustain) dans une lane d'automation éditable sous la grille piano. Ajout de **l'automation au niveau de la piste** : chaque piste dispose désormais d'un panneau d'automation dédié où vous pouvez voir et modifier les mêmes courbes directement sur la timeline. Les entrées de contrôleurs MIDI en temps réel (pitch wheel, pédales CC) sont enregistrées et relues avec interpolation par lane. Ajout du **panneau Event List** : une barre latérale à onglets (Notes / Pitch Bend / Controller) pour inspecter et modifier en ligne tous les événements de la région MIDI active. Ajout également de la **sélection multiple de régions** avec lasso et déplacement/redimensionnement de groupe, ainsi que de la **fusion de régions MIDI**. +
+ K.G.Studio Logo +
+ +- **2026.05.02** : ajout de la **visualisation spectrogramme des pistes audio**. Les régions audio affichent désormais une superposition de spectrogramme en temps réel dans la grille des pistes. Ajout du **Piano Roll hybrid mode** : ouvrez le piano roll sur une région MIDI pendant que le spectrogramme d'une région audio voisine est affiché comme couche de référence, afin d'éditer les notes MIDI en fonction de la forme visuelle de l'audio. Ajout du **zoom avant/arrière dans le piano roll** avec conservation de la position de la vue pour qu'elle reste ancrée près de la tête de lecture actuelle. Ajout également du **réglage fin de la position des régions** avec petits incréments pour un placement précis. Enfin, ajout de la synchronisation du défilement de la tête de lecture entre composants afin que la grille principale et le piano roll restent synchronisés pendant la lecture. +- **2026.04.29** : ajout de **Remix** et **Repaint** au panneau K.G.One Music Generator (alimenté par ACE-Step 1.5). **Remix** vous permet de refaire une région audio existante dans un nouveau style : sélectionnez une région audio, décrivez le style cible et fournissez éventuellement de nouvelles paroles, et ACE-Step réinterprétera le morceau avec l'instrumentation et l'ambiance demandées. **Repaint** vous permet de régénérer de façon chirurgicale une section précise d'un morceau : définissez une plage de boucle sur la timeline pour créer la fenêtre de repaint, puis décrivez le résultat souhaité pour cette section ; le reste du morceau reste inchangé. Les deux outils prennent en charge le même flux d'import que les autres onglets K.G.One : prévisualisation dans le lecteur intégré, glisser-déposer sur une piste, ou clic sur **Import Aligned to Source** pour placer automatiquement le résultat sous la région d'origine dans une nouvelle piste. +- **2026.04.24** : ajout de l'intégration [**K.G.One Music Studio**](https://github.com/KGAudioLab/K.G.One) ! Lorsque K.G.Studio se connecte à un serveur K.G.One local, le panneau **K.G.One Music Generator** (bouton baguette magique ✦ dans la barre d'outils) devient disponible avec trois outils alimentés par l'IA : **Full Song Generation** (alimenté par ACE-Step 1.5 pour générer des chansons complètes à partir de prompts textuels), **Clip Generation** (alimenté par Foundation-1 pour générer des clips instrumentaux et des boucles MIDI à partir de texte), et **Stem Separation** (alimenté par python-audio-separator pour séparer n'importe quel audio en voix, instrumentaux, etc.). Les audios et MIDI générés peuvent être prévisualisés instantanément et glissés directement sur vos pistes. K.G.One fonctionne entièrement sur votre propre machine (Windows/Linux, GPU CUDA requis) ; consultez le [dépôt K.G.One](https://github.com/KGAudioLab/K.G.One) pour les instructions d'installation. +- **2026.04.11** : migration du stockage des projets depuis IndexedDB vers OPFS (Origin Private File System) avec une structure basée sur des dossiers, afin de mieux gérer les fichiers médias. Ajout de la prise en charge des pistes audio avec import WAV/MP3, lecture, boucle et découpe non destructive des régions. Ajout également de l'export bounce vers WAV/MP3 via rendu hors ligne. +- **2026.04.05** : migration de l'agent IA, passant d'un appel d'outils basé sur XML au function calling natif du SDK OpenAI afin d'améliorer la fiabilité et la compatibilité. Ajout de nouvelles options de modèles LLM, y compris la série GPT-5.4. +- **2026.01.23** : implémentation de la lecture en boucle sans couture ! Faites glisser sur les numéros de mesure pour définir une plage de boucle, ou activez le mode boucle avec le bouton Loop dans la barre d'outils. La lecture en boucle utilise la fonctionnalité native de boucle de `Tone.js` pour une boucle précise au niveau de l'échantillon et sans coupure. +- **2025.12.21** : implémentation de la prise en charge du clavier MIDI ! Vous pouvez désormais connecter un clavier MIDI et l'utiliser pour jouer des sons. Veuillez noter que cette fonction peut ne pas fonctionner de manière optimale dans Safari et certains autres navigateurs ne prenant pas entièrement en charge l'interface Web MIDI. +- **2025.12.15** : ajout de l'assistant d'accords intelligent avec guidage harmonique fonctionnel (T/S/D). Survolez les touches du piano pour voir des suggestions d'accords adaptées au contexte et créer des accords complets en un clic ! + +## État du projet + +**K.G.Studio est un projet expérimental encore en phase de développement précoce.** Nous explorons les possibilités d'intégrer des agents IA et des LLM dans les flux de production musicale, en construisant essentiellement une expérience de type « Cursor ou Claude Code pour DAW ». + +Ce projet étudie comment la collaboration entre l'IA et l'humain peut enrichir la création musicale, depuis les suggestions harmoniques intelligentes jusqu'aux tâches d'édition automatisées. En tant que plateforme expérimentale, attendez-vous à des changements fréquents, des fonctionnalités en évolution et une instabilité occasionnelle au fur et à mesure que nous repoussons les limites de la production musicale assistée par l'IA. + +## Vidéos de démonstration + +
+ + + + + + +
+ + K.G.One Music Studio + +
K.G.One Music Studio +
+ + Short Demo + +
Démo courte (DAW uniquement) +
+ + Full Demo + +
Démo complète (DAW uniquement) +
+
+ +## Démarrage rapide + +### Configurer K.G.Studio Musician Assistant + +Il existe deux façons d'utiliser K.G.Studio Musician Assistant : **Local LLM (Browser)**, qui s'exécute entièrement dans votre navigateur sans clé API, sans coût et sans que les données quittent votre appareil, ou un **fournisseur LLM externe** pour obtenir des réponses de meilleure qualité. + +#### Option A : Local LLM (Browser) — Aucune clé API requise ✦ + +K.G.Studio peut exécuter **Gemma 4 E4B** directement dans votre navigateur grâce à l'accélération WebGPU. Aucun appel API n'est effectué, aucun coût n'est engagé et vos données ne quittent jamais votre machine. + + - Cliquez ici pour commencer à utiliser l'application en ligne : [K.G.Studio (kgaudiolab.github.io/kgstudio)](https://kgaudiolab.github.io/kgstudio) + - Dans **Settings ⚙️ → General → LLM Provider**, sélectionnez **Local LLM (Browser)** (option par défaut). + - Le modèle (~2.8 GB) se télécharge automatiquement la première fois que vous ouvrez le chat et est mis en cache dans l'OPFS (Origin Private File System) de votre navigateur pour des lancements ultérieurs quasi instantanés. + - Vous pouvez également configurer la **Context Length** (32k / 64k / 128k tokens) ; des valeurs plus élevées nécessitent davantage de VRAM. + - Commencez à discuter ! Pas de clé, pas de compte, pas de trafic réseau après le téléchargement initial du modèle. + +**Conditions pour Local LLM :** un navigateur compatible WebGPU (Chrome 113+ ou Edge 113+) exécuté dans un contexte sécurisé (HTTPS ou localhost). Matériel recommandé : un GPU avec au moins 8 GB de VRAM, ou un système avec au moins 16 GB de mémoire unifiée. + +> **Remarque :** la qualité du modèle local ne peut pas être comparée à celle des modèles commerciaux de type GPT ou Claude. Pour des tâches d'édition musicale complexes, un fournisseur externe produira en général de meilleurs résultats. + +#### Option B : Fournisseur LLM externe (meilleure qualité) + + - Cliquez ici pour commencer à utiliser l'application en ligne : [K.G.Studio (kgaudiolab.github.io/kgstudio)](https://kgaudiolab.github.io/kgstudio) + - [Cliquez ici pour obtenir une clé API OpenRouter gratuite](https://openrouter.ai/keys) (vous pouvez avoir besoin d'un compte OpenRouter). + - Dans **Settings ⚙️ → General → LLM Provider**, sélectionnez **OpenAI Compatible**. + - Dans **OpenAI Compatible Server → Key**, collez votre clé. (Remarque : hors localhost, votre clé n'est pas persistée par défaut pour des raisons de sécurité ; vous pouvez activer « Persist API Keys on Non-Localhost » dans les paramètres pour la persister, mais cela peut augmenter le risque XSS.) + - Dans **OpenAI Compatible Server → Model**, saisissez `openai/gpt-oss-120b:free`. (Remarque : il s'agit d'un modèle gratuit ; les modèles non gratuits peuvent nécessiter une facturation ; les fournisseurs de modèles gratuits peuvent collecter vos données, consultez la page du modèle pour plus de détails ; ce projet **n'est pas** affilié à OpenRouter ni à aucun fournisseur de modèles.) + - Dans **OpenAI Compatible Server → Base URL**, saisissez `https://openrouter.ai/api/v1`. + +**Conseils :** +- Vous pouvez également utiliser l'API officielle d'OpenAI, d'autres services compatibles OpenAI, ou un serveur LLM auto-hébergé (par exemple Ollama, vLLM). Notez que la qualité des modèles varie : tous les modèles ne sont pas aussi performants pour les tâches d'édition musicale. Pour l'hébergement local, nous recommandons `qwen3.5-35b-a3b` comme bon équilibre entre qualité de génération et exigences matérielles. +- Si vous disposez d'un abonnement actif chez OpenAI ou chez un autre fournisseur LLM, vous pouvez utiliser [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) pour exécuter un serveur proxy local qui achemine les requêtes via votre abonnement existant, sans nécessiter de clé API séparée. + +### Opérations DAW de base + - Double-cliquez (ou maintenez Ctrl/Cmd et cliquez) sur une piste pour créer une région. + - Faites glisser les bords de la région pour la redimensionner ; faites glisser son corps pour la déplacer. + - Cliquez sur le petit crayon en haut à gauche d'une région pour ouvrir le piano roll. + - Dans le piano roll, double-cliquez (ou Ctrl/Cmd+clic) pour créer une note. + - Cliquez pour sélectionner ; Shift+clic pour la multi-sélection ; glissez pour faire une sélection rectangulaire. + - Faites glisser les bords de la note pour la redimensionner ; faites glisser le corps de la note pour déplacer les notes sélectionnées. + - Utilisez Snapping dans la barre d'outils du piano roll (en haut à droite) pour quantifier sur la grille. + +### Utiliser K.G.Studio Musician Assistant + - Sélectionnez la région musicale sur laquelle vous souhaitez que l'assistant travaille, saisissez votre prompt dans le chat ; appuyez sur Enter pour envoyer, Shift+Enter pour insérer une nouvelle ligne. + - L'agent traitera automatiquement votre demande et invoquera des outils pour effectuer des modifications limitées à la région sélectionnée. Une tâche peut nécessiter un ou plusieurs tours pour être accomplie. + - Notez que l'IA peut se tromper ; vous devez donc toujours vérifier le résultat et l'ajuster si nécessaire. Vous pouvez également utiliser annulation/rétablissement pour revenir sur les changements. + - Cliquez sur le bouton « + » ou utilisez la commande `/clear` pour effacer l'historique du chat. + +### Plus de détails + +Vous trouverez le guide utilisateur détaillé [ici](./docs/USER_GUIDE.md). + +### Points forts +- **K.G.Studio Musician Assistant** : discutez avec l'agent IA alimenté par un LLM ; il exécute automatiquement des outils pour effectuer des modifications musicales dans la région sélectionnée. +- **LLM intégré au navigateur — aucune clé API requise** : exécutez **Gemma 4 E4B** entièrement dans votre navigateur via WebGPU (LiteRT-LM). Aucun appel API, aucun coût, aucune donnée quittant votre appareil. Le modèle est téléchargé une fois et mis en cache localement. +- **Séparation de stems intégrée au navigateur — aucun serveur requis** : séparez n'importe quelle région audio en stems avec **UVR-MDX-NET-Inst_HQ_3** (2 stems : Vocals / Instrumental) ou **Demucs htdemucs_4s** (4 stems : Vocals / Drums / Bass / Others), tous deux entièrement exécutés dans le navigateur via ONNX Runtime WebGPU, sans serveur K.G.One. +- **Détection d'accords audio** : ouvrez le piano roll sur une région audio et lancez **Detect Chords** pour analyser automatiquement l'enregistrement et remplir la Chord Track globale avec un pipeline FFT sans dépendance, avec sensibilité, stabilité et détection des accords de septième configurables. +- **Détection de tempo avec alignement automatique des temps** : lancez **Detect Tempo** depuis la barre d'outils du piano roll pour analyser le BPM d'une région audio et, si vous le souhaitez, réaligner la Tempo Track du projet. +- **Système de pistes globales** : quatre pistes globales persistantes — **Marker**, **Tempo**, **Key Signature** et **Chord** — fournissent une structure à l'échelle du projet à laquelle toutes les fonctions (timing de lecture, détection d'accords, notation musicale) se réfèrent. +- **Intégration K.G.One Music Studio** : lorsqu'il est connecté à un serveur local [K.G.One](https://github.com/KGAudioLab/K.G.One), vous débloquez la **Full Song Generation** accélérée par GPU (ACE-Step 1.5), la **Clip & MIDI Loop Generation** (Foundation-1) et des modèles supplémentaires de **Stem Separation**. +- **Plusieurs fournisseurs LLM** : OpenAI, Claude / Gemini (via OpenRouter), services compatibles OpenAI (Ollama, vLLM, etc.), ou Local Browser LLM intégré — sans clé requise. +- **Édition de pistes et de régions** : ajouter/réordonner des pistes, créer/déplacer/redimensionner des régions, multi-sélection avec lasso, déplacement/redimensionnement de groupe, fusion et scission de régions, avec annulation/rétablissement complet. +- **Piano roll** : notes, pitch bend et lanes d'automation MIDI CC ; vue de notation musicale (sheet music) via VexFlow ; superposition de spectrogramme pour la référence audio-vers-MIDI. +- **Vrais instruments** : sampler basé sur Tone.js avec soundfonts FluidR3 de haute qualité. Enregistrez directement l'audio depuis votre microphone vers une piste audio. +- **Assistant d'accords intelligent** : suggestions d'accords en temps réel basées sur l'harmonie fonctionnelle (T/S/D), avec aperçu visuel et création d'accord en un clic. +- **Persistance avec confidentialité** : projets et configuration enregistrés entièrement dans votre navigateur (OPFS / IndexedDB). Aucun serveur propriétaire. + +Pour une vue technique plus approfondie, voir [overview.md](./docs/technical/overview.md). + +## Premiers pas + +### Ou cloner et exécuter localement : +```bash +# Assurez-vous d'avoir Node.js >= 20.19.3 installé +# Cloner le dépôt +git clone https://github.com/KGAudioLab/KGStudio {your-local-path} +cd {your-local-path} + +# Installer les dépendances +npm install + +# Lancer le serveur de développement +npm run dev +``` + +## Configuration + +K.G.Studio charge ses valeurs par défaut depuis `./public/config.json` (avec une valeur de secours interne) et persiste les modifications utilisateur dans le navigateur via `ConfigManager` + IndexedDB. IndexedDB est la base de données locale propre à votre navigateur, stockée sur votre appareil ; elle ne quitte pas votre machine et est effacée si vous supprimez les données de ce site. Modifiez les paramètres via le panneau Settings intégré à l'application. + +- **General** + - Fournisseur LLM : OpenAI, ou compatible OpenAI + - Clés API et modèles pour le fournisseur sélectionné + - Persist API Keys on Non-Localhost : permet de persister les clés API dans des environnements non localhost (option de sécurité volontaire, non recommandée pour les environnements partagés ou de production) + - Base URL compatible OpenAI (pour les passerelles auto-hébergées) + - Base URL des soundfonts (CDN pour les échantillons d'instruments) +- **Behavior** + - Ouverture du chat par défaut au démarrage +- **Templates** + - Instructions personnalisées utilisées par l'assistant IA + +### Connectivité et confidentialité + +- K.G.Studio fonctionne entièrement côté client. Aucun serveur propriétaire n'est nécessaire pour faire fonctionner l'application. +- Les projets et fichiers audio sont stockés dans l'OPFS (Origin Private File System) de votre navigateur ; la configuration est stockée dans IndexedDB. Toutes les données restent sur votre appareil. +- L'accès réseau est utilisé uniquement pour : + - télécharger les échantillons d'instruments depuis le CDN de soundfonts configuré + - communiquer avec le fournisseur LLM que vous avez choisi (par exemple OpenAI ou des services compatibles OpenAI) +- En dehors de ces deux cas, l'application fonctionne localement. Si vous bloquez ces points d'accès, l'application se charge toujours ; la lecture des instruments et les fonctions IA ne fonctionneront pas tant que l'accès réseau ne sera pas rétabli. +- Pour des raisons de sécurité, lorsque l'application est exécutée depuis un hôte non local, nous ne persistons pas votre clé API dans IndexedDB par défaut (afin de réduire le risque XSS). Vous devrez la saisir à chaque démarrage de K.G.Studio. Pour activer la persistance sur des hôtes non locaux, activez « Persist API Keys on Non-Localhost » dans les paramètres (non recommandé pour les environnements partagés ou de production). + +## Utiliser l'application + +Vous trouverez le guide utilisateur détaillé [ici](./docs/USER_GUIDE.md). + +- Pistes + - Ajoutez, renommez et réordonnez les pistes depuis le panneau d'informations des pistes. + - Changez d'instrument avec le bouton d'instrument (icône de piano) ; ajustez Solo (S), Mute (M) et Volume. + - Supprimez une piste depuis le menu des paramètres de la piste (bouton à droite de l'instrument). + +- Régions + - Créer une région : avec l'outil Pointer, double-cliquez ; ou maintenez Ctrl/Cmd et cliquez. Avec l'outil Pencil, cliquez une seule fois. + - Déplacer/redimensionner : faites glisser le corps pour déplacer ; faites glisser les bords pour redimensionner. + - Ouvrez le Piano Roll via le petit crayon en haut à gauche d'une région. + +- Piano Roll (notes MIDI) + - Outils : Select vs Pencil. + - Créer des notes : double-cliquez ou Ctrl/Cmd+clic (Select) ; clic simple (Pencil). + - Sélectionner des notes : clic ; Shift+clic pour la multi-sélection ; glisser pour la sélection rectangulaire. + - Déplacer/redimensionner : faites glisser le corps de la note pour déplacer les notes sélectionnées ; faites glisser les bords pour redimensionner. + - **Vue en notation musicale** : basculez entre les vues Piano Roll et Staff Notation depuis la barre d'outils du piano roll. Prend en charge la sélection automatique de la clé, l'affichage de l'armure, le groupement des crochets, les liaisons et la quantification configurable. Activez **Track Scope** pour afficher toutes les régions de la piste comme une partition continue. + - **Lanes d'automation** : dessinez et modifiez des courbes de pitch bend et de MIDI CC (Modulation, Breath, Volume, Expression, Sustain) dans la lane éditable sous la grille piano. + - **Mode spectrogramme** : affichez le spectrogramme d'une région audio dans le piano roll comme couche de référence pendant l'édition des notes MIDI. + - Fermez le piano roll avec X ou ESC. + +- Intelligent Chord Assistant (ajouté le 2025-12-15) + - Activez le guide d'accords depuis la barre d'outils du piano roll : sélectionnez la fonction T (Tonic), S (Subdominant) ou D (Dominant). + - Survolez n'importe quelle touche pour voir les suggestions d'accords adaptées au contexte, mises en évidence en rouge, en accord avec l'armure et le mode sélectionnés. + - Appuyez sur Tab pour faire défiler différents renversements d'accords pour la même fonction harmonique. + - Double-cliquez (ou Ctrl/Cmd+clic) sur un accord surligné pour créer toutes les notes d'un coup. + - La longueur de l'accord correspond automatiquement à la dernière longueur de note modifiée pour conserver un rythme cohérent. + +- Snapping et quantification + - Définissez le snapping depuis le menu NO SNAP (en haut à droite). + - Quantifiez le timing avec Qua. Pos. (début) et Qua. Len. (longueur). + +- Lecture et tête de lecture + - Retour au début ; lecture/pause depuis la barre d'outils. + - Placez la tête de lecture en cliquant sur les numéros de mesure dans la grille principale ; dans Piano Roll, cliquez sur l'en-tête de la timeline (respecte le snapping). + - Modifiez le BPM, la signature rythmique et la tonalité via les indicateurs de la barre d'outils. + +## Raccourcis clavier + +- Principal + - Lecture/Pause : Space + - Annuler / Rétablir : Ctrl/Cmd+Z / Ctrl/Cmd+Shift+Z + - Copier / Couper / Coller : Ctrl/Cmd+C / Ctrl/Cmd+X / Ctrl/Cmd+V + - Sauvegarder : Ctrl/Cmd+S + - Maintenir pour créer une région : Ctrl/Cmd +- Piano Roll + - Outils : Select (Q), Pencil (W) + - Maintenir pour créer une note : Ctrl/Cmd + - Snap : 1(None), 2(1/4), 3(1/8), 4(1/16) + - Quantification de position : 5(1/4), 6(1/8), 7(1/16) + - Quantification de longueur : 8(1/4), 9(1/8), 0(1/16) + +## Assistant IA + +### Utiliser K.G.Studio Musician Assistant + +- Assurez-vous d'avoir suivi la section précédente pour configurer le fournisseur LLM. +- Vous trouverez la zone de chat de K.G.Studio Musician Assistant à droite. Si vous ne la voyez pas, cliquez sur le bouton Chat 🗨️ dans la barre d'outils. +- Sélectionnez la région sur laquelle vous souhaitez que l'assistant travaille, saisissez votre prompt dans le chat ; appuyez sur Enter pour envoyer, Shift+Enter pour insérer une nouvelle ligne. +- L'agent traitera automatiquement votre demande et invoquera des outils pour effectuer des modifications limitées à la région sélectionnée. Une tâche peut nécessiter un ou plusieurs tours pour être accomplie. +- Notez que l'IA peut se tromper ; vous devez donc toujours vérifier le résultat et l'ajuster si nécessaire. Vous pouvez aussi utiliser annulation/rétablissement pour revenir en arrière. +- Cliquez sur le bouton « + » ou sur la commande `/clear` pour effacer l'historique du chat. + +### Configurer votre fournisseur LLM + +Allez dans **Settings ⚙️ → General → LLM Provider**. Selon le fournisseur choisi, vous devrez fournir la clé API appropriée et, le cas échéant, une base URL personnalisée (pour les services non officiels compatibles OpenAI comme Ollama, OpenRouter, etc.). + +Remarque : en raison des limitations CORS chez certains fournisseurs, Google Gemini et Anthropic Claude ne sont actuellement pris en charge que via OpenRouter. + +### Utiliser les modèles OpenAI + +1. Obtenez une clé API OpenAI auprès de [**OpenAI**](https://platform.openai.com/account/api-keys). Vous devrez peut-être créer un compte et ajouter un moyen de paiement pour générer une clé API. +2. Dans **Settings ⚙️ → General → LLM Provider**, sélectionnez **OpenAI** comme fournisseur. +3. Saisissez votre clé API dans **OpenAI → Key**. +4. Sélectionnez votre modèle préféré dans la liste **OpenAI → Model**. Pour un bon équilibre entre performances et coût, nous recommandons `gpt-5.4-mini`. +5. Vous pouvez également choisir d'activer Flex Mode dans **OpenAI → Flex Mode**. Flex Mode offre un tarif réduit, mais peut entraîner des temps de réponse plus lents ou des erreurs côté serveur. + +### Utiliser OpenRouter + +OpenRouter est une plateforme qui fournit un accès unifié à un large éventail de modèles de langage, y compris des options gratuites, provenant de divers fournisseurs. Cela facilite l'expérimentation et la recherche du modèle le mieux adapté à vos besoins. + +1. Obtenez une clé API auprès de [**OpenRouter**](https://openrouter.ai/keys). L'inscription est requise ; pour les modèles payants, un moyen de paiement peut également être nécessaire. +2. Dans **Settings ⚙️ → General → LLM Provider**, sélectionnez **OpenAI Compatible** comme fournisseur. +3. Saisissez votre clé API dans **OpenAI Compatible Server → Key**. +4. Parcourez les modèles disponibles sur la [**page des modèles OpenRouter**](https://openrouter.ai/models). Utilisez le filtre « Prompt Pricing » pour identifier les modèles gratuits. + **Remarque :** chaque fournisseur de modèle peut avoir des politiques différentes en matière de conservation des données et de confidentialité. Veuillez les consulter avant utilisation. +5. Saisissez le nom du modèle choisi dans **OpenAI Compatible Server → Model**. Les séries recommandées comprennent : + - `Anthropic: Claude Sonnet 4.6` (`anthropic/claude-sonnet-4.6`: [Link](https://openrouter.ai/anthropic/claude-sonnet-4.6)) — meilleur équilibre qualité/coût pour la série Claude + - `Qwen: Qwen3.5-35B-A3B` (`qwen/qwen3.5-35b-a3b`: [Link](https://openrouter.ai/qwen/qwen3.5-35b-a3b)) — modèle open source recommandé + - `Qwen: Qwen3-Next-80B-A3B` (MODÈLE GRATUIT : `qwen/qwen3-next-80b-a3b-instruct:free`: [Link](https://openrouter.ai/qwen/qwen3-next-80b-a3b-instruct:free)) — modèle gratuit recommandé + - `OpenAI: GPT-OSS 120B` (MODÈLE GRATUIT : `openai/gpt-oss-120b:free`: [Link](https://openrouter.ai/openai/gpt-oss-120b:free)) — modèle gratuit recommandé + - Remarque : les fournisseurs de modèles gratuits peuvent collecter vos données ; consultez la page du modèle avant utilisation + - Remarque : la disponibilité des modèles gratuits change fréquemment ; pour les options gratuites les plus récentes, consultez la [page des modèles OpenRouter](https://openrouter.ai/models) et utilisez le filtre **Prompt Pricing** +6. Saisissez l'URL de base `https://openrouter.ai/api/v1` dans **OpenAI Compatible Server → Base URL**. + +### À propos de l'agent et des fournisseurs LLM + +Pour des raisons de sécurité, lorsque vous utilisez K.G.Studio depuis un hôte non local, les clés API ne sont pas persistées dans IndexedDB par défaut ; vous devrez donc saisir votre clé API à chaque démarrage de K.G.Studio. Pour activer la persistance sur des hôtes non locaux, activez « Persist API Keys on Non-Localhost » dans les paramètres (non recommandé pour les environnements partagés ou de production). + +K.G.Studio ne fournit ni n'héberge aucun des modèles listés ci-dessus et n'est affilié à aucun fournisseur de modèles. Toutes les données sont stockées localement sur votre appareil ; K.G.Studio ne collecte ni ne transmet vos données. Vous êtes seul responsable de toute donnée que vous fournissez à des fournisseurs de modèles tiers. + +## K.G.One Music Generator + +> **Nécessite l'intégration de [K.G.One Music Studio](https://github.com/KGAudioLab/K.G.One).** Le panneau K.G.One Music Generator n'est disponible que lorsque K.G.Studio est connecté à un serveur K.G.One en fonctionnement. Consultez le [dépôt K.G.One](https://github.com/KGAudioLab/K.G.One) pour les instructions d'installation. + +Le panneau **K.G.One Music Generator** fournit trois outils IA accélérés par GPU pour la génération musicale et le traitement audio. Cliquez sur le bouton **✦ (baguette magique)** dans la barre d'outils pour l'ouvrir. Le panneau est mutuellement exclusif avec la zone de chat AI Assistant : l'ouverture de l'un ferme l'autre. + +> **Remarque :** la première fois que vous utilisez chaque outil, le serveur doit charger le modèle IA correspondant, ce qui peut prendre 60 secondes ou plus selon votre matériel. Changer d'onglet peut également déclencher un rechargement du modèle. + +### Full Song Generation + +Générez une chanson complète de longue durée à partir d'une description textuelle et de paroles facultatives. Alimenté par [ACE-Step 1.5](https://github.com/ace-step/ACE-Step-1.5). + +- Dans l'onglet **Full Song**, saisissez un **Caption** décrivant le style, l'ambiance, le tempo, l'instrumentation et la structure souhaités en langage naturel. Exemple : `Genre: Eurodance, 90s dance-pop, upbeat electronic. Tempo: ~130 BPM. Instrumentation: driving kick drum, eurodance bassline...` +- Vous pouvez éventuellement saisir des **Lyrics**. Utilisez les balises `[Intro]`, `[Verse]`, `[Chorus]`, `[Bridge]` pour marquer les sections. Cochez **Instrumental** pour ne pas générer de voix. +- Cliquez sur **Generate Song**. Un indicateur de progression affiche en temps réel l'étape de génération et le pourcentage. +- Une fois la génération terminée, un lecteur de prévisualisation apparaît. Faites-le glisser sur une **audio track** pour importer le morceau comme région. +- Le glisser-déposer sur une piste MIDI n'est pas pris en charge pour la génération de morceau complet. +- **Advanced Settings** (dépliable) : Inference Steps, Guidance Scale, Seed, et Thinking (CoT metadata generation). + +### Clip Generation + +Générez de courts clips instrumentaux et des boucles MIDI à partir de descriptions textuelles. Alimenté par [Foundation-1](https://huggingface.co/RoyalCities/Foundation-1). + +- Dans l'onglet **Clip**, saisissez un **Prompt** décrivant le clip à l'aide de tags séparés par des virgules couvrant la famille d'instruments, le sous-type, le timbre, les effets, la longueur, le BPM et la tonalité. Exemple : `Gritty, Acid, Bassline, 303, Synth Lead, FM, Sub, High Reverb, 8 Bars, 140 BPM, E minor` +- Vous pouvez éventuellement saisir un **Negative Prompt** pour éloigner la génération de caractéristiques non désirées (par ex. `distortion, noise`). +- Sélectionnez **Bars** : 4 ou 8. Le BPM et la tonalité sont préremplis à partir des paramètres de votre projet et peuvent être ajustés dans **Advanced Settings**. +- Cliquez sur **Generate Clip**. Une fois terminé, un lecteur de prévisualisation apparaît avec une poignée de glisser à gauche et un bouton de téléchargement à droite. +- **Pour importer** : faites glisser le lecteur sur une piste de la timeline. + - Déposez-le sur une **audio track** pour l'importer comme région audio WAV (recommandé). + - Déposez-le sur une **MIDI track** pour l'importer comme région MIDI. Notez que le MIDI est transcrit depuis l'audio et peut ne pas être parfaitement exact. +- **Advanced Settings** (dépliable) : Note, Scale, BPM, Steps, CFG Scale, Seed (`-1` pour aléatoire), Sampler Type, Sigma Min/Max, et CFG Rescale. + +### Stem Separation + +Séparez une région audio existante en stems individuels (par exemple voix, instruments, batterie). + +K.G.Studio prend en charge **deux modes** de séparation de stems : + +#### Mode navigateur local — Aucun serveur requis ✦ + +Deux modèles ONNX s'exécutent entièrement dans votre navigateur, sans appels API, sans coût, et sans que vos données quittent votre appareil. Les modèles sont téléchargés une fois puis mis en cache localement. + +- **Vocal and Instrument (Medium Accuracy)** (`UVR-MDX-NET-Inst_HQ_3`, ~64 MB) — séparation en deux stems (Vocals / Instrumental). Alimenté par [UVR-MDX-NET](https://github.com/nomadkaraoke/python-audio-separator). +- **Vocal, Drums, Bass, and Others** (`htdemucs_4s`, ~172 MB) — séparation en quatre stems (Vocals / Drums / Bass / Others). Alimenté par [Demucs](https://github.com/facebookresearch/demucs). + +Ouvrez le panneau **Music Generator** (bouton ✦ dans la barre d'outils), sélectionnez un modèle, cliquez une fois sur **Download Selected Model**, puis sur **Separate Stems** : tout s'exécute localement dans votre navigateur. + +**Conditions requises :** un navigateur compatible WebGPU (Chrome 113+ ou Edge 113+) dans un contexte sécurisé (HTTPS ou localhost). L'accélération WebGPU est utilisée lorsque disponible ; sinon, le système revient au CPU (ce qui peut réduire la réactivité de la page pendant le traitement). Matériel recommandé : un GPU avec au moins 8 GB de VRAM, ou un système avec au moins 16 GB de mémoire unifiée. + +#### Mode serveur K.G.One + +Lorsqu'il est connecté à un serveur [K.G.One Music Studio](https://github.com/KGAudioLab/K.G.One), trois modèles supplémentaires accélérés par GPU sont disponibles. Alimenté par [python-audio-separator (UVR5)](https://github.com/nomadkaraoke/python-audio-separator). + +- **Vocal and Instrument (Medium Accuracy)** (`UVR-MDX-NET-Inst_HQ_3`) — séparation rapide en deux stems (vocal / instrumental). +- **Vocal and Instrument (High Accuracy)** (`MDX23C-8KFFT-InstVoc_HQ`) — séparation en deux stems de meilleure qualité, plus lente. +- **Vocal, Drums, Bass, Guitar, Piano, and Others** (`htdemucs_6s`) — séparation complète en six stems. + +#### Utilisation (dans les deux modes) + +- **Sélectionnez une région audio** sur la timeline avant d'ouvrir cet onglet. La région sélectionnée et le nom de sa piste sont affichés en haut de l'onglet **Separator**. Seules les régions audio sont prises en charge ; les régions MIDI ne peuvent pas être séparées. +- Cliquez sur **Separate Stems**. Si la région sélectionnée a un clip start offset ou a été découpée, l'audio est automatiquement tronqué pour correspondre à la plage de la région avant traitement. +- Une fois terminé, chaque stem apparaît comme lecteur de prévisualisation étiqueté avec une poignée de glisser. Vous pouvez prévisualiser chaque stem individuellement avant l'import. +- **Pour importer les stems :** + - Faites glisser chaque lecteur de stem individuellement sur une **audio track** pour le placer où vous le souhaitez. + - Ou cliquez sur **Import All Stems to Timeline** pour créer automatiquement une nouvelle piste audio par stem, positionnée juste sous la piste source et alignée sur le même point de départ que la région d'origine. Il s'agit d'une seule opération annulable. + +## Fonctionnalités à venir + +Les priorités peuvent évoluer. + +### 1.0 + +- [X] Plus d'instruments +- [X] Tests automatisés (tests unitaires, tests d'intégration, etc.) +- [X] Assistant d'accords intelligent avec guidage harmonique fonctionnel (T/S/D) +- [X] Prise en charge des automations de contrôle de piste (par ex. sustain, volume, pan, etc.) +- [X] Prise en charge des événements de contrôle MIDI (par ex. CC, pitch bend, etc.) +- [X] Prise en charge des pistes audio WAV +- [X] Enregistrement +- [X] Event List +- [X] Ajout de la prise en charge des modèles open source d'OpenAI (`gpt-oss-20b` et `gpt-oss-120b`) +- [X] Notation musicale +- [X] Intégration K.G.One Music Studio +- [X] Modèles IA intégrés au navigateur (LLM sur l'appareil via Gemma 4 E4B ; séparation de stems sur l'appareil via UVR-MDX-NET-Inst_HQ_3 et htdemucs_4s) +- [X] Système de pistes globales (Marker, Tempo, Key Signature, Chord) +- [X] Détection d'accords audio (FFT sans dépendance, remplit la Chord Track) +- [X] Détection de tempo avec alignement automatique des temps +- [X] Visualisation spectrogramme et Piano Roll hybrid mode + +### Après la 1.0 + +- [ ] Extension des outils de l'agent IA pour manipuler directement depuis le chat les régions, les pistes et les pistes globales (progressions d'accords, tempo, tonalité) +- [ ] Vue Mixer avec panneau dédié, faders par piste, sends, bus de retour et canal master +- [ ] EQ et channel strip avec égaliseur paramétrique et compresseur par piste +- [ ] Filtres et effets, comme réverbération, délai et autres effets d'insertion natifs WebAudio +- [ ] Audio time-stretch / warp pour étirer les régions audio et les adapter au tempo du projet +- [ ] Effets MIDI, comme arpégiateur, quantificateur de gamme et mémoire d'accords +- [ ] Sortie vers périphérique MIDI virtuel + +## Aide recherchée + +Nous cherchons des contributeurs pour rendre K.G.Studio encore meilleur ! Que vous soyez développeur, musicien ou designer, votre expertise peut faire une réelle différence. + +### Comment vous pouvez aider + +**🎵 Musiciens & producteurs** +- Tester la DAW avec de vrais workflows de production musicale +- Donner des retours sur la qualité et le réalisme des instruments +- Suggérer des fonctionnalités manquantes essentielles à la création musicale +- Aider à améliorer la compréhension musicale de l'assistant IA + +**💻 Développeurs** +- Implémenter de nouvelles fonctionnalités de notre feuille de route +- Corriger des bugs et améliorer les performances +- Renforcer l'intégration Web Audio +- Travailler sur les capacités de l'assistant IA + +**🎨 Designers UI/UX** +- Améliorer l'interface utilisateur et le workflow +- Concevoir un meilleur retour visuel pour l'édition musicale +- Créer des interactions plus intuitives + +### Participer + +Intéressé par une contribution ? Nous serions ravis d'avoir de vos nouvelles ! + +- **Écrivez-nous** : [kgstudio@duck.com](mailto:kgstudio@duck.com) +- **Consultez nos Issues** : parcourez les tickets ouverts avec les labels `help wanted` ou `good first issue` +- **Rejoignez les Discussions** : partagez vos idées et retours dans GitHub Discussions + +Aucune contribution n'est trop petite : du signalement de bugs à la proposition de nouvelles fonctionnalités, chaque aide fait avancer le projet. + +### Avertissement + +K.G.Studio est un projet expérimental en phase de développement précoce. Nous explorons les possibilités d'intégrer des agents IA et des LLM dans les flux de production musicale, en construisant essentiellement une expérience de type « Cursor ou Claude Code pour DAW ». + +Ce projet étudie comment la collaboration entre l'IA et l'humain peut enrichir la création musicale, depuis les suggestions harmoniques intelligentes jusqu'aux tâches d'édition automatisées. En tant que plateforme expérimentale, attendez-vous à des changements fréquents, des fonctionnalités en évolution et une instabilité occasionnelle à mesure que nous repoussons les limites de la production musicale assistée par l'IA. + +K.G.Studio ne fournit ni n'héberge aucun modèle LLM et n'est affilié à aucun fournisseur de modèles. Toutes les données sont stockées localement sur votre appareil ; K.G.Studio ne collecte ni ne transmet vos données. Vous êtes seul responsable de toute donnée que vous fournissez à des fournisseurs de modèles tiers. + +## Licence + +Ce projet est distribué sous Apache License, Version 2.0, avec des conditions supplémentaires (voir `LICENSE`) : +- Aucune demande de brevet à partir de ce logiciel ou de ses ressources +- Attribution requise en cas d'utilisation dans des produits publics/commerciaux (« Powered by K.G.Studio ») + +Les notices tierces (FluidR3_GM SoundFont, midi-js-soundfonts, VexFlow, prompt structure notes, Gemma 4 E4B, UVR-MDX-NET-Inst_HQ_3, MediaPipe, Meyda, web-audio-beat-detector, tonal, htdemucs_4s, onnxruntime-web et demucs-web) sont incluses dans `LICENSE`. diff --git a/README-zh_cn.md b/README-zh_cn.md new file mode 100644 index 0000000..a77f733 --- /dev/null +++ b/README-zh_cn.md @@ -0,0 +1,455 @@ +[English](./README.md) | [Français](./README-fr.md) | 简体中文 | [繁體中文](./README-zh_hk.md) + +
+ K.G.Studio Logo +
+ +# K.G.Studio — 一款基于浏览器的 DAW,并内置 AI 助手 + +
+

◀ 立即在浏览器中在线使用 K.G.Studio ▶

+
+ +## 新动态 + +> ### ✦ [K.G.One Music Studio 现已发布。](https://github.com/KGAudioLab/K.G.One) ✦
+> [**K.G.One Music Studio**](https://github.com/KGAudioLab/K.G.One) 是一个完全本地、开源的一体化平台,以 **K.G.Studio**(本项目)为核心。它集成了用于整曲生成的 [ACE-Step 1.5](https://github.com/ace-step/ACE-Step-1.5)、用于音频片段和 MIDI loop 生成的 [Foundation-1](https://huggingface.co/RoyalCities/Foundation-1),以及用于分轨的 [python-audio-separator (UVR5)](https://github.com/nomadkaraoke/python-audio-separator),将 GPU 加速的 AI 音乐生成能力直接带入您的浏览器音乐制作工作流。 + +## 什么是 K.G.Studio? + +K.G.Studio 是一款轻量、现代化的 DAW,完全运行于浏览器中,并以 **K.G.Studio 音乐创作助手** 为核心。它提供基于 Tone.js sampler 的真实乐器回放、钢琴卷帘编辑器、支持完整撤销/重做的音轨与区域管理、基于 OPFS(Origin Private File System)的项目持久化、可配置的设置面板,以及可执行工具的内置 AI 助手。 + +**K.G.Studio 音乐创作助手** 是一个面向和声、编曲与音符编辑的 AI 助手,但并不负责整首作品的全自动作曲。 + +
+ K.G.One Logo +
+ +> 注意:整曲生成功能和音频片段生成功能需要集成 [**K.G.One Music Studio**](https://github.com/KGAudioLab/K.G.One)。 + +## 最新更新 + +- **2026.05.30**: 新增 **国际化(i18n)支持** — K.G.Studio 现已提供四种语言版本:**English**、**简体中文**、**繁體中文** 和 **Français**。可在 **设置 ⚙️ → 通用 → 语言** 中配置首选语言,选择 `Auto` 时将自动检测浏览器语言。 + +- **2026.05.27**: + - 新增 **全局轨系统**,引入四条全局轨:**Marker**、**Tempo**、**Key Signature** 和 **Chord**(和弦符号跨度区段)。 + - 新增 **音频和弦检测** 功能。您可以为音频区域或 MIDI 区域打开钢琴卷帘窗口,然后点击“...” -> **Detect Chords**,即可通过零依赖 FFT 流水线自动分析录音内容,并将结果写入 Chord Track;支持灵敏度、稳定性与七和弦检测配置。 + - 新增 **带自动对齐拍点的速度检测** 功能。您可以为音频区域打开钢琴卷帘窗口,然后在工具栏点击“...” -> **Detect Tempo**,分析音频 BPM,并可选择将项目中的 Tempo Track 区段自动重新对齐。 + - 新增 **Demucs 4S** 作为第二个本地浏览器内嵌分轨模型。现有的双 stem UVR-MDX-NET 模型之外,又加入了四 stem 的 `htdemucs_4s` 模型(约 172 MB,vocals / drums / bass / others),两者都可通过 ONNX Runtime WebGPU 完全在浏览器中运行。 + +- **2026.05.15**: 新增 **浏览器内嵌 AI 模型**。现在有两个 AI 模型可完全在浏览器中运行,无需外部服务、无需 API Key,也无需 K.G.One 服务器。**K.G.Studio 音乐创作助手** 新增 **Local LLM (Browser)** 提供方,由 **Gemma 4 E4B** 驱动,并通过 LiteRT-LM 与 WebGPU 加速运行;模型只需下载一次,随后会缓存在 OPFS 中,后续启动几乎可即时使用,同时支持可配置的上下文长度(32 k / 64 k / 128 k tokens)与实时推理性能统计。**Stem separation** 也支持本地运行,基于浏览器内嵌的 **UVR-MDX-NET-Inst_HQ_3** ONNX 模型并使用 WebGPU 加速。您可以打开 **Music Generator** 面板(✦ 按钮),下载模型一次后,即可完全在本机将人声与伴奏分离。以上两项功能都要求浏览器支持 WebGPU(Chrome 113+ 或 Edge 113+)并运行在安全上下文中(HTTPS 或 localhost)。推荐硬件:至少 8 GB 显存的 GPU,或至少 16 GB 统一内存的系统。 + +- **2026.05.10**: 新增 **五线谱视图**。钢琴卷帘现已支持完整的标准乐谱显示模式。您可以通过钢琴卷帘工具栏中的切换按钮在 Piano Roll 和 Sheet Music 视图之间切换。在五线谱模式下,音符会通过 VexFlow 排版,并支持基于当前乐器自动选择谱号(高音或低音)、显示调号、自动符杠分组、跨小节连音线,以及可配置的音值量化。启用 **Track Scope** 后,整条音轨上的所有 MIDI 区域会以连续谱面的形式显示,而不再局限于单个区域。 + +- **2026.05.09**: 新增 **音频录音**。您现在可以直接从麦克风录制到音频轨。录音时会实时增长显示波形预览,停止后该录音会作为标准音频区域写入时间线。另新增 **音频 I/O 设备选择**,您可以在设置中选择偏好的麦克风输入设备和音频输出设备。 + +- **2026.05.08**: 新增 **MIDI 自动化**。您可以在钢琴网格下方的可编辑自动化区域中绘制和编辑 pitch bend 与 MIDI CC 曲线(CC1 Modulation、CC2 Breath、CC7 Volume、CC11 Expression、CC64 Sustain)。同时新增 **轨道级自动化**:每条音轨现在都有专用自动化面板,您可以直接在时间线上查看和编辑同样的曲线。实时 MIDI 控制器输入(如 pitch wheel、CC 踏板)也支持录制与按轨回放,并带有每条自动化轨的插值处理。另新增 **事件列表面板**,这是一个带标签页的侧边栏(Notes / Pitch Bend / Controller),可用于查看与内联编辑当前 MIDI 区域中的全部事件。还新增了 **区域多选**(支持套索与批量移动/缩放)以及 **合并 MIDI 区域**。 +
+ K.G.Studio Logo +
+ +- **2026.05.02**: 新增 **音频轨频谱可视化**。音频区域现在会在时间网格中显示实时频谱叠加层。另新增 **Piano Roll hybrid mode**:当您在 MIDI 区域中打开钢琴卷帘时,可将相邻音频区域的频谱作为参考层显示,从而参照音频形状编辑 MIDI 音符。新增 **钢琴卷帘缩放**,并保留当前视口位置,使画面始终锚定在当前播放头附近。还新增 **区域微调位置**,可用小步长推动区域以实现精确摆放;同时新增跨组件的播放头滚动同步,使主网格与钢琴卷帘在播放期间保持联动。 +- **2026.04.29**: 在 K.G.One Music Generator 面板中新增 **Remix** 和 **Repaint**(由 ACE-Step 1.5 驱动)。**Remix** 可让您用新风格重制现有音频区域,您只需选中音频区域、描述目标风格,并可选填写新歌词,ACE-Step 就会按提示重新演绎歌曲的配器与氛围。**Repaint** 可对歌曲中特定片段进行局部再生成,您可以先在时间线上设置 loop 范围作为重绘窗口,再描述该片段应有的声音效果,其余部分将保持不变。两项功能都支持与其他 K.G.One 标签页相同的导入流程:可在内置播放器中预览、拖拽到音轨上,或点击 **Import Aligned to Source**,自动将结果放置到原始区域下方的新音轨中。 +- **2026.04.24**: 新增 [**K.G.One Music Studio**](https://github.com/KGAudioLab/K.G.One) 集成。当 K.G.Studio 连接到本地 K.G.One 服务器后,**K.G.One Music Generator** 面板(工具栏中的魔杖按钮 ✦)即可启用,其中包含三项 AI 驱动工具:**Full Song Generation**(由 ACE-Step 1.5 驱动,可根据文本提示生成整首歌曲)、**Clip Generation**(由 Foundation-1 驱动,可根据文本生成乐器片段与 MIDI loop),以及 **Stem Separation**(由 python-audio-separator 驱动,可将任意音频拆分为人声、伴奏等多个 stem)。生成的音频和 MIDI 均可即时预览,并可直接拖拽到您的音轨中。K.G.One 完全运行在您自己的机器上(Windows/Linux,需要 CUDA GPU);详细设置说明请参阅 [K.G.One 仓库](https://github.com/KGAudioLab/K.G.One)。 +- **2026.04.11**: 将项目存储从 IndexedDB 迁移到 OPFS(Origin Private File System),并采用基于文件夹的结构,以更好地处理媒体文件。新增音频轨支持,包括 WAV/MP3 导入、回放、循环,以及非破坏性区域裁剪。另新增基于离线渲染的 WAV/MP3 导出功能。 +- **2026.04.05**: 将 AI agent 从基于 XML 的工具调用迁移到原生 OpenAI SDK function calling,以提升可靠性与兼容性。另新增 GPT-5.4 系列等 LLM 模型选项。 +- **2026.01.23**: 实现无缝循环播放。您可以拖动小节编号设置 loop 范围,或通过工具栏中的 Loop 按钮切换循环模式。循环播放基于 `Tone.js` 的原生 loop 机制,可实现采样级精确、无缝衔接的循环。 +- **2025.12.21**: 实现 MIDI 键盘支持。您现在可以连接 MIDI 键盘并直接用其演奏声音。请注意,由于 Safari 和部分其他浏览器对 Web MIDI 接口支持不完整,此功能在这些浏览器中可能无法达到最佳效果。 +- **2025.12.15**: 新增智能和弦助手,支持功能和声指导(T/S/D)。将鼠标悬停在琴键上即可查看上下文相关的和弦建议,并可一键创建完整和弦。 + +## 项目状态 + +**K.G.Studio 是一个仍处于早期开发阶段的实验性项目。** 我们正在探索如何将 AI agent 与 LLM 融入音乐制作工作流,本质上是在构建一种面向 DAW 的 “Cursor 或 Claude Code” 体验。 + +该项目关注 AI 与人类协作如何增强音乐创作过程,从智能和声建议到自动化编辑任务都在探索范围内。作为实验平台,项目会频繁变化,功能将持续演进,并且在我们推进 AI 辅助音乐制作边界的过程中,偶尔出现不稳定情况也是可以预期的。 + +## 演示视频 + +
+ + + + + + +
+ + K.G.One Music Studio + +
K.G.One Music Studio +
+ + Short Demo + +
短演示(仅 DAW) +
+ + Full Demo + +
完整演示(仅 DAW) +
+
+ +## 快速开始 + +### 配置 K.G.Studio 音乐创作助手 + +使用 K.G.Studio 音乐创作助手有两种方式:一种是 **Local LLM (Browser)**,完全在浏览器中运行,无需 API Key、无需费用,且数据不会离开您的设备;另一种是使用 **外部 LLM 提供方**,以获得更高质量的回复。 + +#### 方案 A:Local LLM (Browser) — 无需 API Key ✦ + +K.G.Studio 可以借助 WebGPU 加速,在浏览器中直接运行 **Gemma 4 E4B**。不会产生 API 调用,不会产生费用,您的数据也不会离开本机。 + + - 点击这里开始在线使用应用:[K.G.Studio (kgaudiolab.github.io/kgstudio)](https://kgaudiolab.github.io/kgstudio) + - 在 **设置 ⚙️ → 通用 → LLM 提供方** 中选择 **本地 LLM(浏览器)**(默认选项)。 + - 第一次打开聊天时,模型(约 2.8 GB)会自动下载,并缓存在浏览器的 OPFS(Origin Private File System)中,后续启动几乎可即时使用。 + - 您也可以选择配置 **上下文长度**(32k / 64k / 128k tokens);数值越大,对显存要求越高。 + - 现在就可以开始聊天。除首次下载模型外,无需 Key、无需账号,也无需持续联网。 + +**Local LLM 的要求:** 需要支持 WebGPU 的浏览器(Chrome 113+ 或 Edge 113+),并运行在安全上下文中(HTTPS 或 localhost)。推荐硬件为至少 8 GB 显存的 GPU,或至少 16 GB 统一内存的系统。 + +> **注意:** 本地模型的质量无法与 GPT 或 Claude 系列商业模型相比。对于复杂的音乐编辑任务,外部提供方通常会产生更好的结果。 + +#### 方案 B:外部 LLM 提供方(更高质量) + + - 点击这里开始在线使用应用:[K.G.Studio (kgaudiolab.github.io/kgstudio)](https://kgaudiolab.github.io/kgstudio) + - [点击这里获取免费 OpenRouter API Key](https://openrouter.ai/keys)(您可能需要一个 OpenRouter 账号)。 + - 在 **设置 ⚙️ → 通用 → LLM 提供方** 中选择 **OpenAI Compatible**。 + - 在 **OpenAI Compatible Server → 密钥** 中粘贴您的 Key。(注意:在非 localhost 环境中,出于安全原因,您的 Key 默认不会被持久化;您可以在设置中启用 “Persist API Keys on Non-Localhost” 以允许持久化,但这可能增加 XSS 风险。) + - 在 **OpenAI Compatible Server → 模型** 中输入 `openai/gpt-oss-120b:free`。(注意:这是一个免费模型;非免费模型可能需要付费;免费模型提供方可能会收集您的数据,请查看模型页面中的说明;本项目与 OpenRouter 或任何模型提供方 **没有关联关系**。) + - 在 **OpenAI Compatible Server → 基础 URL** 中输入 `https://openrouter.ai/api/v1`。 + +**提示:** +- 您也可以使用官方 OpenAI API、其他 OpenAI 兼容服务,或自托管 LLM 服务器(如 Ollama、vLLM)。请注意,不同模型的质量差异较大,并非所有模型都同样适合音乐编辑任务。对于本地部署,我们推荐 `qwen3.5-35b-a3b`,它在生成质量与硬件需求之间取得了较好的平衡。 +- 如果您已订阅 OpenAI 或其他 LLM 提供方,可以使用 [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) 运行一个本地代理服务器,通过现有订阅转发请求,而无需单独准备 API Key。 + +### 基本 DAW 操作 + + - 在音轨上双击(或按住 Ctrl/Cmd 并点击)可创建区域。 + - 拖动区域边缘可调整长度;拖动区域主体可移动。 + - 点击区域左上角的小铅笔即可打开钢琴卷帘。 + - 在钢琴卷帘中,双击(或 Ctrl/Cmd+点击)可创建音符。 + - 单击可选择;Shift+单击可多选;拖拽可框选。 + - 拖动音符边缘可调整长度;拖动音符主体可移动已选音符。 + - 使用钢琴卷帘工具栏右上角的 Snapping 功能可将编辑量化到网格。 + +### 使用 K.G.Studio 音乐创作助手 + + - 选中您希望助手处理的音乐区域,在聊天框中输入提示词;按 Enter 发送,按 Shift+Enter 插入换行。 + - agent 会自动处理您的请求,并调用工具,在所选区域范围内执行修改。某些任务可能需要一轮或多轮对话才能完成。 + - 请注意,AI 也可能出错,因此您应始终检查结果,并在必要时自行调整。您也可以通过撤销/重做回退修改。 + - 点击 “+” 按钮或输入 `/clear` 命令可清空聊天历史。 + +### 更多说明 + +您可以在[这里](./docs/USER_GUIDE.md)查看详细用户指南。 + +### 亮点功能 +- **K.G.Studio 音乐创作助手**:与由 LLM 驱动的 AI agent 进行对话;它会自动执行工具,对您所选区域内的音乐内容进行编辑。 +- **浏览器内嵌 LLM,无需 API Key**:通过 WebGPU(LiteRT-LM)在浏览器中直接运行 **Gemma 4 E4B**。无 API 调用、无费用、数据不离开您的设备。模型只需下载一次,随后会缓存在本地。 +- **浏览器内嵌分轨,无需服务器**:使用 **UVR-MDX-NET-Inst_HQ_3**(2-stem:Vocals / Instrumental)或 **Demucs htdemucs_4s**(4-stem:Vocals / Drums / Bass / Others)将任意音频区域拆分为 stems。两者都完全在浏览器中通过 ONNX Runtime WebGPU 运行,无需 K.G.One 服务器。 +- **音频和弦检测**:为音频区域打开钢琴卷帘后运行 **Detect Chords**,即可通过零依赖 FFT 流水线自动分析录音并填充全局 Chord Track,同时支持灵敏度、稳定性和七和弦检测等配置。 +- **带自动对齐拍点的速度检测**:在钢琴卷帘工具栏运行 **Detect Tempo**,即可分析音频区域的 BPM,并可选择自动重新对齐项目的 Tempo Track。 +- **全局轨系统**:四条持久存在的全局轨 **Marker**、**Tempo**、**Key Signature** 和 **Chord** 共同提供项目级结构,所有功能(播放时序、和弦检测、五线谱显示)都会参考它们。 +- **K.G.One Music Studio 集成**:连接本地 [K.G.One](https://github.com/KGAudioLab/K.G.One) 服务器后,可解锁 GPU 加速的 **Full Song Generation**(ACE-Step 1.5)、**Clip & MIDI Loop Generation**(Foundation-1)以及更多 **Stem Separation** 模型。 +- **多种 LLM 提供方**:支持 OpenAI、Claude / Gemini(通过 OpenRouter)、OpenAI 兼容服务(Ollama、vLLM 等),或内置的本地浏览器 LLM,无需 Key。 +- **音轨与区域编辑**:支持添加/重排音轨、创建/移动/缩放区域、套索多选、批量移动/缩放、合并与拆分区域,以及完整撤销/重做。 +- **钢琴卷帘**:支持音符、pitch bend 和 MIDI CC 自动化轨;支持基于 VexFlow 的五线谱视图;支持音频到 MIDI 参考用途的频谱叠加层。 +- **真实乐器**:基于 Tone.js 的 sampler,搭配高质量 FluidR3 soundfonts。您还可以直接从麦克风录制到音频轨。 +- **智能和弦助手**:基于功能和声(T/S/D)提供实时和弦建议,并支持可视预览与一键创建和弦。 +- **兼顾持久化与隐私**:项目和配置完全保存在您的浏览器中(OPFS / IndexedDB)。项目本身不依赖第一方服务器。 + +如需更深入的技术概览,请参阅 [overview.md](./docs/technical/overview.md)。 + +## 开始使用 + +### 或者在本地克隆并运行: +```bash +# 请确保已安装 Node.js >= 20.19.3 +# 克隆仓库 +git clone https://github.com/KGAudioLab/KGStudio {your-local-path} +cd {your-local-path} + +# 安装依赖 +npm install + +# 启动开发服务器 +npm run dev +``` + +## 配置 + +K.G.Studio 会从 `./public/config.json` 加载默认配置(内部也提供回退默认值),并通过 `ConfigManager` + IndexedDB 将用户修改持久化到浏览器中。IndexedDB 是浏览器在您设备上的本地数据库;数据不会离开您的机器,如果您清除此站点的数据,它也会被清除。请通过应用内的设置面板修改配置。 + +- **通用** + - LLM 提供方:OpenAI,或 OpenAI 兼容服务 + - 当前所选提供方对应的 API Key 与模型 + - 在非 localhost 环境持久化 API Key:启用后,可在非 localhost 环境中持久化 API Key(属于安全风险自担选项,不建议在共享或生产环境中开启) + - OpenAI 兼容服务的基础 URL(适用于自托管网关) + - Soundfont 基础 URL(乐器采样 CDN) +- **行为** + - 启动时默认打开聊天框 +- **模板** + - AI 助手使用的自定义指令 + +### 连接性与隐私 + +- K.G.Studio 完全在客户端运行。运行应用不需要任何第一方服务器。 +- 项目和音频文件保存在浏览器的 OPFS(Origin Private File System)中;配置保存在 IndexedDB 中。所有数据都留在您的设备上。 +- 网络访问仅用于: + - 从配置的 soundfont CDN 下载乐器采样 + - 与您选择的 LLM 提供方通信(例如 OpenAI 或 OpenAI 兼容服务) +- 除上述两种情况外,应用均可在本地工作。即使您阻止这些端点,应用仍可加载;但在网络恢复之前,乐器回放和 AI 功能将无法使用。 +- 出于安全考虑,当应用运行在非本地主机环境中时,我们默认不会将您的 API Key 持久化到 IndexedDB(以降低 XSS 风险)。这意味着您每次启动 K.G.Studio 时都需要重新输入。如需在非本地主机环境中启用持久化,请在设置中开启 “Persist API Keys on Non-Localhost”(不建议在共享或生产环境中启用)。 + +## 使用应用 + +您可以在[这里](./docs/USER_GUIDE.md)查看详细用户指南。 + +- 音轨 + - 在轨道信息面板中添加、重命名和重排音轨。 + - 通过乐器按钮(钢琴图标)切换乐器;可调整 Solo(S)、Mute(M)和 Volume。 + - 通过音轨设置菜单删除音轨(位于乐器按钮右侧)。 + +- 区域 + - 创建区域:使用 Pointer 工具时可双击,或按住 Ctrl/Cmd 再点击;使用 Pencil 工具时单击即可。 + - 移动/缩放:拖动区域主体可移动,拖动边缘可调整长度。 + - 通过区域左上角的小铅笔打开 Piano Roll。 + +- 钢琴卷帘(MIDI 音符) + - 工具:Select 与 Pencil。 + - 创建音符:在 Select 模式下双击或 Ctrl/Cmd+点击;在 Pencil 模式下单击。 + - 选择音符:单击;Shift+单击多选;拖拽框选。 + - 移动/缩放:拖动音符主体可移动已选音符;拖动边缘可调整长度。 + - **五线谱视图**:可在钢琴卷帘工具栏中切换 Piano Roll 与 Staff Notation 视图。支持自动谱号选择、调号显示、符杠分组、连音线和可配置量化。启用 **Track Scope** 后会将整条音轨上的所有区域连续渲染为谱面。 + - **自动化轨道**:可在钢琴网格下方的可编辑区域中绘制和编辑 pitch bend 与 MIDI CC 曲线(Modulation、Breath、Volume、Expression、Sustain)。 + - **频谱模式**:可在钢琴卷帘中查看音频区域的频谱,并将其作为编辑 MIDI 音符时的参考层。 + - 可通过 X 或 ESC 关闭钢琴卷帘窗口。 + +- 智能和弦助手(新增于 2025-12-15) + - 在钢琴卷帘工具栏中启用和弦指导:选择 T(Tonic)、S(Subdominant)或 D(Dominant)功能。 + - 将鼠标悬停在任意琴键上时,会以红色高亮显示上下文相关的和弦建议,并匹配您当前选择的调号与调式。 + - 按 Tab 可在同一和声功能下循环切换不同和弦转位。 + - 双击(或 Ctrl/Cmd+点击)高亮和弦可一次性创建整组音符。 + - 和弦长度会自动匹配您最近编辑的音符长度,以保持节奏一致。 + +- 吸附与量化 + - 在右上角的 NO SNAP 菜单中设置吸附。 + - 使用 Qua. Pos.(起始)和 Qua. Len.(长度)进行量化。 + +- 播放与播放头 + - 可通过工具栏回到开头,并执行 Play/Pause。 + - 在主时间网格点击小节编号可设置播放头;在钢琴卷帘中点击顶部时间轴也可设置,并遵守当前吸附设置。 + - BPM、拍号和调号都可以通过工具栏中的数值进行修改。 + +## 键盘快捷键 + +- 主界面 + - 播放/暂停:Space + - 撤销 / 重做:Ctrl/Cmd+Z / Ctrl/Cmd+Shift+Z + - 复制 / 剪切 / 粘贴:Ctrl/Cmd+C / Ctrl/Cmd+X / Ctrl/Cmd+V + - 保存:Ctrl/Cmd+S + - 按住以创建区域:Ctrl/Cmd +- 钢琴卷帘 + - 工具:Select(Q)、Pencil(W) + - 按住以创建音符:Ctrl/Cmd + - 吸附:1(None), 2(1/4), 3(1/8), 4(1/16) + - 位置量化:5(1/4), 6(1/8), 7(1/16) + - 长度量化:8(1/4), 9(1/8), 0(1/16) + +## AI 助手 + +### 使用 K.G.Studio 音乐创作助手 + +- 请先按照前文说明完成 LLM 提供方设置。 +- 您可以在右侧找到 K.G.Studio 音乐创作助手聊天框。如果当前未显示,可点击工具栏中的 Chat 🗨️ 按钮打开。 +- 选中您希望助手处理的区域,在聊天框中输入提示词;按 Enter 发送,按 Shift+Enter 插入换行。 +- agent 会自动处理您的请求,并调用工具,在所选区域范围内执行修改。某些任务可能需要一轮或多轮对话才能完成。 +- 请注意,AI 也可能出错,因此您应始终检查结果,并在必要时自行调整。您也可以通过撤销/重做回退修改。 +- 点击 “+” 按钮或输入 `/clear` 命令可清空聊天历史。 + +### 配置您的 LLM 提供方 + +进入 **设置 ⚙️ → 通用 → LLM 提供方**。根据您选择的提供方,您需要填写对应的 API Key,并在需要时填写自定义基础 URL(适用于 Ollama、OpenRouter 等非官方 OpenAI 兼容服务)。 + +注意:由于部分提供方存在 CORS 限制,Google Gemini 和 Anthropic Claude 当前仅支持通过 OpenRouter 使用。 + +### 使用 OpenAI 模型 + +1. 在 [**OpenAI**](https://platform.openai.com/account/api-keys) 获取 OpenAI API Key。您可能需要先注册账号并添加支付方式,才能生成 API Key。 +2. 在 **设置 ⚙️ → 通用 → LLM 提供方** 中选择 **OpenAI** 作为提供方。 +3. 在 **OpenAI → 密钥** 中输入您的 API Key。 +4. 在 **OpenAI → 模型** 下拉中选择您偏好的模型。若希望在性能与成本之间取得较好平衡,我们推荐 `gpt-5.4-mini`。 +5. 您也可以选择是否在 **OpenAI → Flex 模式** 中启用 Flex Mode。Flex Mode 可以降低价格,但也可能带来更慢的响应时间或更多服务端错误。 + +### 使用 OpenRouter + +OpenRouter 是一个统一接入平台,可让您访问来自多个提供方的大量语言模型,其中也包含免费选项,便于比较并找到最适合您需求的模型。 + +1. 在 [**OpenRouter**](https://openrouter.ai/keys) 获取 API Key。需要注册;若使用付费模型,可能还需要绑定支付方式。 +2. 在 **设置 ⚙️ → 通用 → LLM 提供方** 中选择 **OpenAI Compatible** 作为提供方。 +3. 在 **OpenAI Compatible Server → 密钥** 中输入您的 API Key。 +4. 在 [**OpenRouter Models Page**](https://openrouter.ai/models) 浏览可用模型。您可以使用 “Prompt Pricing” 筛选免费模型。 + **注意:** 不同模型提供方的数据保留与隐私政策可能不同,请在使用前自行查看。 +5. 在 **OpenAI Compatible Server → 模型** 中输入您所选的模型名。推荐系列包括: + - `Anthropic: Claude Sonnet 4.6` (`anthropic/claude-sonnet-4.6`: [Link](https://openrouter.ai/anthropic/claude-sonnet-4.6)) — Claude 系列中质量与成本平衡较好的选择 + - `Qwen: Qwen3.5-35B-A3B` (`qwen/qwen3.5-35b-a3b`: [Link](https://openrouter.ai/qwen/qwen3.5-35b-a3b)) — 推荐的开源模型 + - `Qwen: Qwen3-Next-80B-A3B`(免费模型:`qwen/qwen3-next-80b-a3b-instruct:free`: [Link](https://openrouter.ai/qwen/qwen3-next-80b-a3b-instruct:free))— 推荐的免费模型 + - `OpenAI: GPT-OSS 120B`(免费模型:`openai/gpt-oss-120b:free`: [Link](https://openrouter.ai/openai/gpt-oss-120b:free))— 推荐的免费模型 + - 注意:免费模型提供方可能会收集您的数据,使用前请先查看模型页面说明 + - 注意:免费模型的可用性变化频繁。如需查看最新免费选项,请访问 [OpenRouter Models Page](https://openrouter.ai/models),并使用 **Prompt Pricing** 过滤当前免费模型 +6. 在 **OpenAI Compatible Server → 基础 URL** 中填写 `https://openrouter.ai/api/v1`。 + +### 关于 agent 与 LLM 提供方 + +出于安全考虑,当您从非本地主机环境使用 K.G.Studio 时,API Key 默认不会持久化到 IndexedDB 中;这意味着您每次启动 K.G.Studio 时都需要重新输入。如需在非本地主机环境中启用持久化,请在设置中打开 “Persist API Keys on Non-Localhost”(不建议在共享或生产环境中启用)。 + +K.G.Studio 不提供也不托管上述任何模型,也不隶属于任何模型提供方。所有数据都保存在您的本地设备中;K.G.Studio 不会收集或传输您的数据。若您向第三方模型提供方发送任何数据,相关责任由您自行承担。 + +## K.G.One Music Generator + +> **需要 [K.G.One Music Studio](https://github.com/KGAudioLab/K.G.One) 集成。** 只有当 K.G.Studio 连接到正在运行的 K.G.One 服务器时,K.G.One Music Generator 面板才会可用。设置说明请参阅 [K.G.One 仓库](https://github.com/KGAudioLab/K.G.One)。 + +**K.G.One Music Generator** 面板提供三项经 GPU 加速的 AI 工具,用于音乐生成与音频处理。点击工具栏中的 **✦(魔杖)** 按钮即可打开。该面板与 AI Assistant 聊天框互斥,打开其中一个时,另一个会自动关闭。 + +> **注意:** 您首次使用每个工具时,服务器都需要加载对应 AI 模型,这可能需要 60 秒甚至更久,具体取决于您的硬件。切换标签页时,也可能触发模型重新加载。 + +### Full Song Generation + +根据文本描述和可选歌词生成一首完整歌曲。由 [ACE-Step 1.5](https://github.com/ace-step/ACE-Step-1.5) 驱动。 + +- 在 **Full Song** 标签页中,于 **Caption** 中输入自然语言描述,说明所需风格、情绪、速度、配器和结构。例如:`Genre: Eurodance, 90s dance-pop, upbeat electronic. Tempo: ~130 BPM. Instrumentation: driving kick drum, eurodance bassline...` +- 您也可以填写 **Lyrics**。可使用 `[Intro]`、`[Verse]`、`[Chorus]`、`[Bridge]` 等标签标记段落。若勾选 **Instrumental**,则会完全跳过人声。 +- 点击 **Generate Song**。界面会实时显示生成阶段与百分比进度。 +- 生成完成后,会显示预览播放器。您可以将其拖拽到 **audio track**,作为区域导入。 +- 目前不支持将整曲生成结果拖放到 MIDI track。 +- **Advanced Settings**(可展开):Inference Steps、Guidance Scale、Seed,以及 Thinking(CoT metadata generation)。 + +### Clip Generation + +根据文本描述生成短乐器片段和 MIDI loops。由 [Foundation-1](https://huggingface.co/RoyalCities/Foundation-1) 驱动。 + +- 在 **Clip** 标签页中,于 **Prompt** 中输入逗号分隔的标签,描述乐器类别、子类型、音色、效果、长度、BPM 和调性。例如:`Gritty, Acid, Bassline, 303, Synth Lead, FM, Sub, High Reverb, 8 Bars, 140 BPM, E minor` +- 您也可以填写 **Negative Prompt**,以避免生成某些不希望出现的特征(例如 `distortion, noise`)。 +- 选择 **Bars**:4 或 8。BPM 与调号会根据项目设置预填,您也可以在 **Advanced Settings** 中调整。 +- 点击 **Generate Clip**。生成完成后,会出现一个预览播放器,左侧带拖拽手柄,右侧带下载按钮。 +- **导入方式**:将播放器拖拽到时间线中的音轨上。 + - 拖放到 **audio track** 时,会作为 WAV 音频区域导入(推荐)。 + - 拖放到 **MIDI track** 时,会作为 MIDI 区域导入。请注意,此 MIDI 是从音频转录而来,可能并非完全准确。 +- **Advanced Settings**(可展开):Note、Scale、BPM、Steps、CFG Scale、Seed(`-1` 表示随机)、Sampler Type、Sigma Min/Max,以及 CFG Rescale。 + +### Stem Separation + +将现有音频区域拆分为独立 stems(例如人声、伴奏、鼓组等)。 + +K.G.Studio 支持 **两种模式** 的分轨: + +#### 本地浏览器模式 — 无需服务器 ✦ + +两个 ONNX 模型可完全在浏览器中运行,无 API 调用、无费用,数据也不会离开您的设备。模型只需下载一次,随后会缓存在本地。 + +- **Vocal and Instrument (Medium Accuracy)**(`UVR-MDX-NET-Inst_HQ_3`,约 64 MB)— 双 stem 分离(Vocals / Instrumental)。由 [UVR-MDX-NET](https://github.com/nomadkaraoke/python-audio-separator) 驱动。 +- **Vocal, Drums, Bass, and Others**(`htdemucs_4s`,约 172 MB)— 四 stem 分离(Vocals / Drums / Bass / Others)。由 [Demucs](https://github.com/facebookresearch/demucs) 驱动。 + +打开 **Music Generator** 面板(工具栏中的 ✦ 按钮),选择模型,先点击一次 **Download Selected Model**,然后点击 **Separate Stems**,所有处理都会在您的浏览器中本地完成。 + +**要求:** 需要支持 WebGPU 的浏览器(Chrome 113+ 或 Edge 113+),并运行在安全上下文中(HTTPS 或 localhost)。若可用,会优先使用 WebGPU 加速;否则会回退到 CPU(处理期间可能降低页面响应性)。推荐硬件为至少 8 GB 显存的 GPU,或至少 16 GB 统一内存的系统。 + +#### K.G.One 服务器模式 + +当连接到 [K.G.One Music Studio](https://github.com/KGAudioLab/K.G.One) 服务器后,可使用另外三种 GPU 加速模型。由 [python-audio-separator (UVR5)](https://github.com/nomadkaraoke/python-audio-separator) 驱动。 + +- **Vocal and Instrument (Medium Accuracy)**(`UVR-MDX-NET-Inst_HQ_3`)— 快速双 stem 分离(vocal / instrumental)。 +- **Vocal and Instrument (High Accuracy)**(`MDX23C-8KFFT-InstVoc_HQ`)— 更高质量的双 stem 分离,但更慢。 +- **Vocal, Drums, Bass, Guitar, Piano, and Others**(`htdemucs_6s`)— 完整六 stem 分离。 + +#### 使用方式(两种模式通用) + +- 在打开此标签页之前,请先在时间线上**选中一个音频区域**。**Separator** 标签页顶部会显示当前所选区域及其音轨名称。仅支持音频区域,不支持分离 MIDI 区域。 +- 点击 **Separate Stems**。如果当前所选区域带有 clip start offset 或已被裁剪,系统会先自动按该区域范围切出对应音频,再进行处理。 +- 处理完成后,每个 stem 都会以带标签的预览播放器显示,并附带拖拽手柄。您可以在导入前分别试听每个 stem。 +- **导入 stems:** + - 可将每个 stem 播放器分别拖拽到 **audio track** 上,放到您希望的位置。 + - 或点击 **Import All Stems to Timeline**,系统会自动为每个 stem 新建一条音频轨,并将其放置在源音轨下方,与原始区域的起始拍点对齐。该操作可通过一次撤销完整回退。 + +## 即将推出的功能 + +功能优先级可能会变化。 + +### 1.0 + +- [X] 更多乐器 +- [X] 自动化测试(单元测试、集成测试等) +- [X] 带功能和声指导(T/S/D)的智能和弦助手 +- [X] 支持轨道控制自动化(例如 sustain、volume、pan 等) +- [X] 支持 MIDI 控制事件(例如 CC、pitch bend 等) +- [X] 支持 WAV 音频轨 +- [X] 录音 +- [X] 事件列表 +- [X] 支持 OpenAI 的开源模型(`gpt-oss-20b` 和 `gpt-oss-120b`) +- [X] 五线谱 +- [X] K.G.One Music Studio 集成 +- [X] 浏览器内嵌 AI 模型(基于 Gemma 4 E4B 的本机 LLM;基于 UVR-MDX-NET-Inst_HQ_3 与 htdemucs_4s 的本机分轨) +- [X] 全局轨系统(Marker、Tempo、Key Signature、Chord) +- [X] 音频和弦检测(零依赖 FFT,并将结果写入 Chord Track) +- [X] 带自动对齐拍点的速度检测 +- [X] 频谱可视化与 Piano Roll hybrid mode + +### 1.0 之后 + +- [ ] 扩展 AI agent 工具,直接通过聊天操作区域、音轨与全局轨(和弦进行、速度、调性) +- [ ] Mixer 视图,提供专用面板显示每轨推子、send、return bus 与 master channel +- [ ] EQ 与通道条,为每条音轨提供参数均衡器与压缩器 +- [ ] 滤波器与效果器,如混响、延迟及其他基于 WebAudio 的原生插入效果 +- [ ] 音频 time-stretch / warp,使音频区域自动匹配项目速度 +- [ ] MIDI 效果器,如琶音器、音阶量化器、和弦记忆 +- [ ] 虚拟 MIDI 设备输出 + +## 需要帮助 + +我们正在寻找贡献者,一起让 K.G.Studio 变得更好。无论您是开发者、音乐人还是设计师,您的专长都能带来实际价值。 + +### 您可以如何参与 + +**🎵 音乐人 / 音乐制作人** +- 使用真实音乐制作流程测试这款 DAW +- 反馈乐器音色质量与真实感 +- 提出音乐创作中不可或缺但目前缺失的功能 +- 帮助提升 AI 助手的音乐理解能力 + +**💻 开发者** +- 根据路线图实现新功能 +- 修复 bug 并优化性能 +- 增强 Web Audio 集成 +- 改进 AI 助手能力 + +**🎨 UI/UX 设计师** +- 优化界面和工作流 +- 设计更适合音乐编辑的视觉反馈 +- 打造更直观的交互方式 + +### 参与方式 + +如果您有兴趣贡献,我们很愿意听到您的想法。 + +- **给我们发邮件**:[kgstudio@duck.com](mailto:kgstudio@duck.com) +- **查看 Issues**:浏览带有 `help wanted` 或 `good first issue` 标签的公开问题 +- **参与讨论**:在 GitHub Discussions 中分享想法与反馈 + +每一份贡献都很重要。无论是报告 bug,还是提出新功能建议,都会推动项目继续前进。 + +### 免责声明 + +K.G.Studio 是一个处于早期开发阶段的实验性项目。我们正在探索如何将 AI agent 与 LLM 融入音乐制作工作流,本质上是在构建一种面向 DAW 的 “Cursor 或 Claude Code” 体验。 + +该项目关注 AI 与人类协作如何增强音乐创作过程,从智能和声建议到自动化编辑任务都在探索范围内。作为实验平台,项目会频繁变化,功能将持续演进,并且在我们推进 AI 辅助音乐制作边界的过程中,偶尔出现不稳定情况也是可以预期的。 + +K.G.Studio 不提供也不托管任何 LLM 模型,也不隶属于任何模型提供方。所有数据都保存在您的本地设备中;K.G.Studio 不会收集或传输您的数据。若您向第三方模型提供方发送任何数据,相关责任由您自行承担。 + +## 许可证 + +本项目基于 Apache License, Version 2.0 授权,并附带额外条款(参见 `LICENSE`): +- 不得使用本软件或相关素材申请专利 +- 当用于公开或商业产品时需要署名(“Powered by K.G.Studio”) + +第三方声明(FluidR3_GM SoundFont、midi-js-soundfonts、VexFlow、prompt structure notes、Gemma 4 E4B、UVR-MDX-NET-Inst_HQ_3、MediaPipe、Meyda、web-audio-beat-detector、tonal、htdemucs_4s、onnxruntime-web 和 demucs-web)已包含在 `LICENSE` 中。 diff --git a/README-zh_hk.md b/README-zh_hk.md new file mode 100644 index 0000000..781f66f --- /dev/null +++ b/README-zh_hk.md @@ -0,0 +1,453 @@ +[English](./README.md) | [Français](./README-fr.md) | [简体中文](./README-zh_cn.md) | 繁體中文 + +
+ K.G.Studio Logo +
+ +# K.G.Studio — 一款基於瀏覽器的 DAW,並內建 AI 助手 + +
+

◀ 立即在瀏覽器中線上使用 K.G.Studio ▶

+
+ +## 新動態 + +> ### ✦ [K.G.One Music Studio 現已發佈。](https://github.com/KGAudioLab/K.G.One) ✦
+> [**K.G.One Music Studio**](https://github.com/KGAudioLab/K.G.One) 是一個完全本地、開源的一體化平台,以 **K.G.Studio**(本專案)為核心。它整合了用於整曲生成的 [ACE-Step 1.5](https://github.com/ace-step/ACE-Step-1.5)、用於音訊片段和 MIDI loop 生成的 [Foundation-1](https://huggingface.co/RoyalCities/Foundation-1),以及用於分軌的 [python-audio-separator (UVR5)](https://github.com/nomadkaraoke/python-audio-separator),將 GPU 加速的 AI 音樂生成能力直接帶入您的瀏覽器音樂製作工作流。 + +## 什麼是 K.G.Studio? + +K.G.Studio 是一款輕量、現代化的 DAW,完全執行於瀏覽器中,並以 **K.G.Studio 音樂創作助手** 為核心。它提供基於 Tone.js sampler 的真實樂器回放、Piano Roll 編輯器、支援完整復原/重做的音軌與區域管理、基於 OPFS(Origin Private File System)的專案持久化、可設定的設定面板,以及可執行工具的內建 AI 助手。 + +**K.G.Studio 音樂創作助手** 是一個面向和聲、編曲與音符編輯的 AI 助手,但並不負責整首作品的全自動作曲。 + +
+ K.G.One Logo +
+ +> 注意:整曲生成功能和音訊片段生成功能需要整合 [**K.G.One Music Studio**](https://github.com/KGAudioLab/K.G.One)。 + +## 最新更新 + +- **2026.05.30**: 新增 **國際化(i18n)支援** — K.G.Studio 現已提供四種語言版本:**English**、**简体中文**、**繁體中文** 和 **Français**。可在 **設定 ⚙️ → 通用 → 語言** 中設定偏好語言,選擇 `Auto` 時將自動偵測瀏覽器語言。 + +- **2026.05.27**: + - 新增 **全域軌系統**,引入四條全域軌:**Marker**、**Tempo**、**Key Signature** 和 **Chord**(和弦符號跨度區段)。 + - 新增 **音訊和弦檢測** 功能。您可以為音訊區域或 MIDI 區域開啟鋼琴卷簾視窗,然後點擊「...」 -> **Detect Chords**,即可透過零依賴 FFT 流水線自動分析錄音內容,並將結果寫入 Chord Track;支援靈敏度、穩定性與七和弦檢測設定。 + - 新增 **帶自動對齊拍點的速度檢測** 功能。您可以為音訊區域開啟鋼琴卷簾視窗,然後在工具列點擊「...」 -> **Detect Tempo**,分析音訊 BPM,並可選擇將專案中的 Tempo Track 區段自動重新對齊。 + - 新增 **Demucs 4S** 作為第二個本地瀏覽器內嵌分軌模型。現有的雙 stem UVR-MDX-NET 模型之外,又加入了四 stem 的 `htdemucs_4s` 模型(約 172 MB,vocals / drums / bass / others),兩者都可透過 ONNX Runtime WebGPU 完全在瀏覽器中執行。 + +- **2026.05.15**: 新增 **瀏覽器內嵌 AI 模型**。現在有兩個 AI 模型可完全在瀏覽器中執行,無需外部服務、無需 API Key,也無需 K.G.One 伺服器。**K.G.Studio 音樂創作助手** 新增 **Local LLM (Browser)** 提供方,由 **Gemma 4 E4B** 驅動,並透過 LiteRT-LM 與 WebGPU 加速執行;模型只需下載一次,隨後會快取在 OPFS 中,後續啟動幾乎可即時使用,同時支援可設定的上下文長度(32 k / 64 k / 128 k tokens)與即時推理效能統計。**Stem separation** 也支援本地執行,基於瀏覽器內嵌的 **UVR-MDX-NET-Inst_HQ_3** ONNX 模型並使用 WebGPU 加速。您可以開啟 **Music Generator** 面板(✦ 按鈕),下載模型一次後,即可完全在本機將人聲與伴奏分離。以上兩項功能都要求瀏覽器支援 WebGPU(Chrome 113+ 或 Edge 113+)並執行在安全上下文中(HTTPS 或 localhost)。推薦硬體:至少 8 GB 顯存的 GPU,或至少 16 GB 統一記憶體的系統。 + +- **2026.05.10**: 新增 **五線譜視圖**。鋼琴卷簾現已支援完整的標準樂譜顯示模式。您可以透過鋼琴卷簾工具列中的切換按鈕在 Piano Roll 和 Sheet Music 視圖之間切換。在五線譜模式下,音符會透過 VexFlow 排版,並支援基於目前樂器自動選擇譜號(高音或低音)、顯示調號、自動符槓分組、跨小節連音線,以及可設定的音值量化。啟用 **Track Scope** 後,整條音軌上的所有 MIDI 區域會以連續譜面的形式顯示,而不再侷限於單個區域。 + +- **2026.05.09**: 新增 **音訊錄音**。您現在可以直接從麥克風錄製到音訊軌。錄音時會即時增長顯示波形預覽,停止後該錄音會作為標準音訊區域寫入時間線。另新增 **音訊 I/O 裝置選擇**,您可以在設定中選擇偏好的麥克風輸入裝置和音訊輸出裝置。 + +- **2026.05.08**: 新增 **MIDI 自動化**。您可以在鋼琴網格下方的可編輯自動化區域中繪製和編輯 pitch bend 與 MIDI CC 曲線(CC1 Modulation、CC2 Breath、CC7 Volume、CC11 Expression、CC64 Sustain)。同時新增 **軌道級自動化**:每條音軌現在都有專用自動化面板,您可以直接在時間線上查看和編輯同樣的曲線。即時 MIDI 控制器輸入(如 pitch wheel、CC 踏板)也支援錄製與按軌回放,並帶有每條自動化軌的插值處理。另新增 **事件列表面板**,這是一個帶分頁的側邊欄(Notes / Pitch Bend / Controller),可用於查看與內聯編輯目前 MIDI 區域中的全部事件。還新增了 **區域多選**(支援套索與批次移動/縮放)以及 **合併 MIDI 區域**。 +
+ K.G.Studio Logo +
+ +- **2026.05.02**: 新增 **音訊軌頻譜可視化**。音訊區域現在會在時間網格中顯示即時頻譜疊加層。另新增 **Piano Roll hybrid mode**:當您在 MIDI 區域中開啟鋼琴卷簾時,可將相鄰音訊區域的頻譜作為參考層顯示,從而參照音訊形狀編輯 MIDI 音符。新增 **鋼琴卷簾縮放**,並保留目前視口位置,使畫面始終錨定在目前播放頭附近。還新增 **區域微調位置**,可用小步長推動區域以實現精確擺放;同時新增跨元件的播放頭捲動同步,使主網格與鋼琴卷簾在播放期間保持連動。 +- **2026.04.29**: 在 K.G.One Music Generator 面板中新增 **Remix** 和 **Repaint**(由 ACE-Step 1.5 驅動)。**Remix** 可讓您用新風格重製現有音訊區域,您只需選取音訊區域、描述目標風格,並可選填寫新歌詞,ACE-Step 就會按提示重新演繹歌曲的配器與氛圍。**Repaint** 可對歌曲中特定片段進行局部再生成,您可以先在時間線上設定 loop 範圍作為重繪視窗,再描述該片段應有的聲音效果,其餘部分將保持不變。兩項功能都支援與其他 K.G.One 分頁相同的匯入流程:可在內建播放器中預覽、拖曳到音軌上,或點擊 **Import Aligned to Source**,自動將結果放置到原始區域下方的新音軌中。 +- **2026.04.24**: 新增 [**K.G.One Music Studio**](https://github.com/KGAudioLab/K.G.One) 整合。當 K.G.Studio 連線到本地 K.G.One 伺服器後,**K.G.One Music Generator** 面板(工具列中的魔杖按鈕 ✦)即可啟用,其中包含三項 AI 驅動工具:**Full Song Generation**(由 ACE-Step 1.5 驅動,可根據文字提示生成整首歌曲)、**Clip Generation**(由 Foundation-1 驅動,可根據文字生成樂器片段與 MIDI loop),以及 **Stem Separation**(由 python-audio-separator 驅動,可將任意音訊拆分為人聲、伴奏等多個 stem)。生成的音訊和 MIDI 均可即時預覽,並可直接拖曳到您的音軌中。K.G.One 完全執行在您自己的機器上(Windows/Linux,需要 CUDA GPU);詳細設定說明請參閱 [K.G.One 倉庫](https://github.com/KGAudioLab/K.G.One)。 +- **2026.04.11**: 將專案儲存從 IndexedDB 遷移到 OPFS(Origin Private File System),並採用基於資料夾的結構,以更好地處理媒體檔案。新增音訊軌支援,包括 WAV/MP3 匯入、回放、循環,以及非破壞性區域裁剪。另新增基於離線渲染的 WAV/MP3 匯出功能。 +- **2026.04.05**: 將 AI agent 從基於 XML 的工具呼叫遷移到原生 OpenAI SDK function calling,以提升可靠性與相容性。另新增 GPT-5.4 系列等 LLM 模型選項。 +- **2026.01.23**: 實現無縫循環播放。您可以拖動小節編號設定 loop 範圍,或透過工具列中的 Loop 按鈕切換循環模式。循環播放基於 `Tone.js` 的原生 loop 機制,可實現取樣級精確、無縫銜接的循環。 +- **2025.12.21**: 實現 MIDI 鍵盤支援。您現在可以連接 MIDI 鍵盤並直接用其演奏聲音。請注意,由於 Safari 和部分其他瀏覽器對 Web MIDI 介面支援不完整,此功能在這些瀏覽器中可能無法達到最佳效果。 +- **2025.12.15**: 新增智慧和弦助手,支援功能和聲指導(T/S/D)。將滑鼠懸停在琴鍵上即可查看與上下文相關的和弦建議,並可一鍵建立完整和弦。 + +## 專案狀態 + +**K.G.Studio 是一個仍處於早期開發階段的實驗性專案。** 我們正在探索如何將 AI agent 與 LLM 融入音樂製作工作流,本質上是在建構一種面向 DAW 的「Cursor 或 Claude Code」體驗。 + +該專案關注 AI 與人類協作如何增強音樂創作過程,從智慧和聲建議到自動化編輯任務都在探索範圍內。作為實驗平台,專案會頻繁變化,功能將持續演進,並且在我們推進 AI 輔助音樂製作邊界的過程中,偶爾出現不穩定情況也是可以預期的。 + +## 演示影片 + +
+ + + + + + +
+ + K.G.One Music Studio + +
K.G.One Music Studio +
+ + Short Demo + +
短演示(僅 DAW) +
+ + Full Demo + +
完整演示(僅 DAW) +
+
+ +## 快速開始 + +### 設定 K.G.Studio 音樂創作助手 + +使用 K.G.Studio 音樂創作助手有兩種方式:一種是 **Local LLM (Browser)**,完全在瀏覽器中執行,無需 API Key、無需費用,且資料不會離開您的裝置;另一種是使用 **外部 LLM 提供方**,以獲得更高品質的回覆。 + +#### 方案 A:Local LLM (Browser) — 無需 API Key ✦ + +K.G.Studio 可以藉助 WebGPU 加速,在瀏覽器中直接執行 **Gemma 4 E4B**。不會產生 API 呼叫,不會產生費用,您的資料也不會離開本機。 + + - 點擊這裡開始線上使用應用:[K.G.Studio (kgaudiolab.github.io/kgstudio)](https://kgaudiolab.github.io/kgstudio) + - 在 **設定 ⚙️ → 通用 → LLM 提供方** 中選擇 **本地 LLM(瀏覽器)**(預設選項)。 + - 第一次開啟聊天時,模型(約 2.8 GB)會自動下載,並快取在瀏覽器的 OPFS(Origin Private File System)中,後續啟動幾乎可即時使用。 + - 您也可以選擇設定 **上下文長度**(32k / 64k / 128k tokens);數值越大,對顯存要求越高。 + - 現在就可以開始聊天。除首次下載模型外,無需 Key、無需帳號,也無需持續連網。 + +**Local LLM 的要求:** 需要支援 WebGPU 的瀏覽器(Chrome 113+ 或 Edge 113+),並執行在安全上下文中(HTTPS 或 localhost)。推薦硬體為至少 8 GB 顯存的 GPU,或至少 16 GB 統一記憶體的系統。 + +> **注意:** 本地模型的品質無法與 GPT 或 Claude 系列商業模型相比。對於複雜的音樂編輯任務,外部提供方通常會產生更好的結果。 + +#### 方案 B:外部 LLM 提供方(更高品質) + + - 點擊這裡開始線上使用應用:[K.G.Studio (kgaudiolab.github.io/kgstudio)](https://kgaudiolab.github.io/kgstudio) + - [點擊這裡取得免費 OpenRouter API Key](https://openrouter.ai/keys)(您可能需要一個 OpenRouter 帳號)。 + - 在 **設定 ⚙️ → 通用 → LLM 提供方** 中選擇 **OpenAI Compatible**。 + - 在 **OpenAI Compatible Server → 密鑰** 中貼上您的 Key。(注意:在非 localhost 環境中,出於安全原因,您的 Key 預設不會被持久化;您可以在設定中啟用「Persist API Keys on Non-Localhost」以允許持久化,但這可能增加 XSS 風險。) + - 在 **OpenAI Compatible Server → 模型** 中輸入 `openai/gpt-oss-120b:free`。(注意:這是一個免費模型;非免費模型可能需要付費;免費模型提供方可能會蒐集您的資料,請查看模型頁面中的說明;本專案與 OpenRouter 或任何模型提供方 **沒有關聯關係**。) + - 在 **OpenAI Compatible Server → 基礎 URL** 中輸入 `https://openrouter.ai/api/v1`。 + +**提示:** +- 您也可以使用官方 OpenAI API、其他 OpenAI 相容服務,或自行託管的 LLM 伺服器(如 Ollama、vLLM)。請注意,不同模型的品質差異較大,並非所有模型都同樣適合音樂編輯任務。對於本地部署,我們推薦 `qwen3.5-35b-a3b`,它在生成品質與硬體需求之間取得了較好的平衡。 +- 如果您已訂閱 OpenAI 或其他 LLM 提供方,可以使用 [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) 執行一個本地代理伺服器,透過現有訂閱轉發請求,而無需另外準備 API Key。 + +### 基本 DAW 操作 + - 在音軌上雙擊(或按住 Ctrl/Cmd 並點擊)可建立區域。 + - 拖動區域邊緣可調整長度;拖動區域主體可移動。 + - 點擊區域左上角的小鉛筆即可開啟鋼琴卷簾。 + - 在鋼琴卷簾中,雙擊(或 Ctrl/Cmd+點擊)可建立音符。 + - 單擊可選取;Shift+單擊可多選;拖曳可框選。 + - 拖動音符邊緣可調整長度;拖動音符主體可移動已選音符。 + - 使用鋼琴卷簾工具列右上角的 Snapping 功能可將編輯量化到網格。 + +### 使用 K.G.Studio 音樂創作助手 + - 選取您希望助手處理的音樂區域,在聊天框中輸入提示詞;按 Enter 傳送,按 Shift+Enter 插入換行。 + - agent 會自動處理您的請求,並呼叫工具,在所選區域範圍內執行修改。某些任務可能需要一輪或多輪對話才能完成。 + - 請注意,AI 也可能出錯,因此您應始終檢查結果,並在必要時自行調整。您也可以透過復原/重做回退修改。 + - 點擊「+」按鈕或輸入 `/clear` 指令可清空聊天歷史。 + +### 更多說明 + +您可以在[這裡](./docs/USER_GUIDE.md)查看詳細使用者指南。 + +### 亮點功能 +- **K.G.Studio 音樂創作助手**:與由 LLM 驅動的 AI agent 進行對話;它會自動執行工具,對您所選區域內的音樂內容進行編輯。 +- **瀏覽器內嵌 LLM,無需 API Key**:透過 WebGPU(LiteRT-LM)在瀏覽器中直接執行 **Gemma 4 E4B**。無 API 呼叫、無費用、資料不離開您的裝置。模型只需下載一次,隨後會快取在本地。 +- **瀏覽器內嵌分軌,無需伺服器**:使用 **UVR-MDX-NET-Inst_HQ_3**(2-stem:Vocals / Instrumental)或 **Demucs htdemucs_4s**(4-stem:Vocals / Drums / Bass / Others)將任意音訊區域拆分為 stems。兩者都完全在瀏覽器中透過 ONNX Runtime WebGPU 執行,無需 K.G.One 伺服器。 +- **音訊和弦檢測**:為音訊區域開啟 Piano Roll 後執行 **Detect Chords**,即可透過零依賴 FFT 流水線自動分析錄音並填充全域 Chord Track,同時支援靈敏度、穩定性和七和弦檢測等設定。 +- **帶自動對齊拍點的速度檢測**:在 Piano Roll 工具列執行 **Detect Tempo**,即可分析音訊區域的 BPM,並可選擇自動重新對齊專案的 Tempo Track。 +- **全域軌系統**:四條持久存在的全域軌 **Marker**、**Tempo**、**Key Signature** 和 **Chord** 共同提供專案級結構,所有功能(播放時序、和弦檢測、五線譜顯示)都會參考它們。 +- **K.G.One Music Studio 整合**:連接本地 [K.G.One](https://github.com/KGAudioLab/K.G.One) 伺服器後,可解鎖 GPU 加速的 **Full Song Generation**(ACE-Step 1.5)、**Clip & MIDI Loop Generation**(Foundation-1)以及更多 **Stem Separation** 模型。 +- **多種 LLM 提供方**:支援 OpenAI、Claude / Gemini(透過 OpenRouter)、OpenAI 相容服務(Ollama、vLLM 等),或內建的本地瀏覽器 LLM,無需 Key。 +- **音軌與區域編輯**:支援新增/重排音軌、建立/移動/縮放區域、套索多選、批次移動/縮放、合併與拆分區域,以及完整復原/重做。 +- **Piano Roll**:支援音符、pitch bend 和 MIDI CC 自動化軌;支援基於 VexFlow 的五線譜視圖;支援音訊到 MIDI 參考用途的頻譜疊加層。 +- **真實樂器**:基於 Tone.js 的 sampler,搭配高品質 FluidR3 soundfonts。您還可以直接從麥克風錄製到音訊軌。 +- **智慧和弦助手**:基於功能和聲(T/S/D)提供即時和弦建議,並支援可視預覽與一鍵建立和弦。 +- **兼顧持久化與隱私**:專案和設定完全儲存在您的瀏覽器中(OPFS / IndexedDB)。專案本身不依賴第一方伺服器。 + +如需更深入的技術概覽,請參閱 [overview.md](./docs/technical/overview.md)。 + +## 開始使用 + +### 或者在本地複製並執行: +```bash +# 請確認已安裝 Node.js >= 20.19.3 +# 複製倉庫 +git clone https://github.com/KGAudioLab/KGStudio {your-local-path} +cd {your-local-path} + +# 安裝依賴 +npm install + +# 啟動開發伺服器 +npm run dev +``` + +## 設定 + +K.G.Studio 會從 `./public/config.json` 載入預設設定(內部也提供回退預設值),並透過 `ConfigManager` + IndexedDB 將使用者修改持久化到瀏覽器中。IndexedDB 是瀏覽器在您裝置上的本地資料庫;資料不會離開您的機器,如果您清除此站點的資料,它也會被清除。請透過應用程式內的設定面板修改設定。 + +- **通用** + - LLM 提供方:OpenAI,或 OpenAI 相容服務 + - 目前所選提供方對應的 API Key 與模型 + - 在非 localhost 環境持久化 API Key:啟用後,可在非 localhost 環境中持久化 API Key(屬於安全風險自擔選項,不建議在共享或生產環境中開啟) + - OpenAI 相容服務的基礎 URL(適用於自託管閘道) + - Soundfont 基礎 URL(樂器採樣 CDN) +- **行為** + - 啟動時預設開啟聊天框 +- **模板** + - AI 助手使用的自訂指令 + +### 連線性與隱私 + +- K.G.Studio 完全在客戶端執行。執行應用不需要任何第一方伺服器。 +- 專案和音訊檔案儲存在瀏覽器的 OPFS(Origin Private File System)中;設定儲存在 IndexedDB 中。所有資料都留在您的裝置上。 +- 網路存取僅用於: + - 從設定的 soundfont CDN 下載樂器採樣 + - 與您選擇的 LLM 提供方通訊(例如 OpenAI 或 OpenAI 相容服務) +- 除上述兩種情況外,應用均可在本地工作。即使您阻止這些端點,應用仍可載入;但在網路恢復之前,樂器回放和 AI 功能將無法使用。 +- 出於安全考量,當應用執行在非本地主機環境中時,我們預設不會將您的 API Key 持久化到 IndexedDB(以降低 XSS 風險)。這表示您每次啟動 K.G.Studio 時都需要重新輸入。如需在非本地主機環境中啟用持久化,請在設定中開啟「Persist API Keys on Non-Localhost」(不建議在共享或生產環境中啟用)。 + +## 使用應用 + +您可以在[這裡](./docs/USER_GUIDE.md)查看詳細使用者指南。 + +- 音軌 + - 在軌道資訊面板中新增、重新命名和重排音軌。 + - 透過樂器按鈕(鋼琴圖示)切換樂器;可調整 Solo(S)、Mute(M)和 Volume。 + - 透過音軌設定選單刪除音軌(位於樂器按鈕右側)。 + +- 區域 + - 建立區域:使用 Pointer 工具時可雙擊,或按住 Ctrl/Cmd 再點擊;使用 Pencil 工具時單擊即可。 + - 移動/縮放:拖動區域主體可移動,拖動邊緣可調整長度。 + - 透過區域左上角的小鉛筆開啟 Piano Roll。 + +- 鋼琴卷簾(MIDI 音符) + - 工具:Select 與 Pencil。 + - 建立音符:在 Select 模式下雙擊或 Ctrl/Cmd+點擊;在 Pencil 模式下單擊。 + - 選取音符:單擊;Shift+單擊多選;拖曳框選。 + - 移動/縮放:拖動音符主體可移動已選音符;拖動邊緣可調整長度。 + - **五線譜視圖**:可在鋼琴卷簾工具列中切換 Piano Roll 與 Staff Notation 視圖。支援自動譜號選擇、調號顯示、符槓分組、連音線和可設定量化。啟用 **Track Scope** 後會將整條音軌上的所有區域連續渲染為譜面。 + - **自動化軌道**:可在鋼琴網格下方的可編輯區域中繪製和編輯 pitch bend 與 MIDI CC 曲線(Modulation、Breath、Volume、Expression、Sustain)。 + - **頻譜模式**:可在鋼琴卷簾中查看音訊區域的頻譜,並將其作為編輯 MIDI 音符時的參考層。 + - 可透過 X 或 ESC 關閉鋼琴卷簾視窗。 + +- 智慧和弦助手(新增於 2025-12-15) + - 在鋼琴卷簾工具列中啟用和弦指導:選擇 T(Tonic)、S(Subdominant)或 D(Dominant)功能。 + - 將滑鼠懸停在任意琴鍵上時,會以紅色高亮顯示與上下文相關的和弦建議,並匹配您目前選擇的調號與調式。 + - 按 Tab 可在同一和聲功能下循環切換不同和弦轉位。 + - 雙擊(或 Ctrl/Cmd+點擊)高亮和弦可一次性建立整組音符。 + - 和弦長度會自動匹配您最近編輯的音符長度,以保持節奏一致。 + +- 吸附與量化 + - 在右上角的 NO SNAP 選單中設定吸附。 + - 使用 Qua. Pos.(起始)和 Qua. Len.(長度)進行量化。 + +- 播放與播放頭 + - 可透過工具列回到開頭,並執行 Play/Pause。 + - 在主時間網格點擊小節編號可設定播放頭;在鋼琴卷簾中點擊頂部時間軸也可設定,並遵守目前吸附設定。 + - BPM、拍號和調號都可以透過工具列中的數值進行修改。 + +## 鍵盤快捷鍵 + +- 主介面 + - 播放/暫停:Space + - 復原 / 重做:Ctrl/Cmd+Z / Ctrl/Cmd+Shift+Z + - 複製 / 剪下 / 貼上:Ctrl/Cmd+C / Ctrl/Cmd+X / Ctrl/Cmd+V + - 儲存:Ctrl/Cmd+S + - 按住以建立區域:Ctrl/Cmd +- 鋼琴卷簾 + - 工具:Select(Q)、Pencil(W) + - 按住以建立音符:Ctrl/Cmd + - 吸附:1(None), 2(1/4), 3(1/8), 4(1/16) + - 位置量化:5(1/4), 6(1/8), 7(1/16) + - 長度量化:8(1/4), 9(1/8), 0(1/16) + +## AI 助手 + +### 使用 K.G.Studio 音樂創作助手 + +- 請先按照前文說明完成 LLM 提供方設定。 +- 您可以在右側找到 K.G.Studio 音樂創作助手聊天框。如果目前未顯示,可點擊工具列中的 Chat 🗨️ 按鈕開啟。 +- 選取您希望助手處理的區域,在聊天框中輸入提示詞;按 Enter 傳送,按 Shift+Enter 插入換行。 +- agent 會自動處理您的請求,並呼叫工具,在所選區域範圍內執行修改。某些任務可能需要一輪或多輪對話才能完成。 +- 請注意,AI 也可能出錯,因此您應始終檢查結果,並在必要時自行調整。您也可以透過復原/重做回退修改。 +- 點擊「+」按鈕或輸入 `/clear` 指令可清空聊天歷史。 + +### 設定您的 LLM 提供方 + +進入 **設定 ⚙️ → 通用 → LLM 提供方**。根據您選擇的提供方,您需要填寫對應的 API Key,並在需要時填寫自訂基礎 URL(適用於 Ollama、OpenRouter 等非官方 OpenAI 相容服務)。 + +注意:由於部分提供方存在 CORS 限制,Google Gemini 和 Anthropic Claude 目前僅支援透過 OpenRouter 使用。 + +### 使用 OpenAI 模型 + +1. 在 [**OpenAI**](https://platform.openai.com/account/api-keys) 取得 OpenAI API Key。您可能需要先註冊帳號並新增付款方式,才能生成 API Key。 +2. 在 **設定 ⚙️ → 通用 → LLM 提供方** 中選擇 **OpenAI** 作為提供方。 +3. 在 **OpenAI → 密鑰** 中輸入您的 API Key。 +4. 在 **OpenAI → 模型** 下拉中選擇您偏好的模型。若希望在效能與成本之間取得較好平衡,我們推薦 `gpt-5.4-mini`。 +5. 您也可以選擇是否在 **OpenAI → Flex 模式** 中啟用 Flex Mode。Flex Mode 可以降低價格,但也可能帶來更慢的回應時間或更多伺服器端錯誤。 + +### 使用 OpenRouter + +OpenRouter 是一個統一接入平台,可讓您存取來自多個提供方的大量語言模型,其中也包含免費選項,便於比較並找到最適合您需求的模型。 + +1. 在 [**OpenRouter**](https://openrouter.ai/keys) 取得 API Key。需要註冊;若使用付費模型,可能還需要綁定付款方式。 +2. 在 **設定 ⚙️ → 通用 → LLM 提供方** 中選擇 **OpenAI Compatible** 作為提供方。 +3. 在 **OpenAI Compatible Server → 密鑰** 中輸入您的 API Key。 +4. 在 [**OpenRouter Models Page**](https://openrouter.ai/models) 瀏覽可用模型。您可以使用「Prompt Pricing」篩選免費模型。 + **注意:** 不同模型提供方的資料保留與隱私政策可能不同,請在使用前自行查看。 +5. 在 **OpenAI Compatible Server → 模型** 中輸入您所選的模型名。推薦系列包括: + - `Anthropic: Claude Sonnet 4.6` (`anthropic/claude-sonnet-4.6`: [Link](https://openrouter.ai/anthropic/claude-sonnet-4.6)) — Claude 系列中品質與成本平衡較好的選擇 + - `Qwen: Qwen3.5-35B-A3B` (`qwen/qwen3.5-35b-a3b`: [Link](https://openrouter.ai/qwen/qwen3.5-35b-a3b)) — 推薦的開源模型 + - `Qwen: Qwen3-Next-80B-A3B`(免費模型:`qwen/qwen3-next-80b-a3b-instruct:free`: [Link](https://openrouter.ai/qwen/qwen3-next-80b-a3b-instruct:free))— 推薦的免費模型 + - `OpenAI: GPT-OSS 120B`(免費模型:`openai/gpt-oss-120b:free`: [Link](https://openrouter.ai/openai/gpt-oss-120b:free))— 推薦的免費模型 + - 注意:免費模型提供方可能會蒐集您的資料,使用前請先查看模型頁面說明 + - 注意:免費模型的可用性變化頻繁。如需查看最新免費選項,請造訪 [OpenRouter Models Page](https://openrouter.ai/models),並使用 **Prompt Pricing** 過濾目前免費模型 +6. 在 **OpenAI Compatible Server → 基礎 URL** 中填入 `https://openrouter.ai/api/v1`。 + +### 關於 agent 與 LLM 提供方 + +出於安全考量,當您從非本地主機環境使用 K.G.Studio 時,API Key 預設不會持久化到 IndexedDB 中;這表示您每次啟動 K.G.Studio 時都需要重新輸入。如需在非本地主機環境中啟用持久化,請在設定中開啟「Persist API Keys on Non-Localhost」(不建議在共享或生產環境中啟用)。 + +K.G.Studio 不提供也不託管上述任何模型,也不隸屬於任何模型提供方。所有資料都儲存在您的本地裝置中;K.G.Studio 不會蒐集或傳輸您的資料。若您向第三方模型提供方傳送任何資料,相關責任由您自行承擔。 + +## K.G.One Music Generator + +> **需要 [K.G.One Music Studio](https://github.com/KGAudioLab/K.G.One) 整合。** 只有當 K.G.Studio 連線到正在執行的 K.G.One 伺服器時,K.G.One Music Generator 面板才會可用。設定說明請參閱 [K.G.One 儲存庫](https://github.com/KGAudioLab/K.G.One)。 + +**K.G.One Music Generator** 面板提供三項經 GPU 加速的 AI 工具,用於音樂生成與音訊處理。點擊工具列中的 **✦(魔杖)** 按鈕即可開啟。該面板與 AI Assistant 聊天框互斥,開啟其中一個時,另一個會自動關閉。 + +> **注意:** 您首次使用每個工具時,伺服器都需要載入對應 AI 模型,這可能需要 60 秒甚至更久,具體取決於您的硬體。切換分頁時,也可能觸發模型重新載入。 + +### Full Song Generation + +根據文字描述和可選歌詞生成一首完整歌曲。由 [ACE-Step 1.5](https://github.com/ace-step/ACE-Step-1.5) 驅動。 + +- 在 **Full Song** 分頁中,於 **Caption** 中輸入自然語言描述,說明所需風格、情緒、速度、配器和結構。例如:`Genre: Eurodance, 90s dance-pop, upbeat electronic. Tempo: ~130 BPM. Instrumentation: driving kick drum, eurodance bassline...` +- 您也可以填寫 **Lyrics**。可使用 `[Intro]`、`[Verse]`、`[Chorus]`、`[Bridge]` 等標籤標記段落。若勾選 **Instrumental**,則會完全跳過人聲。 +- 點擊 **Generate Song**。介面會即時顯示生成階段與百分比進度。 +- 生成完成後,會顯示預覽播放器。您可以將其拖曳到 **audio track**,作為區域匯入。 +- 目前不支援將整曲生成結果拖放到 MIDI track。 +- **Advanced Settings**(可展開):Inference Steps、Guidance Scale、Seed,以及 Thinking(CoT metadata generation)。 + +### Clip Generation + +根據文字描述生成短樂器片段和 MIDI loops。由 [Foundation-1](https://huggingface.co/RoyalCities/Foundation-1) 驅動。 + +- 在 **Clip** 分頁中,於 **Prompt** 中輸入逗號分隔的標籤,描述樂器類別、子類型、音色、效果、長度、BPM 和調性。例如:`Gritty, Acid, Bassline, 303, Synth Lead, FM, Sub, High Reverb, 8 Bars, 140 BPM, E minor` +- 您也可以填寫 **Negative Prompt**,以避免生成某些不希望出現的特徵(例如 `distortion, noise`)。 +- 選擇 **Bars**:4 或 8。BPM 與調號會根據專案設定預填,您也可以在 **Advanced Settings** 中調整。 +- 點擊 **Generate Clip**。生成完成後,會出現一個預覽播放器,左側帶拖曳手把,右側帶下載按鈕。 +- **匯入方式**:將播放器拖曳到時間線中的音軌上。 + - 拖放到 **audio track** 時,會作為 WAV 音訊區域匯入(推薦)。 + - 拖放到 **MIDI track** 時,會作為 MIDI 區域匯入。請注意,此 MIDI 是從音訊轉錄而來,可能並非完全準確。 +- **Advanced Settings**(可展開):Note、Scale、BPM、Steps、CFG Scale、Seed(`-1` 表示隨機)、Sampler Type、Sigma Min/Max,以及 CFG Rescale。 + +### Stem Separation + +將現有音訊區域拆分為獨立 stems(例如人聲、伴奏、鼓組等)。 + +K.G.Studio 支援 **兩種模式** 的分軌: + +#### 本地瀏覽器模式 — 無需伺服器 ✦ + +兩個 ONNX 模型可完全在瀏覽器中執行,無 API 呼叫、無費用,資料也不會離開您的裝置。模型只需下載一次,隨後會快取在本地。 + +- **Vocal and Instrument (Medium Accuracy)**(`UVR-MDX-NET-Inst_HQ_3`,約 64 MB)— 雙 stem 分離(Vocals / Instrumental)。由 [UVR-MDX-NET](https://github.com/nomadkaraoke/python-audio-separator) 驅動。 +- **Vocal, Drums, Bass, and Others**(`htdemucs_4s`,約 172 MB)— 四 stem 分離(Vocals / Drums / Bass / Others)。由 [Demucs](https://github.com/facebookresearch/demucs) 驅動。 + +開啟 **Music Generator** 面板(工具列中的 ✦ 按鈕),選擇模型,先點擊一次 **Download Selected Model**,然後點擊 **Separate Stems**,所有處理都會在您的瀏覽器中本機完成。 + +**要求:** 需要支援 WebGPU 的瀏覽器(Chrome 113+ 或 Edge 113+),並執行在安全上下文中(HTTPS 或 localhost)。若可用,會優先使用 WebGPU 加速;否則會回退到 CPU(處理期間可能降低頁面回應性)。推薦硬體為至少 8 GB 顯存的 GPU,或至少 16 GB 統一記憶體的系統。 + +#### K.G.One 伺服器模式 + +當連線到 [K.G.One Music Studio](https://github.com/KGAudioLab/K.G.One) 伺服器後,可使用另外三種 GPU 加速模型。由 [python-audio-separator (UVR5)](https://github.com/nomadkaraoke/python-audio-separator) 驅動。 + +- **Vocal and Instrument (Medium Accuracy)**(`UVR-MDX-NET-Inst_HQ_3`)— 快速雙 stem 分離(vocal / instrumental)。 +- **Vocal and Instrument (High Accuracy)**(`MDX23C-8KFFT-InstVoc_HQ`)— 更高品質的雙 stem 分離,但更慢。 +- **Vocal, Drums, Bass, Guitar, Piano, and Others**(`htdemucs_6s`)— 完整六 stem 分離。 + +#### 使用方式(兩種模式通用) + +- 在開啟此分頁之前,請先在時間線上**選取一個音訊區域**。**Separator** 分頁頂部會顯示目前所選區域及其音軌名稱。僅支援音訊區域,不支援分離 MIDI 區域。 +- 點擊 **Separate Stems**。如果目前所選區域帶有 clip start offset 或已被裁剪,系統會先自動按該區域範圍切出對應音訊,再進行處理。 +- 處理完成後,每個 stem 都會以帶標籤的預覽播放器顯示,並附帶拖曳手把。您可以在匯入前分別試聽每個 stem。 +- **匯入 stems:** + - 可將每個 stem 播放器分別拖曳到 **audio track** 上,放到您希望的位置。 + - 或點擊 **Import All Stems to Timeline**,系統會自動為每個 stem 新建一條音訊軌,並將其放置在源音軌下方,與原始區域的起始拍點對齊。該操作可透過一次復原完整回退。 + +## 即將推出的功能 + +功能優先級可能會變化。 + +### 1.0 + +- [X] 更多樂器 +- [X] 自動化測試(單元測試、整合測試等) +- [X] 帶功能和聲指導(T/S/D)的智慧和弦助手 +- [X] 支援軌道控制自動化(例如 sustain、volume、pan 等) +- [X] 支援 MIDI 控制事件(例如 CC、pitch bend 等) +- [X] 支援 WAV 音訊軌 +- [X] 錄音 +- [X] 事件列表 +- [X] 支援 OpenAI 的開源模型(`gpt-oss-20b` 和 `gpt-oss-120b`) +- [X] 五線譜 +- [X] K.G.One Music Studio 整合 +- [X] 瀏覽器內嵌 AI 模型(基於 Gemma 4 E4B 的本機 LLM;基於 UVR-MDX-NET-Inst_HQ_3 與 htdemucs_4s 的本機分軌) +- [X] 全域軌系統(Marker、Tempo、Key Signature、Chord) +- [X] 音訊和弦檢測(零依賴 FFT,並將結果寫入 Chord Track) +- [X] 帶自動對齊拍點的速度檢測 +- [X] 頻譜可視化與 Piano Roll hybrid mode + +### 1.0 之後 + +- [ ] 擴展 AI agent 工具,直接透過聊天操作區域、音軌與全域軌(和弦進行、速度、調性) +- [ ] Mixer 視圖,提供專用面板顯示每軌推桿、send、return bus 與 master channel +- [ ] EQ 與通道條,為每條音軌提供參數均衡器與壓縮器 +- [ ] 濾波器與效果器,如混響、延遲及其他基於 WebAudio 的原生插入效果 +- [ ] 音訊 time-stretch / warp,使音訊區域自動匹配專案速度 +- [ ] MIDI 效果器,如琶音器、音階量化器、和弦記憶 +- [ ] 虛擬 MIDI 裝置輸出 + +## 需要幫助 + +我們正在尋找貢獻者,一起讓 K.G.Studio 變得更好。無論您是開發者、音樂人還是設計師,您的專長都能帶來實際價值。 + +### 您可以如何參與 + +**🎵 音樂人 / 音樂製作人** +- 使用真實音樂製作流程測試這款 DAW +- 回饋樂器音色品質與真實感 +- 提出音樂創作中不可或缺但目前缺失的功能 +- 幫助提升 AI 助手的音樂理解能力 + +**💻 開發者** +- 根據路線圖實作新功能 +- 修復 bug 並最佳化效能 +- 增強 Web Audio 整合 +- 改進 AI 助手能力 + +**🎨 UI/UX 設計師** +- 最佳化介面和工作流 +- 設計更適合音樂編輯的視覺回饋 +- 打造更直觀的互動方式 + +### 參與方式 + +如果您有興趣貢獻,我們很願意聽到您的想法。 + +- **給我們發郵件**:[kgstudio@duck.com](mailto:kgstudio@duck.com) +- **查看 Issues**:瀏覽帶有 `help wanted` 或 `good first issue` 標籤的公開問題 +- **參與討論**:在 GitHub Discussions 中分享想法與回饋 + +每一份貢獻都很重要。無論是回報 bug,還是提出新功能建議,都會推動專案繼續前進。 + +### 免責聲明 + +K.G.Studio 是一個處於早期開發階段的實驗性專案。我們正在探索如何將 AI agent 與 LLM 融入音樂製作工作流,本質上是在建構一種面向 DAW 的「Cursor 或 Claude Code」體驗。 + +該專案關注 AI 與人類協作如何增強音樂創作過程,從智慧和聲建議到自動化編輯任務都在探索範圍內。作為實驗平台,專案會頻繁變化,功能將持續演進,並且在我們推進 AI 輔助音樂製作邊界的過程中,偶爾出現不穩定情況也是可以預期的。 + +K.G.Studio 不提供也不託管任何 LLM 模型,也不隸屬於任何模型提供方。所有資料都儲存在您的本地裝置中;K.G.Studio 不會蒐集或傳輸您的資料。若您向第三方模型提供方傳送任何資料,相關責任由您自行承擔。 + +## 授權條款 + +本專案基於 Apache License, Version 2.0 授權,並附帶額外條款(參見 `LICENSE`): +- 不得使用本軟體或相關素材申請專利 +- 當用於公開或商業產品時需要署名(「Powered by K.G.Studio」) + +第三方聲明(FluidR3_GM SoundFont、midi-js-soundfonts、VexFlow、prompt structure notes、Gemma 4 E4B、UVR-MDX-NET-Inst_HQ_3、MediaPipe、Meyda、web-audio-beat-detector、tonal、htdemucs_4s、onnxruntime-web 和 demucs-web)已包含在 `LICENSE` 中。 diff --git a/README.md b/README.md index 3e9b8a7..683763f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +English | [Français](./README-fr.md) | [简体中文](./README-zh_cn.md) | [繁體中文](./README-zh_hk.md) +
K.G.Studio Logo
@@ -27,6 +29,8 @@ K.G.Studio is a lightweight, modern DAW that runs entirely in the browser with * ## Latest Updates +- **2026.05.30**: Added **internationalization (i18n) support** — K.G.Studio now ships in four languages: **English**, **Simplified Chinese (简体中文)**, **Traditional Chinese (繁體中文)**, and **French (Français)**. The active language can be configured under **Settings ⚙️ → General → Language**, with an `Auto` option that automatically detects your browser's locale. + - **2026.05.27**: - Added **Global Track System** — introduce four global tracks: **Marker**, **Tempo**, **Key Signature**, and **Chord** (chord-symbol span regions). - Added **Audio Chord Detection** feature — open piano roll window for an audio or a MIDI region and click "..." -> **Detect Chords** to automatically analyse the recording and populate the Chord Track using a zero-dependency FFT pipeline with configurable sensitivity, stability, and seventh-chord detection. diff --git a/public/chat/help-fr_fr.md b/public/chat/help-fr_fr.md new file mode 100644 index 0000000..18452a8 --- /dev/null +++ b/public/chat/help-fr_fr.md @@ -0,0 +1,107 @@ +## Aide + +Bienvenue dans **l’assistant musical K.G.Studio**, votre agent IA dédié à la composition, à l’arrangement et au travail de production directement dans le navigateur. + +Pour commencer, vous pouvez soit utiliser le **LLM local intégré au navigateur** sans clé API, soit configurer un fournisseur LLM externe. + +--- + +### Utiliser le LLM local (navigateur) sans clé API + +K.G.Studio peut exécuter **Gemma 4 E4B** entièrement dans votre navigateur avec accélération WebGPU. Aucune requête API externe n’est envoyée, aucun coût supplémentaire n’est engagé, et vos données restent sur votre machine. + +1. Dans **Réglages ⚙️ → Général → Fournisseur LLM**, sélectionnez **LLM local (navigateur)**. +2. Le modèle (~2,8 Go) se télécharge automatiquement lors de la première ouverture du chat, puis reste en cache local pour les lancements suivants. +3. Vous pouvez régler la **Longueur de contexte** (32k / 64k / 128k tokens) selon votre matériel. +4. Commencez à dialoguer. + +**Configuration recommandée :** Chrome 113+ ou Edge 113+, contexte sécurisé (HTTPS ou localhost), et GPU avec au moins 8 Go de VRAM ou machine avec au moins 16 Go de mémoire unifiée. + +> Remarque : la qualité du modèle local reste inférieure à celle des grands modèles commerciaux. Pour les tâches complexes, un fournisseur externe donnera généralement de meilleurs résultats. + +--- + +### Configurer un fournisseur LLM externe + +Allez dans **Réglages ⚙️ → Général → Fournisseur LLM**. Selon le fournisseur choisi, vous devrez renseigner la clé API appropriée et, si besoin, une URL de base personnalisée. + +--- + +### Utiliser OpenAI + +1. Récupérez une clé API OpenAI depuis [**OpenAI**](https://platform.openai.com/account/api-keys). +2. Dans **Réglages ⚙️ → Général → Fournisseur LLM**, choisissez **OpenAI**. +3. Saisissez votre clé dans **OpenAI → Clé**. +4. Sélectionnez le modèle voulu dans **OpenAI → Modèle**. Pour un bon compromis coût / performances, `gpt-5.4-mini` est recommandé. +5. Vous pouvez activer **Mode Flex** si vous acceptez une latence plus variable en échange d’un coût potentiellement réduit. + +--- + +### Utiliser OpenRouter + +OpenRouter donne accès à de nombreux modèles via une API unique, y compris certaines options gratuites. + +1. Créez une clé API sur [**OpenRouter**](https://openrouter.ai/keys). +2. Dans **Réglages ⚙️ → Général → Fournisseur LLM**, choisissez **Serveur compatible OpenAI**. +3. Saisissez votre clé dans **Serveur compatible OpenAI → Clé**. +4. Consultez les modèles disponibles sur la [**page des modèles OpenRouter**](https://openrouter.ai/models). +5. Saisissez le nom du modèle dans **Serveur compatible OpenAI → Modèle**. +6. Saisissez `https://openrouter.ai/api/v1` dans **Serveur compatible OpenAI → URL de base**. + +### Opérations DAW de base + +Commandes du chat : `/clear`, `/welcome`, `/help`, `/hotkeys` + +- Pistes + - Ajouter, renommer et réordonner les pistes depuis le panneau d’infos de piste. + - Changer d’instrument via le bouton instrument ; régler Solo, Mute et Volume. + - Supprimer une piste depuis son menu de réglages. + - **Enregistrement audio** : cliquez sur `Rec` dans la barre d’outils pour enregistrer directement dans une piste audio. + +- Régions + - Créer une région : avec l’outil pointeur, double-cliquez ; ou maintenez `Ctrl/Cmd` et cliquez. Avec l’outil crayon, un simple clic suffit. + - Déplacer / redimensionner : faites glisser le corps de région pour déplacer, ou les bords pour redimensionner. + - Ouvrir le Piano Roll via le petit crayon en haut à gauche de la région. + +- Piano Roll + - Outils : Sélection ou Crayon. + - Créer des notes : double-clic ou `Ctrl/Cmd+clic` en mode sélection ; clic simple en mode crayon. + - Sélectionner : clic, `Maj+clic` pour la multisélection, ou glisser pour un lasso. + - Déplacer / redimensionner : faites glisser le corps ou les bords des notes. + - **Vue partition** : bascule entre Piano Roll et notation sur portée depuis la barre d’outils. + - **Voies d’automation** : éditez le pitch bend et les courbes MIDI CC sous la grille piano. + - **Mode spectrogramme** : affichez le spectrogramme d’une région audio comme référence d’édition. + - **Liste des événements** : inspectez et modifiez les notes, pitch bends et contrôleurs de la région MIDI active. + +- Système de pistes globales + - Quatre pistes permanentes en haut de la timeline : **Repère**, **Tempo**, **Armure** et **Accord**. + - Elles pilotent le timing, les suggestions d’accords, l’affichage de la partition et certains résultats d’analyse. + +- Analyse audio + - **Détecter les accords** : ouvre l’analyse harmonique d’une région audio et alimente la piste globale des accords. + - **Détecter le tempo** : analyse une région audio pour en extraire le BPM et peut réaligner le tempo du projet. + +- Générateur musical K.G.One + - Cliquez sur le bouton **✦** dans la barre d’outils. + - **Morceau complet** : génération d’un titre complet à partir d’une description et, si besoin, de paroles. + - **Clip** : génération de clips instrumentaux courts et de boucles MIDI. + - **Séparation de stems (navigateur)** : séparation locale d’une région audio en stems, sans serveur. + +- Snap et quantification + - Réglez le snap depuis le menu `NO SNAP`. + - Quantifiez avec `Qua. Pos.` et `Qua. Len.`. + +- Lecture + - Retour au début ; Lecture / Pause depuis la barre d’outils. + - Placez la tête de lecture en cliquant sur les numéros de mesure. + - Changez BPM, chiffrage de mesure et armure depuis la barre d’outils. + +--- + +### Remarque + +Par sécurité, lorsque K.G.Studio tourne hors d’un hôte local, les clés API ne sont pas conservées dans IndexedDB par défaut. Vous pouvez activer leur persistance dans les réglages, mais ce n’est pas recommandé sur un environnement partagé. + +### Avertissement + +K.G.Studio n’héberge aucun des modèles mentionnés et n’est affilié à aucun fournisseur de modèles. Toutes les données restent sur votre appareil ; vous êtes responsable des informations envoyées à des services tiers. diff --git a/public/chat/help-zh_cn.md b/public/chat/help-zh_cn.md new file mode 100644 index 0000000..cebab8e --- /dev/null +++ b/public/chat/help-zh_cn.md @@ -0,0 +1,126 @@ +## 帮助 + +欢迎使用 **K.G.Studio 音乐创作助手**。这是您的 AI 音乐创作与编曲助手,可以帮助您构思、编排和修改音乐内容。 + +您可以选择使用 **内置本地浏览器 LLM**(无需 API Key),也可以配置外部 LLM 提供方。下面是常用的入门方式。 + +--- + +### 使用本地 LLM(浏览器)——无需 API Key + +K.G.Studio 可以通过 WebGPU 在浏览器中直接运行 **Gemma 4 E4B**。不会产生外部 API 调用费用,数据也不会离开您的设备。 + +1. 进入 **设置 ⚙️ → 通用 → LLM 提供方**,选择 **本地 LLM(浏览器)**(默认选项)。 +2. 第一次打开聊天时会自动下载模型(约 2.8 GB),后续会缓存在本地浏览器中。 +3. 可选设置 **上下文长度**(32k / 64k / 128k tokens);越大越占显存。 +4. 现在就可以开始聊天,无需 Key、账号或持续联网。 + +**要求:** Chrome 113+ 或 Edge 113+,安全上下文(HTTPS 或 localhost),以及至少 8 GB 显存的 GPU 或至少 16 GB 统一内存的系统。 + +> 注意:本地模型效果无法与 GPT 或 Claude 这类商业模型完全相比。复杂任务通常更适合外部提供方。 + +--- + +### 配置外部 LLM 提供方 + +进入 **设置 ⚙️ → 通用 → LLM 提供方**。根据所选提供方,您需要填写对应的 API Key,以及在需要时填写 Base URL(例如 Ollama、OpenRouter 等 OpenAI 兼容服务)。 + +--- + +### 使用 OpenAI GPT 系列 + +1. 在 [**OpenAI**](https://platform.openai.com/account/api-keys) 获取 API Key。您可能需要先注册账号并添加支付方式。 +2. 在 **设置 ⚙️ → 通用 → LLM 提供方** 中选择 **OpenAI**。 +3. 在 **OpenAI → 密钥** 中填入 API Key。 +4. 在 **OpenAI → 模型** 下拉中选择模型。若希望在成本和效果之间取得平衡,推荐 `gpt-5.4-mini`。 +5. 可选:在 **OpenAI → Flex 模式** 中启用 Flex Mode。它可能降低成本,但也可能带来更高延迟或更多服务端错误。 + +--- + +### 使用 OpenRouter + +OpenRouter 提供统一接口,可访问多个语言模型提供方的模型,其中也包含免费选项,适合比较不同模型表现。 + +1. 在 [**OpenRouter**](https://openrouter.ai/keys) 获取 API Key。需要注册;使用付费模型时可能还需要绑定支付方式。 +2. 在 **设置 ⚙️ → 通用 → LLM 提供方** 中选择 **OpenAI 兼容服务**。 +3. 在 **OpenAI 兼容服务 → 密钥** 中填入 API Key。 +4. 在 [**OpenRouter Models Page**](https://openrouter.ai/models) 浏览可用模型,并可使用 “Prompt Pricing” 过滤免费模型。 + **注意:** 各模型提供方的数据保留与隐私策略可能不同,使用前请自行查看。 +5. 在 **OpenAI 兼容服务 → 模型** 中填入模型名。推荐系列包括: + - `Anthropic: Claude Sonnet 4.6`(`anthropic/claude-sonnet-4.6`)—— Claude 系列里质量和成本平衡较好 + - `Qwen: Qwen3.5-35B-A3B`(`qwen/qwen3.5-35b-a3b`)—— 推荐开源模型 + - `Qwen: Qwen3-Next-80B-A3B`(免费:`qwen/qwen3-next-80b-a3b-instruct:free`)—— 推荐免费模型 + - `OpenAI: GPT-OSS 120B`(免费:`openai/gpt-oss-120b:free`)—— 推荐免费模型 + - 注意:免费模型会经常变化,请以 OpenRouter 模型页中的 **Prompt Pricing** 过滤结果为准 + - 注意:免费模型提供方可能会收集您的数据,使用前请先查看模型页面说明 +6. 在 **OpenAI 兼容服务 → 基础 URL** 中填写 `https://openrouter.ai/api/v1`。 + +### 基本 DAW 操作 + +聊天命令:`/clear`、`/welcome`、`/help`、`/hotkeys` + +- 音轨 + - 在轨道信息面板中添加、重命名和重排音轨。 + - 通过乐器按钮(钢琴图标)切换乐器;可调整 Solo(S)、Mute(M)和 Volume。 + - 通过音轨设置菜单删除音轨(位于乐器按钮右侧)。 + - **音频录音**:点击工具栏里的 Rec 按钮,可直接从麦克风录到音频轨。 + +- 区域 + - 创建区域:使用 Pointer 工具时可双击,或按住 Ctrl/Cmd 再点击;使用 Pencil 工具时单击即可。 + - 移动/缩放:拖动区域主体可移动,拖动边缘可调整长度。 + - 通过区域左上角的小铅笔打开钢琴卷帘窗口。 + +- 钢琴卷帘(MIDI 音符) + - 工具:Select 与 Pencil。 + - 创建音符:在 Select 模式下双击或 Ctrl/Cmd+点击;在 Pencil 模式下单击。 + - 选择音符:单击;Shift+单击多选;拖拽框选。 + - 移动/缩放:拖动音符主体可移动已选音符;拖动边缘可调整长度。 + - **五线谱视图**:可在钢琴卷帘工具栏中切换钢琴卷帘与五线谱视图。支持自动谱号、调号显示、连音线和符杠分组。启用 **Track Scope** 后会连续显示整条 MIDI 音轨上的内容。 + - **自动化轨道**:可在下方自动化区域绘制和编辑 Pitch Bend 与 MIDI CC 曲线(Modulation、Breath、Volume、Expression、Sustain)。 + - **频谱模式**:可在钢琴卷帘中查看音频区域的频谱,作为 MIDI 编辑参考层。 + - **事件列表面板**:提供 Notes / Pitch Bend / Controller 标签页,用于查看并内联编辑当前 MIDI 区域中的事件。 + - 可通过 X 或 ESC 关闭钢琴卷帘窗口。 + +- 智能和弦助手 + - 在钢琴卷帘工具栏中使用 `⊘`、`T`、`S`、`D` 启用和弦指导。 + - 和弦候选会根据播放头当前位置的有效调号来推断:大调使用 Ionian,小调使用 Aeolian。 + - 将鼠标悬停在任意琴键上时,会以红色高亮显示上下文相关的和弦建议。 + - 按 `g` 循环切换和弦指导模式,按 `Tab` 切换到下一个候选和弦,按 `Shift+Tab` 切换到上一个。 + - 双击(或 Ctrl/Cmd+点击)高亮和弦可一次性创建整组音符。 + - 和弦长度会自动匹配您最近编辑的音符长度,以保持节奏一致。 + +- 全局轨系统 + - 时间线上方固定有四条轨道:**Marker**、**Tempo**、**Key Signature**、**Chord**。 + - 创建全局区域:在全局轨中双击或 Ctrl/Cmd+点击;拖动可移动,拖动边缘可调整长度。 + - 这些轨道会影响播放时序、和弦指导、五线谱调号显示,以及和弦检测结果。 + +- 音频分析功能 + - **Detect Chords**:在音频区域打开钢琴卷帘窗口后,点击 **...** → **Detect Chords**,即可自动分析并把结果写入全局 Chord Track。可配置灵敏度、稳定性和七和弦检测。 + - **Detect Tempo**:在音频区域打开钢琴卷帘窗口后,点击 **...** → **Detect Tempo**,即可分析 BPM,并可选择自动对齐项目中的 Tempo Track。 + +- K.G.One 音乐生成器 + - 点击工具栏中的 **✦**(魔杖)按钮打开生成器面板。 + - **Full Song Generation**:根据文本描述和可选歌词生成整首歌曲(需要 K.G.One 服务器)。 + - **Clip Generation**:根据文本提示生成短音频片段和 MIDI loop(需要 K.G.One 服务器)。 + - **Stem Separation(浏览器)**:可完全在浏览器中把任意音频区域分离成 stems,无需服务器。支持两种模型:**UVR-MDX-NET-Inst_HQ_3**(2 stem:Vocals / Instrumental,约 64 MB)和 **Demucs htdemucs_4s**(4 stem:Vocals / Drums / Bass / Others,约 172 MB)。在生成器面板中下载模型后,点击 **Separate Stems** 即可。需要 WebGPU(Chrome 113+ / Edge 113+)。 + +- 吸附与量化 + - 在右上角的 NO SNAP 菜单中设置吸附。 + - 使用 Qua. Pos.(起始)和 Qua. Len.(长度)进行量化。 + +- 播放与播放头 + - 工具栏可回到开头,并执行 Play/Pause。 + - 在主时间网格点击小节编号可设置播放头;在钢琴卷帘中点击顶部时间轴也可设置,并遵守当前吸附设置。 + - BPM、拍号和调号都可以通过工具栏中的数值直接调整。 + +--- + +### 说明 + +出于安全考虑,在非本地主机场景下,K.G.Studio 默认不会把 API Key 持久化到 IndexedDB 中(以降低 XSS 风险)。您每次打开 K.G.Studio 时都需要重新输入。若您确实需要在非本地主机场景下持久化,请在设置中启用 “Persist API Keys on Non-Localhost”(不建议在共享或生产环境下启用)。 + +### 免责声明 + +K.G.Studio 不提供也不托管上述任何模型,也不隶属于任何模型提供方。所有数据默认都保存在您的本地设备中;您向第三方模型提供方发送的任何数据,都由您自行负责。 + +祝您使用 K.G.Studio 音乐创作助手创作愉快! diff --git a/public/chat/help-zh_hk.md b/public/chat/help-zh_hk.md new file mode 100644 index 0000000..1cdbdf9 --- /dev/null +++ b/public/chat/help-zh_hk.md @@ -0,0 +1,126 @@ +## 幫助 + +歡迎使用 **K.G.Studio 音樂創作助手**。這是您的 AI 音樂創作與編曲助手,可以幫助您構思、編排和修改音樂內容。 + +您可以選擇使用 **內建本地瀏覽器 LLM**(無需 API Key),也可以設定外部 LLM 提供方。下面是常用的入門方式。 + +--- + +### 使用本地 LLM(瀏覽器)——無需 API Key + +K.G.Studio 可以通過 WebGPU 在瀏覽器中直接運行 **Gemma 4 E4B**。不會產生外部 API 呼叫費用,資料也不會離開您的裝置。 + +1. 進入 **設定 ⚙️ → 通用 → LLM 提供方**,選擇 **本地 LLM(瀏覽器)**(預設選項)。 +2. 第一次開啟聊天時會自動下載模型(約 2.8 GB),後續會快取在本地瀏覽器中。 +3. 可選設定 **上下文長度**(32k / 64k / 128k tokens);越大越佔顯存。 +4. 現在就可以開始聊天,無需 Key、帳號或持續聯網。 + +**要求:** Chrome 113+ 或 Edge 113+,安全上下文(HTTPS 或 localhost),以及至少 8 GB 顯存的 GPU 或至少 16 GB 統一記憶體的系統。 + +> 注意:本地模型效果無法與 GPT 或 Claude 這類商業模型完全相比。複雜任務通常更適合外部提供方。 + +--- + +### 配置外部 LLM 提供方 + +進入 **設定 ⚙️ → 通用 → LLM 提供方**。根據所選提供方,您需要填寫對應的 API Key,以及在需要時填寫 Base URL(例如 Ollama、OpenRouter 等 OpenAI 兼容服務)。 + +--- + +### 使用 OpenAI GPT 系列 + +1. 在 [**OpenAI**](https://platform.openai.com/account/api-keys) 取得 API Key。您可能需要先註冊帳號並新增付款方式。 +2. 在 **設定 ⚙️ → 通用 → LLM 提供方** 中選擇 **OpenAI**。 +3. 在 **OpenAI → 密鑰** 中填入 API Key。 +4. 在 **OpenAI → 模型** 下拉中選擇模型。若希望在成本和效果之間取得平衡,推薦 `gpt-5.4-mini`。 +5. 可選:在 **OpenAI → Flex 模式** 中啟用 Flex Mode。它可能降低成本,但也可能帶來更高延遲或更多服務端錯誤。 + +--- + +### 使用 OpenRouter + +OpenRouter 提供統一接口,可訪問多個語言模型提供方的模型,其中也包含免費選項,適合比較不同模型表現。 + +1. 在 [**OpenRouter**](https://openrouter.ai/keys) 取得 API Key。需要註冊;使用付費模型時可能還需要綁定付款方式。 +2. 在 **設定 ⚙️ → 通用 → LLM 提供方** 中選擇 **OpenAI 兼容服務**。 +3. 在 **OpenAI 兼容服務 → 密鑰** 中填入 API Key。 +4. 在 [**OpenRouter Models Page**](https://openrouter.ai/models) 瀏覽可用模型,並可使用 "Prompt Pricing" 過濾免費模型。 + **注意:** 各模型提供方的資料保留與隱私策略可能不同,使用前請自行查看。 +5. 在 **OpenAI 兼容服務 → 模型** 中填入模型名。推薦系列包括: + - `Anthropic: Claude Sonnet 4.6`(`anthropic/claude-sonnet-4.6`)—— Claude 系列裡質量和成本平衡較好 + - `Qwen: Qwen3.5-35B-A3B`(`qwen/qwen3.5-35b-a3b`)—— 推薦開源模型 + - `Qwen: Qwen3-Next-80B-A3B`(免費:`qwen/qwen3-next-80b-a3b-instruct:free`)—— 推薦免費模型 + - `OpenAI: GPT-OSS 120B`(免費:`openai/gpt-oss-120b:free`)—— 推薦免費模型 + - 注意:免費模型會經常變化,請以 OpenRouter 模型頁中的 **Prompt Pricing** 過濾結果為準 + - 注意:免費模型提供方可能會收集您的資料,使用前請先查看模型頁面說明 +6. 在 **OpenAI 兼容服務 → 基礎 URL** 中填寫 `https://openrouter.ai/api/v1`。 + +### 基本 DAW 操作 + +聊天命令:`/clear`、`/welcome`、`/help`、`/hotkeys` + +- 音軌 + - 在軌道資訊面板中新增、重命名和重排音軌。 + - 通過樂器按鈕(鋼琴圖示)切換樂器;可調整 Solo(S)、Mute(M)和 Volume。 + - 通過音軌設定選單刪除音軌(位於樂器按鈕右側)。 + - **音訊錄音**:點擊工具列裡的 Rec 按鈕,可直接從麥克風錄到音訊軌。 + +- 區域 + - 建立區域:使用 Pointer 工具時可雙擊,或按住 Ctrl/Cmd 再點擊;使用 Pencil 工具時單擊即可。 + - 移動/縮放:拖動區域主體可移動,拖動邊緣可調整長度。 + - 通過區域左上角的小鉛筆開啟 Piano Roll。 + +- Piano Roll(MIDI 音符) + - 工具:Select 與 Pencil。 + - 建立音符:在 Select 模式下雙擊或 Ctrl/Cmd+點擊;在 Pencil 模式下單擊。 + - 選取音符:單擊;Shift+單擊多選;拖曳框選。 + - 移動/縮放:拖動音符主體可移動已選音符;拖動邊緣可調整長度。 + - **五線譜視圖**:可在 Piano Roll 工具列中切換 Piano Roll 與五線譜視圖。支援自動譜號、調號顯示、連音線和符槓分組。啟用 **Track Scope** 後會連續顯示整條 MIDI 音軌上的內容。 + - **自動化軌道**:可在下方自動化區域繪製和編輯 Pitch Bend 與 MIDI CC 曲線(Modulation、Breath、Volume、Expression、Sustain)。 + - **頻譜模式**:可在 Piano Roll 中查看音訊區域的頻譜,作為 MIDI 編輯參考層。 + - **事件列表面板**:提供 Notes / Pitch Bend / Controller 標籤頁,用於查看並內聯編輯當前 MIDI 區域中的事件。 + - 可通過 X 或 ESC 關閉 Piano Roll 視窗。 + +- 智能和弦助手 + - 在 Piano Roll 工具列中使用 `⊘`、`T`、`S`、`D` 啟用和弦指導。 + - 和弦候選會根據播放頭當前位置的有效調號來推斷:大調使用 Ionian,小調使用 Aeolian。 + - 將滑鼠懸停在任意琴鍵上時,會以紅色高亮顯示上下文相關的和弦建議。 + - 按 `g` 循環切換和弦指導模式,按 `Tab` 切換到下一個候選和弦,按 `Shift+Tab` 切換到上一個。 + - 雙擊(或 Ctrl/Cmd+點擊)高亮和弦可一次性建立整組音符。 + - 和弦長度會自動匹配您最近編輯的音符長度,以保持節奏一致。 + +- 全域軌系統 + - 時間線上方固定有四條軌道:**Marker**、**Tempo**、**Key Signature**、**Chord**。 + - 建立全域區域:在全域軌中雙擊或 Ctrl/Cmd+點擊;拖動可移動,拖動邊緣可調整長度。 + - 這些軌道會影響播放時序、和弦指導、五線譜調號顯示,以及和弦檢測結果。 + +- 音訊分析功能 + - **Detect Chords**:在音訊區域開啟 Piano Roll 後,點擊 **...** → **Detect Chords**,即可自動分析並把結果寫入全域 Chord Track。可設定靈敏度、穩定性和七和弦檢測。 + - **Detect Tempo**:在音訊區域開啟 Piano Roll 後,點擊 **...** → **Detect Tempo**,即可分析 BPM,並可選擇自動對齊專案中的 Tempo Track。 + +- K.G.One 音樂生成器 + - 點擊工具列中的 **✦**(魔杖)按鈕開啟生成器面板。 + - **Full Song Generation**:根據文本描述和可選歌詞生成整首歌曲(需要 K.G.One 伺服器)。 + - **Clip Generation**:根據文本提示生成短音訊片段和 MIDI loop(需要 K.G.One 伺服器)。 + - **Stem Separation(瀏覽器)**:可完全在瀏覽器中把任意音訊區域分離成 stems,無需伺服器。支援兩種模型:**UVR-MDX-NET-Inst_HQ_3**(2 stem:Vocals / Instrumental,約 64 MB)和 **Demucs htdemucs_4s**(4 stem:Vocals / Drums / Bass / Others,約 172 MB)。在生成器面板中下載模型後,點擊 **Separate Stems** 即可。需要 WebGPU(Chrome 113+ / Edge 113+)。 + +- 吸附與量化 + - 在右上角的 NO SNAP 選單中設定吸附。 + - 使用 Qua. Pos.(起始)和 Qua. Len.(長度)進行量化。 + +- 播放與播放頭 + - 工具列可回到開頭,並執行 Play/Pause。 + - 在主時間網格點擊小節編號可設定播放頭;在 Piano Roll 中點擊頂部時間軸也可設定,並遵守目前吸附設定。 + - BPM、拍號和調號都可以通過工具列中的數值直接調整。 + +--- + +### 說明 + +出於安全考慮,在非本地主機場景下,K.G.Studio 預設不會把 API Key 持久化到 IndexedDB 中(以降低 XSS 風險)。您每次開啟 K.G.Studio 時都需要重新輸入。若您確實需要在非本地主機場景下持久化,請在設定中啟用 "Persist API Keys on Non-Localhost"(不建議在共享或生產環境下啟用)。 + +### 免責聲明 + +K.G.Studio 不提供也不託管上述任何模型,也不隸屬於任何模型提供方。所有資料預設都儲存在您的本地裝置中;您向第三方模型提供方發送的任何資料,都由您自行負責。 + +祝您使用 K.G.Studio 音樂創作助手創作愉快! diff --git a/public/chat/hotkeys-fr_fr.md b/public/chat/hotkeys-fr_fr.md new file mode 100644 index 0000000..8d0f431 --- /dev/null +++ b/public/chat/hotkeys-fr_fr.md @@ -0,0 +1,59 @@ +## Raccourcis + +Ce guide récapitule les raccourcis clavier et les actions avec modificateurs actuellement disponibles dans K.G.Studio. + +### Création selon la plateforme + +- Sur **macOS**, utilisez `Cmd+clic` pour créer une région, une note ou un point d’automation avec l’outil pointeur. +- Sur **Windows/Linux**, utilisez `Ctrl+clic` pour créer une région, une note ou un point d’automation avec l’outil pointeur. +- Dans la timeline principale, un double-clic dans une zone vide crée une région lorsque l’outil pointeur est actif. +- Dans le Piano Roll et les voies d’automation, l’outil crayon permet aussi de créer avec un simple clic. + +### Raccourcis principaux + +- `Espace` — Lecture / Arrêt +- `C` — Activer / désactiver la boucle +- `R` — Démarrer / arrêter l’enregistrement +- `Cmd/Ctrl+Z` — Annuler +- `Cmd/Ctrl+Shift+Z` — Rétablir +- `Cmd/Ctrl+C` — Copier les éléments sélectionnés +- `Cmd/Ctrl+V` — Coller +- `Cmd/Ctrl+S` — Enregistrer le projet +- `Cmd/Ctrl+A` — Sélectionner toutes les notes de la région MIDI active +- `Cmd/Ctrl+T` — Couper la région sélectionnée à la tête de lecture +- `Cmd/Ctrl+J` — Fusionner les régions MIDI sélectionnées + +### Fenêtre de région / Piano Roll + +- `E` — Ouvrir le Piano Roll pour une région MIDI sélectionnée, ou l’éditeur de forme d’onde pour une région audio sélectionnée. Si l’éditeur est déjà ouvert, `E` le ferme. +- `N` — Ouvrir le Piano Roll en vue partition pour une région MIDI sélectionnée. +- `Suppr` / `Retour arrière` — Supprimer les régions, notes ou points d’automation sélectionnés. +- `Esc` — Fermer la fenêtre du Piano Roll. + +### Sélection + +- `Maj+clic` — Ajouter à la sélection. +- Lasso dans une zone vide — Sélection rectangulaire de régions ou de points d’automation. +- `Maj+lasso` dans la fenêtre Piano Roll — Basculer la sélection des éléments contenus dans la zone. + +### Raccourcis du Piano Roll + +- `G` — Faire défiler les modes du guide d’accords +- `Tab` — Aller à la suggestion d’accord suivante +- `Maj+Tab` — Revenir à la suggestion d’accord ou au renversement précédent + +### Raccourcis de snap + +- `1` — Aucun snap +- `2` — Snap sur `1/4` +- `3` — Snap sur `1/8` +- `4` — Snap sur `1/16` + +### Raccourcis de quantification + +- `5` — Quantification de position sur `1/4` +- `6` — Quantification de position sur `1/8` +- `7` — Quantification de position sur `1/16` +- `8` — Quantification de durée sur `1/4` +- `9` — Quantification de durée sur `1/8` +- `0` — Quantification de durée sur `1/16` diff --git a/public/chat/hotkeys-zh_cn.md b/public/chat/hotkeys-zh_cn.md new file mode 100644 index 0000000..8ca4a29 --- /dev/null +++ b/public/chat/hotkeys-zh_cn.md @@ -0,0 +1,59 @@ +## 快捷键 + +本指南列出了当前在 K.G.Studio 中已经实现的键盘快捷键,以及部分点击时配合修饰键的操作。 + +### 平台相关的创建操作 + +- 在 **macOS** 上,使用 Pointer 工具时按 `Cmd+click` 可创建区域、音符或自动化点。 +- 在 **Windows/Linux** 上,使用 Pointer 工具时按 `Ctrl+click` 可创建区域、音符或自动化点。 +- 在主时间线中,Pointer 工具激活时双击空白处可创建区域。 +- 在钢琴卷帘与自动化轨中,Pencil 工具支持单击创建。 + +### 主快捷键 + +- `Space` — 播放 / 停止 +- `C` — 切换循环 +- `R` — 开始 / 停止录音 +- `Cmd/Ctrl+Z` — 撤销 +- `Cmd/Ctrl+Shift+Z` — 重做 +- `Cmd/Ctrl+C` — 复制所选项目 +- `Cmd/Ctrl+V` — 粘贴 +- `Cmd/Ctrl+S` — 保存项目 +- `Cmd/Ctrl+A` — 选中当前 MIDI 区域中的全部音符 +- `Cmd/Ctrl+T` — 在播放头处分割所选区域 +- `Cmd/Ctrl+J` — 合并选中的 MIDI 区域 + +### 区域与钢琴卷帘窗口快捷键 + +- `E` — 为选中的 MIDI 区域打开钢琴卷帘窗口,或为选中的音频区域打开波形编辑器;如果编辑器已经打开,`E` 会关闭它。 +- `N` — 以五线谱视图打开选中的 MIDI 区域。 +- `Delete` / `Backspace` — 删除选中的区域、音符或自动化点。 +- `Esc` — 关闭钢琴卷帘窗口。 + +### 选择操作 + +- `Shift+click` — 加入当前选择。 +- 在空白区域套索拖拽 — 框选区域或自动化点。 +- 在钢琴卷帘窗口中 `Shift+套索` — 切换套索范围内项目的选中状态。 + +### 钢琴卷帘快捷键 + +- `G` — 循环切换和弦指导模式 +- `Tab` — 跳到下一个和弦候选 +- `Shift+Tab` — 跳到上一个和弦候选 / 转位 + +### 钢琴卷帘吸附快捷键 + +- `1` — 不吸附 +- `2` — 吸附到 `1/4` +- `3` — 吸附到 `1/8` +- `4` — 吸附到 `1/16` + +### 钢琴卷帘量化快捷键 + +- `5` — 起始量化到 `1/4` +- `6` — 起始量化到 `1/8` +- `7` — 起始量化到 `1/16` +- `8` — 长度量化到 `1/4` +- `9` — 长度量化到 `1/8` +- `0` — 长度量化到 `1/16` diff --git a/public/chat/hotkeys-zh_hk.md b/public/chat/hotkeys-zh_hk.md new file mode 100644 index 0000000..6e7e30e --- /dev/null +++ b/public/chat/hotkeys-zh_hk.md @@ -0,0 +1,59 @@ +## 快捷鍵 + +本指南列出了當前在 K.G.Studio 中已經實現的鍵盤快捷鍵,以及部分點擊時配合修飾鍵的操作。 + +### 平台相關的建立操作 + +- 在 **macOS** 上,使用 Pointer 工具時按 `Cmd+click` 可建立區域、音符或自動化點。 +- 在 **Windows/Linux** 上,使用 Pointer 工具時按 `Ctrl+click` 可建立區域、音符或自動化點。 +- 在主時間線中,Pointer 工具啟用時雙擊空白處可建立區域。 +- 在 Piano Roll 與自動化軌中,Pencil 工具支援單擊建立。 + +### 主快捷鍵 + +- `Space` — 播放 / 停止 +- `C` — 切換循環 +- `R` — 開始 / 停止錄音 +- `Cmd/Ctrl+Z` — 撤銷 +- `Cmd/Ctrl+Shift+Z` — 重做 +- `Cmd/Ctrl+C` — 複製所選專案 +- `Cmd/Ctrl+V` — 貼上 +- `Cmd/Ctrl+S` — 儲存專案 +- `Cmd/Ctrl+A` — 選取目前 MIDI 區域中的全部音符 +- `Cmd/Ctrl+T` — 在播放頭處分割所選區域 +- `Cmd/Ctrl+J` — 合併已選取的 MIDI 區域 + +### 區域與 Piano Roll 視窗快捷鍵 + +- `E` — 為已選取的 MIDI 區域開啟 Piano Roll,或為已選取的音訊區域開啟波形編輯器;如果編輯器已經開啟,`E` 會關閉它。 +- `N` — 以五線譜視圖開啟已選取的 MIDI 區域。 +- `Delete` / `Backspace` — 刪除已選取的區域、音符或自動化點。 +- `Esc` — 關閉 Piano Roll 視窗。 + +### 選擇操作 + +- `Shift+click` — 加入目前選擇。 +- 在空白區域套索拖曳 — 框選區域或自動化點。 +- 在 Piano Roll 視窗中 `Shift+套索` — 切換套索範圍內項目的選取狀態。 + +### Piano Roll 快捷鍵 + +- `G` — 循環切換和弦指導模式 +- `Tab` — 跳到下一個和弦候選 +- `Shift+Tab` — 跳到上一個和弦候選 / 轉位 + +### Piano Roll 吸附快捷鍵 + +- `1` — 不吸附 +- `2` — 吸附到 `1/4` +- `3` — 吸附到 `1/8` +- `4` — 吸附到 `1/16` + +### Piano Roll 量化快捷鍵 + +- `5` — 起始量化到 `1/4` +- `6` — 起始量化到 `1/8` +- `7` — 起始量化到 `1/16` +- `8` — 長度量化到 `1/4` +- `9` — 長度量化到 `1/8` +- `0` — 長度量化到 `1/16` diff --git a/public/chat/welcome_again-fr_fr.md b/public/chat/welcome_again-fr_fr.md new file mode 100644 index 0000000..54a3940 --- /dev/null +++ b/public/chat/welcome_again-fr_fr.md @@ -0,0 +1,11 @@ +## Bon retour + +Ravi de vous revoir. Votre fournisseur LLM semble déjà configuré, vous pouvez commencer à dialoguer immédiatement. + +Conseils : +- Utilisez `/clear` à tout moment pour réinitialiser le chat. +- Tapez `/welcome` pour réafficher ce message. +- Tapez `/help` pour ouvrir l’aide. +- Tapez `/hotkeys` pour afficher le guide des raccourcis. + +Bonne composition avec l’assistant musical K.G.Studio. diff --git a/public/chat/welcome_again-zh_cn.md b/public/chat/welcome_again-zh_cn.md new file mode 100644 index 0000000..6ee48c1 --- /dev/null +++ b/public/chat/welcome_again-zh_cn.md @@ -0,0 +1,11 @@ +## 再次欢迎 + +很高兴再次见到您。检测到您的 LLM 提供方已经配置完成,现在可以直接开始聊天。 + +提示: +- 随时输入 `/clear` 重置当前聊天。 +- 输入 `/welcome` 再次查看这条欢迎消息。 +- 输入 `/help` 查看帮助说明。 +- 输入 `/hotkeys` 查看快捷键指南。 + +祝您在 K.G.Studio 音乐创作助手中创作顺利。 diff --git a/public/chat/welcome_again-zh_hk.md b/public/chat/welcome_again-zh_hk.md new file mode 100644 index 0000000..2c4ac42 --- /dev/null +++ b/public/chat/welcome_again-zh_hk.md @@ -0,0 +1,11 @@ +## 再次歡迎 + +很高興再次見到您。檢測到您的 LLM 提供方已經設定完成,現在可以直接開始聊天。 + +提示: +- 隨時輸入 `/clear` 重設目前聊天。 +- 輸入 `/welcome` 再次查看這條歡迎消息。 +- 輸入 `/help` 查看幫助說明。 +- 輸入 `/hotkeys` 查看快捷鍵指南。 + +祝您在 K.G.Studio 音樂創作助手中創作順利。 diff --git a/public/chat/welcome_local_llm-fr_fr.md b/public/chat/welcome_local_llm-fr_fr.md new file mode 100644 index 0000000..87bff2f --- /dev/null +++ b/public/chat/welcome_local_llm-fr_fr.md @@ -0,0 +1,29 @@ +## Mode LLM local + +Bienvenue dans **l’assistant musical K.G.Studio** en mode LLM local. + +- Aucune API externe n’est nécessaire. Tout s’exécute directement dans votre navigateur, sans coût API supplémentaire. +- Ce mode utilise **Gemma 4 E4B** via **LiteRT-LM** avec accélération **WebGPU**. +- Configuration matérielle recommandée : GPU avec au moins **8 Go de VRAM** ou système avec au moins **16 Go de mémoire unifiée**. +- Les performances restent plus limitées que celles des grands modèles hébergés dans le cloud, surtout pour les tâches longues, complexes ou très itératives. + +### Flux de travail recommandé +- Gardez des demandes courtes et ciblées. +- Faites progresser le modèle étape par étape vers le résultat final. +- Travaillez sur de petites régions musicales plutôt que sur des arrangements de morceau complet. +- Préférez des consignes d’arrangement simples lorsque c’est possible. +- Ouvrez une nouvelle conversation pour chaque tâche autonome. + +Exemple : +- Pour de meilleurs résultats, découpez les demandes complexes en plusieurs étapes. +- Si vous voulez que le modèle écrive une progression d’accords à partir de la musique actuelle, commencez par : `Please read the current music.` +- Une fois cette étape terminée, poursuivez avec : `Please write a chord progression based on it.` +- Ce flux incrémental est généralement plus fiable en mode LLM local. +- Gardez la région MIDI que vous souhaitez modifier sélectionnée pendant tout le flux de travail. +- Il n’est pas nécessaire de changer de sélection vers une autre région uniquement pour `read_music`, car `read_music` peut lire la musique sur l’ensemble des pistes. + +### Utiliser plutôt un LLM externe +- Si vous souhaitez utiliser un modèle plus grand dans le cloud ou auto-hébergé, ouvrez **Réglages -> Général -> Fournisseur LLM** et quittez **LLM local (navigateur)**. +- Pour un modèle cloud, vous pouvez utiliser **OpenAI**, ou **Serveur compatible OpenAI** avec un fournisseur comme OpenRouter. +- Pour un modèle auto-hébergé, choisissez **Serveur compatible OpenAI** puis renseignez l’**URL de base** et le **Modèle** de votre serveur. +- Après changement de fournisseur, démarrez une nouvelle conversation pour repartir proprement avec le nouveau modèle. diff --git a/public/chat/welcome_local_llm-zh_cn.md b/public/chat/welcome_local_llm-zh_cn.md new file mode 100644 index 0000000..5c4564e --- /dev/null +++ b/public/chat/welcome_local_llm-zh_cn.md @@ -0,0 +1,29 @@ +## 本地 LLM 模式 + +欢迎使用 **K.G.Studio 音乐创作助手** 的本地 LLM 模式。 + +- 无需外部 API 调用。所有内容都直接在您的浏览器中运行,不会产生额外 API 成本。 +- 此模式通过 **LiteRT-LM** 和 **WebGPU** 加速运行 **Gemma 4 E4B**。 +- 推荐硬件:至少 **8 GB 显存**的 GPU,或至少 **16 GB 统一内存**的系统。 +- 相比更大的云端模型,本地模式在复杂规划、长链路编辑和多步骤任务上能力会更有限。 + +### 推荐工作方式 +- 保持请求小而明确。 +- 分步骤引导模型逐步完成目标。 +- 尽量针对较小的音乐区域工作,而不是一次处理整首歌。 +- 优先选择更简单的音乐编排。 +- 每个独立任务尽量开启新的对话。 + +示例: +- 对较复杂的请求,建议拆成多个小步骤。 +- 例如,如果您想让模型基于当前音乐写一段和弦进行,可以先说:`请读取当前音乐。` +- 等这一步完成后,再继续说:`请基于它写一段和弦进行。` +- 在本地 LLM 模式下,这种渐进式流程通常更可靠。 +- 在整个流程中,保持您希望 agent 更新的 MIDI 区域处于选中状态。 +- 仅仅为了执行 `read_music`,您不需要切换到别的区域,因为 `read_music` 可以读取所有音轨的音乐内容。 + +### 改用外部 LLM +- 如果您想使用更大的云端模型或自托管模型,请打开 **设置 -> 通用 -> LLM 提供方**,切换到 **本地 LLM(浏览器)** 以外的提供方。 +- 如果要用云端模型,可以选择 **OpenAI**,或者选择 **OpenAI Compatible** 并填写 OpenRouter 等提供方。 +- 如果要用自托管模型,也请选择 **OpenAI Compatible**,然后填写您的服务器 **Base URL** 和 **Model**。 +- 切换提供方后,建议开启一个新的对话,以便聊天会话干净地使用新模型。 diff --git a/public/chat/welcome_local_llm-zh_hk.md b/public/chat/welcome_local_llm-zh_hk.md new file mode 100644 index 0000000..9a6b931 --- /dev/null +++ b/public/chat/welcome_local_llm-zh_hk.md @@ -0,0 +1,29 @@ +## 本地 LLM 模式 + +歡迎使用 **K.G.Studio 音樂創作助手** 的本地 LLM 模式。 + +- 無需外部 API 調用。所有內容都直接在您的瀏覽器中運行,不會產生額外 API 成本。 +- 此模式通過 **LiteRT-LM** 和 **WebGPU** 加速運行 **Gemma 4 E4B**。 +- 推薦硬體:至少 **8 GB 顯存**的 GPU,或至少 **16 GB 統一記憶體**的系統。 +- 相比更大的雲端模型,本地模式在複雜規劃、長鏈路編輯和多步驟任務上能力會更有限。 + +### 推薦工作方式 +- 保持請求小而明確。 +- 分步驟引導模型逐步完成目標。 +- 盡量針對較小的音樂區域工作,而不是一次處理整首歌。 +- 優先選擇更簡單的音樂編排。 +- 每個獨立任務盡量開啟新的對話。 + +示例: +- 對較複雜的請求,建議拆成多個小步驟。 +- 例如,如果您想讓模型基於當前音樂寫一段和弦進行,可以先說:`請讀取當前音樂。` +- 等這一步完成後,再繼續說:`請基於它寫一段和弦進行。` +- 在本地 LLM 模式下,這種漸進式流程通常更可靠。 +- 在整個流程中,保持您希望 agent 更新的 MIDI 區域處於選取狀態。 +- 僅僅為了執行 `read_music`,您不需要切換到別的區域,因為 `read_music` 可以讀取所有音軌的音樂內容。 + +### 改用外部 LLM +- 如果您想使用更大的雲端模型或自託管模型,請開啟 **設定 -> 通用 -> LLM 提供方**,切換到 **本地 LLM(瀏覽器)** 以外的提供方。 +- 如果要用雲端模型,可以選擇 **OpenAI**,或者選擇 **OpenAI Compatible** 並填寫 OpenRouter 等提供方。 +- 如果要用自託管模型,也請選擇 **OpenAI Compatible**,然後填寫您的伺服器 **Base URL** 和 **Model**。 +- 切換提供方後,建議開啟一個新的對話,以便聊天會話乾淨地使用新模型。 diff --git a/public/chat/welcome_new-fr_fr.md b/public/chat/welcome_new-fr_fr.md new file mode 100644 index 0000000..9a64870 --- /dev/null +++ b/public/chat/welcome_new-fr_fr.md @@ -0,0 +1,25 @@ +## Bienvenue + +Bienvenue dans **l’assistant musical K.G.Studio**, votre partenaire IA dans le navigateur pour la composition et l’arrangement. + +### Démarrage rapide +**Configurer l’assistant musical K.G.Studio** +- [Cliquez ici pour obtenir une clé API OpenRouter gratuite](https://openrouter.ai/keys) ; un compte OpenRouter peut être nécessaire. +- Dans **Réglages ⚙️ → Général → Fournisseur LLM**, sélectionnez **Serveur compatible OpenAI**. +- Dans **Serveur compatible OpenAI → Clé**, collez votre clé. Remarque : hors localhost, la clé n’est pas conservée après rechargement. +- Dans **Serveur compatible OpenAI → Modèle**, saisissez `qwen/qwen3-30b-a3b:free`. +- Dans **Serveur compatible OpenAI → URL de base**, saisissez `https://openrouter.ai/api/v1`. + +*(Vous pouvez aussi utiliser l’API officielle OpenAI ou tout autre service compatible OpenAI.)* + +**Opérations DAW de base** +- Double-cliquez sur une piste, ou faites `Ctrl/Cmd+clic`, pour créer une région. +- Faites glisser les bords d’une région pour la redimensionner ; faites glisser son corps pour la déplacer. +- Cliquez sur le petit crayon en haut à gauche d’une région pour ouvrir le Piano Roll. +- Dans le Piano Roll, double-cliquez ou faites `Ctrl/Cmd+clic` pour créer une note. +- Cliquez pour sélectionner ; `Maj+clic` pour la multisélection ; glissez pour une sélection rectangulaire. +- Faites glisser les bords d’une note pour modifier sa durée, ou son corps pour la déplacer. +- Utilisez le snap dans la barre d’outils du Piano Roll pour quantifier sur la grille. + +### Avertissement +K.G.Studio n’est affilié à aucun fournisseur LLM. Toutes les données sont stockées localement sur votre appareil ; vous restez responsable des données envoyées à des services tiers. diff --git a/public/chat/welcome_new-zh_cn.md b/public/chat/welcome_new-zh_cn.md new file mode 100644 index 0000000..8343882 --- /dev/null +++ b/public/chat/welcome_new-zh_cn.md @@ -0,0 +1,25 @@ +## 欢迎 + +欢迎使用 **K.G.Studio 音乐创作助手**。这是您在浏览器中的 AI 音乐创作与编曲助手。 + +### 快速开始 +**配置 K.G.Studio 音乐创作助手** +- [点击这里获取免费的 OpenRouter API Key](https://openrouter.ai/keys)(您可能需要一个 OpenRouter 账号)。 +- 进入 **设置 ⚙️ → 通用 → LLM 提供方**,选择 **OpenAI 兼容服务**。 +- 在 **OpenAI 兼容服务 → 密钥** 中粘贴您的 Key。注意:在非 localhost 环境下,Key 默认不会持久化,刷新后需要重新输入,请妥善保管。 +- 在 **OpenAI 兼容服务 → 模型** 中输入 `qwen/qwen3-30b-a3b:free`。注意:非免费模型可能需要计费。 +- 在 **OpenAI 兼容服务 → 基础 URL** 中输入 `https://openrouter.ai/api/v1`。 + +*(或者,您也可以使用官方 OpenAI API,或者任何 OpenAI 兼容服务。)* + +**基本 DAW 操作** +- 在音轨上双击(或按住 Ctrl/Cmd 再点击)可创建区域。 +- 拖动区域边缘可调整长度;拖动区域主体可移动。 +- 点击区域左上角的小铅笔可打开钢琴卷帘窗口。 +- 在钢琴卷帘中,双击(或 Ctrl/Cmd+点击)可创建音符。 +- 单击选择;Shift+单击多选;拖拽框选。 +- 拖动音符边缘可调整长度;拖动音符主体可移动所选音符。 +- 使用钢琴卷帘工具栏右上角的 Snapping 控制网格量化。 + +### 免责声明 +K.G.Studio 与任何 LLM 提供方均无隶属关系。所有数据默认都保存在您的本地设备中;您发送给第三方服务的数据由您自行负责。 diff --git a/public/chat/welcome_new-zh_hk.md b/public/chat/welcome_new-zh_hk.md new file mode 100644 index 0000000..9c41314 --- /dev/null +++ b/public/chat/welcome_new-zh_hk.md @@ -0,0 +1,25 @@ +## 歡迎 + +歡迎使用 **K.G.Studio 音樂創作助手**。這是您在瀏覽器中的 AI 音樂創作與編曲助手。 + +### 快速開始 +**配置 K.G.Studio 音樂創作助手** +- [點擊這裡獲取免費的 OpenRouter API Key](https://openrouter.ai/keys)(您可能需要一個 OpenRouter 帳號)。 +- 進入 **設定 ⚙️ → 通用 → LLM 提供方**,選擇 **OpenAI 兼容服務**。 +- 在 **OpenAI 兼容服務 → 密鑰** 中貼上您的 Key。注意:在非 localhost 環境下,Key 預設不會持久化,重新整理後需要重新輸入,請妥善保管。 +- 在 **OpenAI 兼容服務 → 模型** 中輸入 `qwen/qwen3-30b-a3b:free`。注意:非免費模型可能需要計費。 +- 在 **OpenAI 兼容服務 → 基礎 URL** 中輸入 `https://openrouter.ai/api/v1`。 + +*(或者,您也可以使用官方 OpenAI API,或者任何 OpenAI 兼容服務。)* + +**基本 DAW 操作** +- 在音軌上雙擊(或按住 Ctrl/Cmd 再點擊)可建立區域。 +- 拖動區域邊緣可調整長度;拖動區域主體可移動。 +- 點擊區域左上角的小鉛筆可開啟 Piano Roll。 +- 在 Piano Roll 中,雙擊(或 Ctrl/Cmd+點擊)可建立音符。 +- 單擊選取;Shift+單擊多選;拖曳框選。 +- 拖動音符邊緣可調整長度;拖動音符主體可移動所選音符。 +- 使用 Piano Roll 工具列右上角的 Snapping 控制網格量化。 + +### 免責聲明 +K.G.Studio 與任何 LLM 提供方均無隸屬關係。所有資料預設都儲存在您的本地裝置中;您發送給第三方服務的資料由您自行負責。 diff --git a/public/config.json b/public/config.json index 17e41cd..e9c1bd7 100644 --- a/public/config.json +++ b/public/config.json @@ -1,6 +1,6 @@ { "general": { - "language": "en_us", + "language": "auto", "llm_provider": "local_browser", "persist_api_keys_non_localhost": false, "openai": { diff --git a/src/components/ChatBox.test.tsx b/src/components/ChatBox.test.tsx new file mode 100644 index 0000000..e9a1f56 --- /dev/null +++ b/src/components/ChatBox.test.tsx @@ -0,0 +1,154 @@ +import React from 'react'; +import { beforeAll, describe, expect, it, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import ChatBox from './ChatBox'; +import { I18nContext } from '../i18n/I18nProvider'; +import type { ResolvedLocaleCode } from '../i18n/types'; +import { translate } from '../i18n/translate'; + +vi.mock('./chat', () => ({ + UserMessage: ({ content }: { content: string }) =>
{content}
, + AssistantMessage: ({ content }: { content: string }) =>
{content}
, +})); + +vi.mock('../agent/core/AgentCore', () => ({ + AgentCore: { + instance: () => ({ + setLLMProvider: vi.fn(), + getLLMProvider: vi.fn(), + abortCurrentRequest: vi.fn(), + getAgentState: vi.fn(() => ({ getMessages: vi.fn(() => []) })), + }), + }, +})); + +vi.mock('../agent/llm/LLMProvider', () => ({ + OpenAICompatibleLLMProvider: vi.fn(), +})); + +vi.mock('../agent/llm/LocalBrowserLLMProvider', () => ({ + LocalBrowserLLMProvider: vi.fn(), +})); + +vi.mock('../core/config/ConfigManager', () => ({ + ConfigManager: { + instance: () => ({ + getIsInitialized: () => true, + initialize: vi.fn().mockResolvedValue(undefined), + get: (key: string) => { + if (key === 'general.llm_provider') { + return 'openai'; + } + return ''; + }, + addChangeListener: () => () => undefined, + }), + }, +})); + +vi.mock('../stores/projectStore', () => ({ + useProjectStore: { + getState: () => ({ + setStatus: vi.fn(), + }), + }, +})); + +vi.mock('../agent/core/SystemPrompts', () => ({ + SystemPrompts: { + getSystemPromptWithContext: vi.fn(), + }, +})); + +vi.mock('../util/chatUtil', () => ({ + clearChatHistoryAndUI: vi.fn(), + registerClearChatUICallback: vi.fn(), +})); + +vi.mock('../util/messageFilter/UserMessageFilter', () => ({ + processUserMessage: vi.fn(), +})); + +vi.mock('../hooks/useStreamProcessor', () => ({ + useStreamProcessor: () => ({ + abortController: null, + processStream: vi.fn(), + }), +})); + +vi.mock('../utils/chatMessageUtils', () => ({ + createMessage: vi.fn(), + addWelcomeMessage: vi.fn().mockResolvedValue(null), +})); + +vi.mock('../util/timeUtil', () => ({ + formatLocalDateTime: vi.fn(), +})); + +vi.mock('../util/miscUtil', () => ({ + downloadBlob: vi.fn(), + buildTimestampSuffix: vi.fn(), +})); + +vi.mock('../util/localLLMModelManager', () => ({ + LocalLLMModelManager: { + getState: () => ({ + runtimeSupport: { supported: true, reason: null }, + isCached: false, + isDownloading: false, + isChecking: false, + progressText: '', + progressPercent: 0, + error: null, + }), + subscribe: () => () => undefined, + }, +})); + +vi.mock('../util/localLLMConfig', () => ({ + LOCAL_LLM_DISPLAY_NAME: 'Gemma 4 E4B', + LOCAL_LLM_PROVIDER_KEY: 'local_browser', +})); + +vi.mock('./common/KGDropdown', () => ({ + default: () => null, +})); + +function renderWithLocale(resolvedLocale: ResolvedLocaleCode) { + return render( + undefined, + t: (key, params) => translate(key, params, resolvedLocale), + }} + > + + , + ); +} + +describe('ChatBox', () => { + beforeAll(() => { + Element.prototype.scrollIntoView = vi.fn(); + }); + + it('renders the English assistant title under en_us', () => { + renderWithLocale('en_us'); + + expect(screen.getByRole('heading', { level: 3, name: 'K.G.Studio Musician Assistant' })).toBeTruthy(); + }); + + it('renders the Chinese assistant title under zh_cn', () => { + renderWithLocale('zh_cn'); + + expect(screen.getByRole('heading', { level: 3, name: 'K.G.Studio 音乐创作助手' })).toBeTruthy(); + }); + + it('renders the French assistant title under fr_fr', () => { + renderWithLocale('fr_fr'); + + expect(screen.getByRole('heading', { level: 3, name: 'Assistant musical K.G.Studio' })).toBeTruthy(); + }); +}); diff --git a/src/components/ChatBox.tsx b/src/components/ChatBox.tsx index d5aab5c..0881490 100644 --- a/src/components/ChatBox.tsx +++ b/src/components/ChatBox.tsx @@ -17,6 +17,7 @@ import { downloadBlob, buildTimestampSuffix } from '../util/miscUtil'; import { LocalLLMModelManager, type LocalLLMModelState } from '../util/localLLMModelManager'; import { LOCAL_LLM_DISPLAY_NAME, LOCAL_LLM_PROVIDER_KEY } from '../util/localLLMConfig'; import KGDropdown from './common/KGDropdown'; +import { useI18n } from '../i18n/useI18n'; import type { ChatMessage } from '../types/projectTypes'; @@ -63,6 +64,7 @@ interface ChatBoxProps { } const ChatBox: React.FC = ({ isVisible }) => { + const { t } = useI18n(); const [inputValue, setInputValue] = useState(''); const textareaRef = useRef(null); @@ -345,7 +347,7 @@ const ChatBox: React.FC = ({ isVisible }) => { return (
-

K.G.Studio Musician Assistant

+

{t('assistant.displayName')}

{isProcessing && (
diff --git a/src/components/InstrumentSelection.test.tsx b/src/components/InstrumentSelection.test.tsx new file mode 100644 index 0000000..4ac430d --- /dev/null +++ b/src/components/InstrumentSelection.test.tsx @@ -0,0 +1,79 @@ +import React from 'react'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { fireEvent, render, screen } from '@testing-library/react'; +import InstrumentSelection from './InstrumentSelection'; +import { KGMidiTrack } from '../core/track/KGMidiTrack'; +import { I18nContext } from '../i18n/I18nProvider'; +import type { ResolvedLocaleCode } from '../i18n/types'; +import { translate } from '../i18n/translate'; + +const midiTrack = new KGMidiTrack('Lead Track', 1, 'acoustic_grand_piano'); + +const storeState = { + tracks: [midiTrack], + selectedTrackId: '1', + closeInstrumentSelection: vi.fn(), + setTrackInstrument: vi.fn().mockResolvedValue(undefined), +}; + +vi.mock('../stores/projectStore', () => ({ + useProjectStore: () => storeState, +})); + +function renderWithLocale(resolvedLocale: ResolvedLocaleCode) { + return render( + undefined, + t: (key, params) => translate(key, params, resolvedLocale), + }} + > + + , + ); +} + +describe('InstrumentSelection', () => { + beforeEach(() => { + storeState.setTrackInstrument.mockClear(); + midiTrack.setInstrument('acoustic_grand_piano'); + }); + + it('renders translated group and instrument names under zh-CN', () => { + renderWithLocale('zh_cn'); + + expect(screen.getByText('钢琴与键盘')).toBeTruthy(); + expect(screen.getAllByText('原声大钢琴').length).toBeGreaterThan(0); + }); + + it('updates visible labels when locale changes', () => { + const view = renderWithLocale('en_us'); + expect(screen.getByText('Piano and Keyboards')).toBeTruthy(); + expect(screen.getAllByText('Acoustic Grand Piano').length).toBeGreaterThan(0); + + view.rerender( + undefined, + t: (key, params) => translate(key, params, 'zh_cn'), + }} + > + + , + ); + + expect(screen.getByText('钢琴与键盘')).toBeTruthy(); + expect(screen.getAllByText('原声大钢琴').length).toBeGreaterThan(0); + }); + + it('keeps instrument selection behavior on the same instrument key', async () => { + renderWithLocale('zh_cn'); + + fireEvent.click(screen.getByText('电钢琴 1')); + expect(storeState.setTrackInstrument).toHaveBeenCalledWith(1, 'electric_piano_1'); + }); +}); diff --git a/src/components/InstrumentSelection.tsx b/src/components/InstrumentSelection.tsx index 8602c53..303281c 100644 --- a/src/components/InstrumentSelection.tsx +++ b/src/components/InstrumentSelection.tsx @@ -4,8 +4,11 @@ import { useProjectStore } from '../stores/projectStore'; import { INSTRUMENT_GROUPS, FLUIDR3_INSTRUMENT_MAP } from '../constants/generalMidiConstants'; import { KGMidiTrack, type InstrumentType } from '../core/track/KGMidiTrack'; import { KGAudioTrack } from '../core/track/KGAudioTrack'; +import { useI18n } from '../i18n/useI18n'; +import { getInstrumentDisplayName, getInstrumentGroupLabel, type InstrumentGroupKey } from '../i18n/instruments'; const InstrumentSelection: React.FC = () => { + const { t } = useI18n(); const { tracks, selectedTrackId, @@ -31,24 +34,23 @@ const InstrumentSelection: React.FC = () => { setSelectedGroupKey(currentInstrumentDef?.group || 'PIANO_AND_KEYBOARDS'); }, [selectedTrackId, currentInstrumentKey, currentInstrumentDef]); - const groups = useMemo(() => Object.entries(INSTRUMENT_GROUPS) as Array<[string, string]>, []); + const groups = useMemo(() => Object.keys(INSTRUMENT_GROUPS) as InstrumentGroupKey[], []); - const instrumentsInGroup = useMemo(() => { + const instrumentsInGroup = useMemo>(() => { return Object.entries(FLUIDR3_INSTRUMENT_MAP) .filter((entry) => entry[1].group === selectedGroupKey) - .map((entry) => ({ key: entry[0], label: entry[1].displayName })); - }, [selectedGroupKey]); + .map((entry) => ({ key: entry[0] as InstrumentType, label: getInstrumentDisplayName(entry[0] as InstrumentType, t) })); + }, [selectedGroupKey, t]); const handleSelectGroup = (groupKey: string) => { setSelectedGroupKey(groupKey); }; - const handleSelectInstrument = async (instrumentKey: string) => { + const handleSelectInstrument = async (instrumentKey: InstrumentType) => { // If no valid target track, ignore user interaction if (!targetTrack || !(targetTrack instanceof KGMidiTrack)) return; - const instrument = instrumentKey as InstrumentType; try { - await setTrackInstrument(targetTrack.getId(), instrument); + await setTrackInstrument(targetTrack.getId(), instrumentKey); } catch (err) { console.error('Failed to change instrument from panel:', err); } @@ -56,7 +58,7 @@ const InstrumentSelection: React.FC = () => { const isAudioTrack = targetTrack instanceof KGAudioTrack; const previewImage = isAudioTrack ? 'speaker.png' : (FLUIDR3_INSTRUMENT_MAP[currentInstrumentKey]?.image || 'piano.png'); - const previewAlt = isAudioTrack ? 'Audio Track' : (FLUIDR3_INSTRUMENT_MAP[currentInstrumentKey]?.displayName || currentInstrumentKey); + const previewAlt = isAudioTrack ? 'Audio Track' : getInstrumentDisplayName(currentInstrumentKey, t); const hasTargetTrack = !!targetTrack; return ( @@ -82,13 +84,13 @@ const InstrumentSelection: React.FC = () => {
- {groups.map(([key, label]) => ( + {groups.map((key) => (
handleSelectGroup(key)} > - {label} + {getInstrumentGroupLabel(key, t)}
))}
@@ -113,5 +115,3 @@ const InstrumentSelection: React.FC = () => { }; export default InstrumentSelection; - - diff --git a/src/components/KGOnePanel.css b/src/components/KGOnePanel.css index dbfc3bf..9d10ba8 100644 --- a/src/components/KGOnePanel.css +++ b/src/components/KGOnePanel.css @@ -304,24 +304,6 @@ margin-top: 6px; } -.kgone-btn-generate-accent { - background-color: #4a5fa0; - border: none; - color: #e0e0e0; - cursor: pointer; - transition: background-color 0.15s; -} - -.kgone-btn-generate-accent:hover:not(:disabled) { - background-color: #5a70b8; -} - -.kgone-btn-generate-accent:disabled { - background-color: #3a3a3a; - color: #666; - cursor: not-allowed; -} - .kgone-btn-generate.dialog-btn { min-height: 32px; } diff --git a/src/components/KGOnePanel.tsx b/src/components/KGOnePanel.tsx index 7c46099..64235e6 100644 --- a/src/components/KGOnePanel.tsx +++ b/src/components/KGOnePanel.tsx @@ -15,6 +15,7 @@ import type { KeySignature } from '../core/KGProject'; import { ImportStemsCommand } from '../core/commands'; import type { StemImportEntry } from '../core/commands'; import { showAlert } from '../util/dialogUtil'; +import { useI18n } from '../i18n/useI18n'; import { getLocalSeparatorModelConfig, LOCAL_SEPARATOR_MODELS, @@ -75,13 +76,6 @@ function formatTime(sec: number): string { return `${m}:${s.toString().padStart(2, '0')}`; } -function formatKGOneTabLabel(tab: Tab): string { - if (tab === 'fullsong') return 'Full Song'; - if (tab === 'remix') return 'Remix'; - if (tab === 'repaint') return 'Repaint'; - return 'Separator'; -} - function getDefaultKGOneTab(mode: KGOneMode): Tab { return mode === 'local-separator' ? 'separator' : 'fullsong'; } @@ -213,6 +207,7 @@ interface ClipTabProps { } const ClipTab: React.FC = ({ bpm, keySignature }) => { + const { t } = useI18n(); const { note: defaultNote, scale: defaultScale } = parseKeySignature(keySignature); // Form state @@ -269,7 +264,7 @@ const ClipTab: React.FC = ({ bpm, keySignature }) => { try { // ── 1. Load the clip model ────────────────────────────────────────────── setGenStatus('loading-model'); - setGenHint('Loading model — this can take 60+ seconds, please wait...'); + setGenHint(t('kgone.shared.hint.loadingModel')); const baseUrl = getKGOneBaseUrl(); @@ -292,7 +287,7 @@ const ClipTab: React.FC = ({ bpm, keySignature }) => { // ── 2. Submit generation job ──────────────────────────────────────────── setGenStatus('generating'); - setGenHint('Submitting generation request...'); + setGenHint(t('kgone.shared.hint.submitting')); const genPayload = { prompt, @@ -330,15 +325,14 @@ const ClipTab: React.FC = ({ bpm, keySignature }) => { // ── 3. Poll for completion ────────────────────────────────────────────── setGenStatus('polling'); - setGenHint('Generating clip...'); - + setGenHint(t('kgone.clip.hint.generating')); while (true) { if (signal.aborted) return; await new Promise(r => { - const t = setTimeout(r, 5000); - signal.addEventListener('abort', () => { clearTimeout(t); r(); }, { once: true }); + const timer = setTimeout(r, 5000); + signal.addEventListener('abort', () => { clearTimeout(timer); r(); }, { once: true }); }); if (signal.aborted) return; @@ -358,7 +352,7 @@ const ClipTab: React.FC = ({ bpm, keySignature }) => { // ── 4. Download the WAV ───────────────────────────────────────────────── setGenStatus('downloading'); - setGenHint('Downloading audio...'); + setGenHint(t('kgone.shared.hint.downloadingAudio')); kgoneLog('REQ', `GET /v1/clip/audio/${task_id}`, null); const audioResp = await fetchWithRetry(`${baseUrl}/v1/clip/audio/${task_id}`, { signal }); @@ -380,121 +374,119 @@ const ClipTab: React.FC = ({ bpm, keySignature }) => { }, [ prompt, negativePrompt, bars, clipBpm, note, scale, steps, cfgScale, seed, samplerType, sigmaMin, sigmaMax, cfgRescale, - audioUrl, + audioUrl, t, ]); const btnLabel = () => { switch (genStatus) { - case 'loading-model': return 'Loading model...'; - case 'generating': return 'Generating...'; - case 'polling': return 'Processing...'; - case 'downloading': return 'Downloading...'; - default: return 'Generate Clip'; + case 'loading-model': return t('kgone.shared.btn.loadingModel'); + case 'generating': return t('kgone.shared.btn.generating'); + case 'polling': return t('kgone.shared.btn.processing'); + case 'downloading': return t('kgone.shared.btn.downloading'); + default: return t('kgone.clip.btn.generate'); } }; return ( <>
- +