Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,33 @@
{
"extends": [
"../../../../.eslintrc.base.json"
],
"ignorePatterns": [
"!**/*"
],
"overrides": [
{
"files": [
"*.ts",
"*.tsx",
"*.js",
"*.jsx"
],
"rules": {}
},
{
"files": [
"*.ts",
"*.tsx"
],
"rules": {}
},
{
"files": [
"*.js",
"*.jsx"
],
"rules": {}
}
]
}

View File

@@ -0,0 +1,7 @@
# pieces-murf-api
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build pieces-murf-api` to build the library.

View File

@@ -0,0 +1,10 @@
{
"name": "@activepieces/piece-murf-api",
"version": "0.0.3",
"type": "commonjs",
"main": "./src/index.js",
"types": "./src/index.d.ts",
"dependencies": {
"tslib": "^2.3.0"
}
}

View File

@@ -0,0 +1,65 @@
{
"name": "pieces-murf-api",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/murf-api/src",
"projectType": "library",
"release": {
"version": {
"manifestRootsToUpdate": [
"dist/{projectRoot}"
],
"currentVersionResolver": "git-tag",
"fallbackCurrentVersionResolver": "disk"
}
},
"tags": [],
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/murf-api",
"tsConfig": "packages/pieces/community/murf-api/tsconfig.lib.json",
"packageJson": "packages/pieces/community/murf-api/package.json",
"main": "packages/pieces/community/murf-api/src/index.ts",
"assets": [
"packages/pieces/community/murf-api/*.md",
{
"input": "packages/pieces/community/murf-api/src/i18n",
"output": "./src/i18n",
"glob": "**/!(i18n.json)"
}
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"nx-release-publish": {
"options": {
"packageRoot": "dist/{projectRoot}"
}
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/murf-api",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
}
}

View File

@@ -0,0 +1,85 @@
{
"Enter your API key from https://murf.ai": "API-Schlüssel von https://murf.ai eingeben",
"List Voices": "Stimmen auflisten",
"Translate Text": "Text übersetzen",
"Voice Changer": "Sprachwechsler",
"Text to Speech": "Text-zu-Sprache",
"Custom API Call": "Eigener API-Aufruf",
"Get the list of available voices for text-to-speech": "Holen Sie sich die Liste der zur Verfügung stehenden Stimmen für Text-zu-Sprache",
"Translate one or more texts to the target language.": "Übersetze einen oder mehrere Texte in die Zielsprache.",
"Convert an input audio file to a different voice using Murf Voice Changer.": "Konvertieren Sie eine Audiodatei mit Murf Voice Changer in eine andere Stimme.",
"Converts input text into speech using Murf AI.": "Konvertiert Eingabetext in Sprache mit Murf AI.",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Language": "Sprache",
"Style": "Stil",
"Texts": "Texte",
"Voice": "Stimme",
"File URL": "Datei-URL",
"Upload File": "Datei hochladen",
"Output Format": "Ausgabeformat",
"Channel Type": "Kanaltyp",
"Pitch": "Neigung",
"Rate": "Rate",
"Encode Output as Base64": "Ausgabe als Base64 kodieren",
"Text": "Text",
"Audio Duration (seconds)": "Audio-Dauer (Sekunden)",
"Encode as Base64": "Als Base64 kodieren",
"Audio Format": "Audioformat",
"Model Version": "Modellversion",
"Multi Native Locale": "Multi Heimatsprache",
"Sample Rate": "Beispielrate",
"Variation": "Variation",
"Word Durations as Original Text": "Wortdauer als Originaltext",
"Pronunciation Dictionary": "Pronunciation Wörterbuch",
"Method": "Methode",
"Headers": "Kopfzeilen",
"Query Parameters": "Abfrageparameter",
"Body": "Körper",
"Response is Binary ?": "Antwort ist binär?",
"No Error on Failure": "Kein Fehler bei Fehler",
"Timeout (in seconds)": "Timeout (in Sekunden)",
"Select your preferred language for the translated output.": "Wählen Sie Ihre bevorzugte Sprache für die Übersetzung aus.",
"Filter by style (optional)": "Nach Stil filtern (optional)",
"List of texts to translate": "Liste der zu übersetzenden Texte",
"Choose a voice for converting text into speech": "Wählen Sie eine Stimme für die Umwandlung von Text in Sprache",
"Publicly accessible URL of the input audio file. Either provide this or upload a file.": "Öffentlich zugängliche URL der Audio-Eingabedatei. Geben Sie diese entweder ein oder laden Sie eine Datei hoch.",
"Upload an audio file for voice conversion": "Audiodatei für Sprachkonvertierung hochladen",
"Format of the generated audio file": "Format der generierten Audiodatei",
"Choose MONO or STEREO output": "MONO- oder STEREO-Ausgabe auswählen",
"Pitch adjustment (-50 to 50)": "Pitch-Anpassung (-50 bis 50)",
"Speed adjustment (-50 to 50)": "Geschwindigkeitsanpassung (-50 bis 50)",
"Receive audio directly as Base64 instead of a file URL": "Audio direkt als Base64 anstelle einer Datei-URL empfangen",
"The text to be synthesized.": "Der zu synthetisierende Text.",
"Specify audio length. If 0, Murf ignores this. Only for Gen2 model.": "Audio-Länge angeben. Wenn 0, ignoriert Murf dies. Nur für Gen2-Modell.",
"Mono or Stereo output.": "Mono oder Stereo Ausgang.",
"Return Base64 encoded audio instead of URL (zero retention).": "Gibt Base64 kodiertes Audio anstelle von URL zurück (0 Vorrat).",
"Select audio format.": "Audioformat auswählen.",
"Choose Gen1 or Gen2.": "Wählen Sie Gen1 oder Gen2.",
"Set multi-language voice (e.g., en-US, es-ES). Only for Gen2.": "Setzen Sie mehrsprachige Stimme (z. B. en-US, es-ES).",
"Pitch adjustment (-50 to 50).": "Pitch-Anpassung (-50 bis 50).",
"Speed adjustment (-50 to 50).": "Geschwindigkeitsanpassung (-50 bis 50).",
"Voice style (e.g., 'default', 'calm', 'energetic'). Check voice details.": "Sprachstil (z. B. 'default', 'calm', 'energetisch'). Überprüfen Sie die Sprachdetails.",
"Defaults to 44100. Allowed: 8000, 24000, 44100, 48000.": "Standardwerte sind 44100: 8000, 24000, 44100, 48000.",
"Variation level (05). Defaults to 1. Higher = more natural pauses/pitch/speed.": "Variationsstufe (05). Standard ist 1. Höher = natürlicher Pausen/Pitch/Geschwindigkeit.",
"If true, response word timings map to original text. (English only).": "Wenn aktiviert, werden Wort-Timings auf Originaltext angezeigt. (Nur in Englisch).",
"Custom word pronunciations.": "Eigene Wortaussprachen.",
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
"MP3": "MP3",
"WAV": "WAV",
"FLAC": "FLAC",
"OGG": "OGG",
"Mono": "Mono",
"Stereo": "Stereo",
"ALAW": "ALAW",
"ULAW": "ULAG",
"PCM": "PCM",
"GEN1": "GEN1",
"GEN2": "GEN2",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD"
}

View File

@@ -0,0 +1,85 @@
{
"Enter your API key from https://murf.ai": "Introduzca su clave API desde https://murf.ai",
"List Voices": "Lista de Votos",
"Translate Text": "Traducir texto",
"Voice Changer": "Cambiador de voz",
"Text to Speech": "Texto a voz",
"Custom API Call": "Llamada API personalizada",
"Get the list of available voices for text-to-speech": "Obtener la lista de voces disponibles para el texto a voz",
"Translate one or more texts to the target language.": "Traducir uno o más textos al idioma de destino.",
"Convert an input audio file to a different voice using Murf Voice Changer.": "Convierte un archivo de audio de entrada a una voz diferente usando Murf Voice Changer.",
"Converts input text into speech using Murf AI.": "Convierte texto de entrada en voz usando Murf AI.",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Language": "Idioma",
"Style": "Estilo",
"Texts": "Textos",
"Voice": "Voz",
"File URL": "URL del archivo",
"Upload File": "Subir archivo",
"Output Format": "Formato de salida",
"Channel Type": "Tipo de canal",
"Pitch": "Tono",
"Rate": "Tasa",
"Encode Output as Base64": "Codificar salida como Base64",
"Text": "Texto",
"Audio Duration (seconds)": "Duración de audio (segundos)",
"Encode as Base64": "Codificar como Base64",
"Audio Format": "Formato de audio",
"Model Version": "Versión del modelo",
"Multi Native Locale": "Local multicnativo",
"Sample Rate": "Tasa de ejemplo",
"Variation": "Variación",
"Word Durations as Original Text": "Duraciones de la palabra como texto original",
"Pronunciation Dictionary": "Diccionario de Pronunciación",
"Method": "Método",
"Headers": "Encabezados",
"Query Parameters": "Parámetros de consulta",
"Body": "Cuerpo",
"Response is Binary ?": "¿Respuesta es binaria?",
"No Error on Failure": "No hay ningún error en fallo",
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
"Select your preferred language for the translated output.": "Seleccione su idioma preferido para la salida traducida.",
"Filter by style (optional)": "Filtrar por estilo (opcional)",
"List of texts to translate": "Lista de textos a traducir",
"Choose a voice for converting text into speech": "Elige una voz para convertir texto en voz",
"Publicly accessible URL of the input audio file. Either provide this or upload a file.": "URL públicamente accesible del archivo de audio de entrada. Proporciona esto o sube un archivo.",
"Upload an audio file for voice conversion": "Subir un archivo de audio para conversión de voz",
"Format of the generated audio file": "Formato del archivo de audio generado",
"Choose MONO or STEREO output": "Elegir salida MONO o STEREO",
"Pitch adjustment (-50 to 50)": "Ajuste del tono (-50 a 50)",
"Speed adjustment (-50 to 50)": "Ajuste de velocidad (-50 a 50)",
"Receive audio directly as Base64 instead of a file URL": "Recibir audio directamente como Base64 en lugar de una URL de archivo",
"The text to be synthesized.": "El texto a sintetizar.",
"Specify audio length. If 0, Murf ignores this. Only for Gen2 model.": "Especifique la longitud de audio. Si es 0, Murf ignora esto. Sólo para el modelo Gen2.",
"Mono or Stereo output.": "Salida Mono o Stereo.",
"Return Base64 encoded audio instead of URL (zero retention).": "Devolver audio Base64 codificado en lugar de URL (retención cero).",
"Select audio format.": "Seleccionar formato de audio.",
"Choose Gen1 or Gen2.": "Elija Gen1 o Gen2.",
"Set multi-language voice (e.g., en-US, es-ES). Only for Gen2.": "Establecer voz múltiple (por ejemplo, en-US, es-ES). Sólo para Gen2.",
"Pitch adjustment (-50 to 50).": "Ajuste de tono (-50 a 50).",
"Speed adjustment (-50 to 50).": "Ajuste de velocidad (-50 a 50).",
"Voice style (e.g., 'default', 'calm', 'energetic'). Check voice details.": "Estilo de voz (por ejemplo, 'predeterminado', 'calm', 'energético'). Comprueba los detalles de voz.",
"Defaults to 44100. Allowed: 8000, 24000, 44100, 48000.": "Por defecto es 44100. Permitido: 8000, 24000, 44100, 48000.",
"Variation level (05). Defaults to 1. Higher = more natural pauses/pitch/speed.": "Nivel de variación (05). Por defecto es 1. Mayor = pausas más naturales/pitch/velocidad.",
"If true, response word timings map to original text. (English only).": "If true, response word timings map to original text. (Solo en inglés).",
"Custom word pronunciations.": "Promociones de palabras personalizadas.",
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
"MP3": "MP3",
"WAV": "WAV",
"FLAC": "FLAC",
"OGG": "OGG",
"Mono": "Mono",
"Stereo": "Stereo",
"ALAW": "ALAW",
"ULAW": "ULAR",
"PCM": "PCM",
"GEN1": "GEN1",
"GEN2": "GEN2",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO"
}

View File

@@ -0,0 +1,85 @@
{
"Enter your API key from https://murf.ai": "Entrez votre clé API depuis https://murf.ai",
"List Voices": "Lister les voix",
"Translate Text": "Traduire le texte",
"Voice Changer": "Changeur de voix",
"Text to Speech": "Discours vocaux",
"Custom API Call": "Appel d'API personnalisé",
"Get the list of available voices for text-to-speech": "Obtenir la liste des voix disponibles pour la synthèse vocale",
"Translate one or more texts to the target language.": "Traduire un ou plusieurs textes dans la langue cible.",
"Convert an input audio file to a different voice using Murf Voice Changer.": "Convertissez un fichier audio d'entrée en une autre voix à l'aide de Murf Voice Changer.",
"Converts input text into speech using Murf AI.": "Convertit le texte d'entrée en parole en utilisant Murf AI.",
"Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
"Language": "Langue",
"Style": "Style",
"Texts": "Textes",
"Voice": "Voix",
"File URL": "URL du fichier",
"Upload File": "Charger un fichier",
"Output Format": "Format de sortie",
"Channel Type": "Type de canal",
"Pitch": "Tailler",
"Rate": "Évaluer",
"Encode Output as Base64": "Encoder la sortie en Base64",
"Text": "Texte du texte",
"Audio Duration (seconds)": "Durée audio (secondes)",
"Encode as Base64": "Encoder en Base64",
"Audio Format": "Format audio",
"Model Version": "Version du modèle",
"Multi Native Locale": "Locale multi-native",
"Sample Rate": "Taux d'échantillonnage",
"Variation": "Variation",
"Word Durations as Original Text": "Durée du mot comme texte original",
"Pronunciation Dictionary": "Dictionnaire de prononciation",
"Method": "Méthode",
"Headers": "Headers",
"Query Parameters": "Paramètres de requête",
"Body": "Body",
"Response is Binary ?": "La réponse est Binaire ?",
"No Error on Failure": "Aucune erreur en cas d'échec",
"Timeout (in seconds)": "Délai d'expiration (en secondes)",
"Select your preferred language for the translated output.": "Sélectionnez votre langue préférée pour la sortie traduite.",
"Filter by style (optional)": "Filtrer par style (optionnel)",
"List of texts to translate": "Liste des textes à traduire",
"Choose a voice for converting text into speech": "Choisissez une voix pour convertir le texte en voix",
"Publicly accessible URL of the input audio file. Either provide this or upload a file.": "URL publiquement accessible du fichier audio d'entrée. Fournissez ceci ou téléchargez un fichier.",
"Upload an audio file for voice conversion": "Télécharger un fichier audio pour la conversion vocale",
"Format of the generated audio file": "Format du fichier audio généré",
"Choose MONO or STEREO output": "Choisir une sortie MONO ou STEREO",
"Pitch adjustment (-50 to 50)": "Ajustement du pas (-50 à 50)",
"Speed adjustment (-50 to 50)": "Réglage de la vitesse (-50 à 50)",
"Receive audio directly as Base64 instead of a file URL": "Recevoir l'audio directement en Base64 au lieu d'une URL de fichier",
"The text to be synthesized.": "Le texte à synthétiser.",
"Specify audio length. If 0, Murf ignores this. Only for Gen2 model.": "Spécifiez la longueur audio. Si 0, Murf ignore cela. Seulement pour le modèle Gen2.",
"Mono or Stereo output.": "Sortie Mono ou Stéréo.",
"Return Base64 encoded audio instead of URL (zero retention).": "Renvoyer l'audio encodé en Base64 au lieu de l'URL (valeur zéro).",
"Select audio format.": "Sélectionnez le format audio.",
"Choose Gen1 or Gen2.": "Choisissez Gen1 ou Gen2.",
"Set multi-language voice (e.g., en-US, es-ES). Only for Gen2.": "Définir la voix multilingue (par exemple, en-US, es-ES). Uniquement pour Gen2.",
"Pitch adjustment (-50 to 50).": "Réglage de la hauteur (-50 à 50).",
"Speed adjustment (-50 to 50).": "Réglage de la vitesse (-50 à 50).",
"Voice style (e.g., 'default', 'calm', 'energetic'). Check voice details.": "Style vocal (par exemple, 'default', 'calm', 'energetic'). Vérifiez les détails de la voix.",
"Defaults to 44100. Allowed: 8000, 24000, 44100, 48000.": "Par défaut 44100. Autorisé : 8000, 24000, 44100, 48000.",
"Variation level (05). Defaults to 1. Higher = more natural pauses/pitch/speed.": "Niveau de variation (0-5). Valeur par défaut à 1. Plus élevé = plus de pauses naturelles/pitch/vitesse.",
"If true, response word timings map to original text. (English only).": "Si vrai, les timings des mots de réponse correspondent au texte original. (anglais seulement).",
"Custom word pronunciations.": "pronunciations de mots personnalisés.",
"Authorization headers are injected automatically from your connection.": "Les Headers d'autorisation sont injectés automatiquement à partir de votre connexion.",
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
"MP3": "Mp3",
"WAV": "WAV",
"FLAC": "FLAC",
"OGG": "OG",
"Mono": "Mono",
"Stereo": "Stereo",
"ALAW": "ALAW",
"ULAW": "ULAI",
"PCM": "PCM",
"GEN1": "GEN1",
"GEN2": "GEN2",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD"
}

View File

@@ -0,0 +1,85 @@
{
"Enter your API key from https://murf.ai": "https://murf.aiからAPIキーを入力してください",
"List Voices": "ボイス一覧",
"Translate Text": "テキストを翻訳",
"Voice Changer": "ボイスチェンジャー",
"Text to Speech": "テキスト読み上げ",
"Custom API Call": "カスタムAPI通話",
"Get the list of available voices for text-to-speech": "テキスト読み上げで利用可能なボイスの一覧を取得します",
"Translate one or more texts to the target language.": "1つ以上のテキストをターゲット言語に翻訳します。",
"Convert an input audio file to a different voice using Murf Voice Changer.": "Murf Voice Changer を使用して、入力オーディオファイルを別の音声に変換します。",
"Converts input text into speech using Murf AI.": "Murf AI を使用して入力テキストを音声に変換します。",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Language": "言語",
"Style": "スタイル",
"Texts": "テキスト",
"Voice": "音声",
"File URL": "ファイル URL",
"Upload File": "ファイルをアップロード",
"Output Format": "出力形式",
"Channel Type": "チャンネルタイプ",
"Pitch": "Pitch",
"Rate": "利率",
"Encode Output as Base64": "出力を Base64 としてエンコード",
"Text": "テキスト",
"Audio Duration (seconds)": "音声の持続時間(秒)",
"Encode as Base64": "Base64 としてエンコード",
"Audio Format": "オーディオ形式",
"Model Version": "モデルのバージョン",
"Multi Native Locale": "マルチネイティブロケール:",
"Sample Rate": "サンプルレート",
"Variation": "バリエーション",
"Word Durations as Original Text": "原文としての単語期間",
"Pronunciation Dictionary": "発音辞書",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"Select your preferred language for the translated output.": "翻訳された出力に使用する言語を選択します。",
"Filter by style (optional)": "スタイルでフィルター (オプション)",
"List of texts to translate": "翻訳するテキストのリスト",
"Choose a voice for converting text into speech": "テキストを音声に変換する音声を選択",
"Publicly accessible URL of the input audio file. Either provide this or upload a file.": "入力オーディオファイルのアクセス可能なURL。これを指定するか、ファイルをアップロードしてください。",
"Upload an audio file for voice conversion": "音声変換用の音声ファイルをアップロード",
"Format of the generated audio file": "生成されたオーディオファイルの形式",
"Choose MONO or STEREO output": "MONOまたはSTEREO出力を選択してください",
"Pitch adjustment (-50 to 50)": "ピッチ調整 (-50〜50)",
"Speed adjustment (-50 to 50)": "速度調整(-5050",
"Receive audio directly as Base64 instead of a file URL": "ファイルの URL の代わりに Base64 として音声を直接受信する",
"The text to be synthesized.": "合成されるテキスト。",
"Specify audio length. If 0, Murf ignores this. Only for Gen2 model.": "オーディオの長さを指定します。0の場合、Murfはこれを無視します。Gen2モデルのみ。",
"Mono or Stereo output.": "モノラルまたはステレオ出力。",
"Return Base64 encoded audio instead of URL (zero retention).": "URL の代わりに Base64 エンコードされたオーディオを返します (保持はゼロ)。",
"Select audio format.": "音声形式を選択します。",
"Choose Gen1 or Gen2.": "Gen1またはGen2を選択します。",
"Set multi-language voice (e.g., en-US, es-ES). Only for Gen2.": "多言語音声en-US、es-ESを設定します。Gen2のみ。",
"Pitch adjustment (-50 to 50).": "ピッチ調整(-50〜50)。",
"Speed adjustment (-50 to 50).": "速度調整(-5050",
"Voice style (e.g., 'default', 'calm', 'energetic'). Check voice details.": "音声スタイル (例: 'default', 'calm', 'energic'). 音声の詳細を確認してください.",
"Defaults to 44100. Allowed: 8000, 24000, 44100, 48000.": "デフォルトは44100です。 許可されている: 8000, 24000, 44100, 48000.",
"Variation level (05). Defaults to 1. Higher = more natural pauses/pitch/speed.": "バリエーションレベル05。デフォルトは1です。高い = より自然な一時停止/ピッチ/スピード。",
"If true, response word timings map to original text. (English only).": "true の場合、応答ワードのタイミングは元のテキストにマップされます。",
"Custom word pronunciations.": "カスタムの単語の発音。",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"MP3": "MP3",
"WAV": "WAV",
"FLAC": "Flac(フラッシュ)",
"OGG": "OGG",
"Mono": "モノラル",
"Stereo": "Stereo",
"ALAW": "ALAW",
"ULAW": "ULAW",
"PCM": "PCM",
"GEN1": "GEN1",
"GEN2": "GEN2",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭"
}

View File

@@ -0,0 +1,85 @@
{
"Enter your API key from https://murf.ai": "Voer je API-sleutel in van https://murf.ai",
"List Voices": "Lijst stemlijsten",
"Translate Text": "Tekst vertalen",
"Voice Changer": "Spraakwijziging veranderen",
"Text to Speech": "Tekst naar spraak",
"Custom API Call": "Custom API Call",
"Get the list of available voices for text-to-speech": "Haal de lijst op met beschikbare stemmen voor tekst-naar-spraak",
"Translate one or more texts to the target language.": "Vertaal een of meer teksten naar de doeltaal.",
"Convert an input audio file to a different voice using Murf Voice Changer.": "Converteer een invoer audiobestand naar een andere stem met behulp van Murf Voice Changer.",
"Converts input text into speech using Murf AI.": "Zet input tekst om naar spraak met Murf AI.",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Language": "Taal",
"Style": "CSS",
"Texts": "Teksten",
"Voice": "Stem",
"File URL": "Bestand URL",
"Upload File": "Bestand uploaden",
"Output Format": "Uitvoer formaat",
"Channel Type": "Type kanaal",
"Pitch": "Toonhoogte",
"Rate": "Beoordelen",
"Encode Output as Base64": "Coderen uitvoer als Base64",
"Text": "Tekstveld",
"Audio Duration (seconds)": "Audioduur (seconden)",
"Encode as Base64": "Coderen als Base64",
"Audio Format": "Audio-formaat",
"Model Version": "Model versie",
"Multi Native Locale": "Multi oorspronkelijke lokalisatie",
"Sample Rate": "Sample snelheid",
"Variation": "Variatie",
"Word Durations as Original Text": "Duur woorden als oorspronkelijke tekst",
"Pronunciation Dictionary": "Uitspraak Woordenboek",
"Method": "Methode",
"Headers": "Kopteksten",
"Query Parameters": "Query parameters",
"Body": "Lichaam",
"Response is Binary ?": "Antwoord is binair?",
"No Error on Failure": "Geen fout bij fout",
"Timeout (in seconds)": "Time-out (in seconden)",
"Select your preferred language for the translated output.": "Selecteer uw voorkeurstaal voor de vertaalde uitvoer.",
"Filter by style (optional)": "Filter op stijl (optioneel)",
"List of texts to translate": "Lijst van te vertalen teksten",
"Choose a voice for converting text into speech": "Kies een stem voor het omzetten van tekst in spraak",
"Publicly accessible URL of the input audio file. Either provide this or upload a file.": "Openbaar toegankelijke URL van het audiobestand van invoer. Of geef dit op of upload een bestand.",
"Upload an audio file for voice conversion": "Een audiobestand voor spraakconversie uploaden",
"Format of the generated audio file": "Formaat van het gegenereerde audiobestand",
"Choose MONO or STEREO output": "Kies MONO of STEREO uitvoer",
"Pitch adjustment (-50 to 50)": "Hoogteaanpassing (-50 tot 50)",
"Speed adjustment (-50 to 50)": "Snelheidsaanpassing (-50 tot 50)",
"Receive audio directly as Base64 instead of a file URL": "Ontvang direct audio als Base64 in plaats van een bestand-URL",
"The text to be synthesized.": "De tekst die gesynthetiseerd moet worden.",
"Specify audio length. If 0, Murf ignores this. Only for Gen2 model.": "Geef de audiolengte op. Als 0, Murf dit negeert. Alleen voor Gen2 model.",
"Mono or Stereo output.": "Mono of Stereo uitvoer.",
"Return Base64 encoded audio instead of URL (zero retention).": "Retourneer Base64 gecodeerde audio in plaats van URL (nul-tentie).",
"Select audio format.": "Audio-opmaak selecteren.",
"Choose Gen1 or Gen2.": "Kies Gen1 of Gen2.",
"Set multi-language voice (e.g., en-US, es-ES). Only for Gen2.": "Meerdere talen spraak instellen (bijv. en-US, es-ES). Alleen voor Gen2.",
"Pitch adjustment (-50 to 50).": "Hoogteaanpassing (-50 tot 50).",
"Speed adjustment (-50 to 50).": "Snelheidsaanpassing (-50 tot 50).",
"Voice style (e.g., 'default', 'calm', 'energetic'). Check voice details.": "Spraakstijl (bijv. 'standaard', 'kalm', 'energetische'). Controleer spraak.",
"Defaults to 44100. Allowed: 8000, 24000, 44100, 48000.": "Standaard ingesteld op 44100. Toegestaan: 8000, 24000, 44100, 48000.",
"Variation level (05). Defaults to 1. Higher = more natural pauses/pitch/speed.": "Variatieniveau (0-5). Standaard ingesteld op 1. Hoger = meer natuurlijke pauze/pitch/snelheid.",
"If true, response word timings map to original text. (English only).": "Indien waar, antwoord woorden op de oorspronkelijke tekst. (alleen in het Engels).",
"Custom word pronunciations.": "Aangepaste woordwoordeningen.",
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
"MP3": "MP3",
"WAV": "WV",
"FLAC": "FLAC",
"OGG": "GROTE",
"Mono": "Monochroom",
"Stereo": "Stereo",
"ALAW": "ALAW",
"ULAW": "ULADEN",
"PCM": "PCM",
"GEN1": "GEN1",
"GEN2": "GEN2",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD"
}

View File

@@ -0,0 +1,85 @@
{
"Enter your API key from https://murf.ai": "Digite sua chave de API de https://murf.ai",
"List Voices": "Lista de Vozes",
"Translate Text": "Traduzir texto",
"Voice Changer": "Alterador de Voz",
"Text to Speech": "Texto para fala",
"Custom API Call": "Chamada de API personalizada",
"Get the list of available voices for text-to-speech": "Obter a lista de vozes disponíveis para conversão de texto em fala",
"Translate one or more texts to the target language.": "Traduza um ou mais textos para o idioma de destino.",
"Convert an input audio file to a different voice using Murf Voice Changer.": "Converta um arquivo de áudio para uma voz diferente usando Murf Voice Changer.",
"Converts input text into speech using Murf AI.": "Converte texto em fala usando Murf AI.",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Language": "IDIOMA",
"Style": "Estilo",
"Texts": "Textos",
"Voice": "Voz",
"File URL": "URL do Arquivo",
"Upload File": "Enviar Arquivo",
"Output Format": "Formato de saída",
"Channel Type": "Tipo de canal",
"Pitch": "Tom",
"Rate": "Avaliar",
"Encode Output as Base64": "Codificar a Saída como Base64",
"Text": "texto",
"Audio Duration (seconds)": "Duração do Áudio (segundos)",
"Encode as Base64": "Codificar como Base64",
"Audio Format": "Formato de Áudio",
"Model Version": "Versão do Modelo",
"Multi Native Locale": "Múltiplos Nativos Locais",
"Sample Rate": "Taxa de amostragem",
"Variation": "Variação",
"Word Durations as Original Text": "Durações de Palavra como Texto Original",
"Pronunciation Dictionary": "Dicionário de Pronúncia",
"Method": "Método",
"Headers": "Cabeçalhos",
"Query Parameters": "Parâmetros da consulta",
"Body": "Conteúdo",
"Response is Binary ?": "A resposta é binária ?",
"No Error on Failure": "Nenhum erro no Failure",
"Timeout (in seconds)": "Tempo limite (em segundos)",
"Select your preferred language for the translated output.": "Selecione seu idioma preferido para a saída traduzida.",
"Filter by style (optional)": "Filtrar por estilo (opcional)",
"List of texts to translate": "Lista de textos a traduzir",
"Choose a voice for converting text into speech": "Escolha uma voz para converter texto em fala",
"Publicly accessible URL of the input audio file. Either provide this or upload a file.": "URL publicamente acessível do arquivo de entrada. Forneça isto ou faça upload de um arquivo.",
"Upload an audio file for voice conversion": "Carregar arquivo de áudio para conversão de voz",
"Format of the generated audio file": "Formato do arquivo de áudio gerado",
"Choose MONO or STEREO output": "Escolher saída MONO ou STEREO",
"Pitch adjustment (-50 to 50)": "Ajuste de tom (-50 a 50)",
"Speed adjustment (-50 to 50)": "Ajuste de velocidade (-50 para 50)",
"Receive audio directly as Base64 instead of a file URL": "Receber áudio diretamente como Base64 em vez de uma URL de arquivo",
"The text to be synthesized.": "O texto a ser sintetizado.",
"Specify audio length. If 0, Murf ignores this. Only for Gen2 model.": "Especificar comprimento de áudio. Se 0, Murf ignora isso. Apenas para o modelo Gen2.",
"Mono or Stereo output.": "Saída de mono ou estéreo.",
"Return Base64 encoded audio instead of URL (zero retention).": "Retornar áudio codificado em Base64 em vez de URL (retenção zero).",
"Select audio format.": "Selecionar formato de áudio.",
"Choose Gen1 or Gen2.": "Escolher Gênero ou Gen2.",
"Set multi-language voice (e.g., en-US, es-ES). Only for Gen2.": "Definir voz multiidioma (por exemplo, en-US, es-ES). Apenas para o Gen2.",
"Pitch adjustment (-50 to 50).": "Ajuste de Tom (-50 a 50).",
"Speed adjustment (-50 to 50).": "Ajuste de velocidade (-50 para 50).",
"Voice style (e.g., 'default', 'calm', 'energetic'). Check voice details.": "Estilo de voz (ex.: 'default', 'calm', 'energetica'). Verifique os detalhes da voz.",
"Defaults to 44100. Allowed: 8000, 24000, 44100, 48000.": "O valor padrão é 44100. Permitido: 8000, 24000, 44100, 48000.",
"Variation level (05). Defaults to 1. Higher = more natural pauses/pitch/speed.": "Nível de variação (05). O padrão é 1. Superior = mais naturais pausas/tom/velocidade.",
"If true, response word timings map to original text. (English only).": "Se verdadeiro, as palavras de resposta são mapeadas para o texto original. (apenas em inglês).",
"Custom word pronunciations.": "pronúncias de palavra personalizada.",
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
"MP3": "MP3",
"WAV": "WAV",
"FLAC": "BANDEIRA",
"OGG": "OGG",
"Mono": "Monocromático",
"Stereo": "Stereo",
"ALAW": "ALAW",
"ULAW": "BANDEIRA",
"PCM": "PCM",
"GEN1": "GEN1",
"GEN2": "GEN2",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA"
}

View File

@@ -0,0 +1,85 @@
{
"Enter your API key from https://murf.ai": "Enter your API key from https://murf.ai",
"List Voices": "List Voices",
"Translate Text": "Translate Text",
"Voice Changer": "Voice Changer",
"Text to Speech": "Text to Speech",
"Custom API Call": "Custom API Call",
"Get the list of available voices for text-to-speech": "Get the list of available voices for text-to-speech",
"Translate one or more texts to the target language.": "Translate one or more texts to the target language.",
"Convert an input audio file to a different voice using Murf Voice Changer.": "Convert an input audio file to a different voice using Murf Voice Changer.",
"Converts input text into speech using Murf AI.": "Converts input text into speech using Murf AI.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Language": "Language",
"Style": "Style",
"Texts": "Texts",
"Voice": "Voice",
"File URL": "File URL",
"Upload File": "Upload File",
"Output Format": "Output Format",
"Channel Type": "Channel Type",
"Pitch": "Pitch",
"Rate": "Rate",
"Encode Output as Base64": "Encode Output as Base64",
"Text": "Text",
"Audio Duration (seconds)": "Audio Duration (seconds)",
"Encode as Base64": "Encode as Base64",
"Audio Format": "Audio Format",
"Model Version": "Model Version",
"Multi Native Locale": "Multi Native Locale",
"Sample Rate": "Sample Rate",
"Variation": "Variation",
"Word Durations as Original Text": "Word Durations as Original Text",
"Pronunciation Dictionary": "Pronunciation Dictionary",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"Select your preferred language for the translated output.": "Select your preferred language for the translated output.",
"Filter by style (optional)": "Filter by style (optional)",
"List of texts to translate": "List of texts to translate",
"Choose a voice for converting text into speech": "Choose a voice for converting text into speech",
"Publicly accessible URL of the input audio file. Either provide this or upload a file.": "Publicly accessible URL of the input audio file. Either provide this or upload a file.",
"Upload an audio file for voice conversion": "Upload an audio file for voice conversion",
"Format of the generated audio file": "Format of the generated audio file",
"Choose MONO or STEREO output": "Choose MONO or STEREO output",
"Pitch adjustment (-50 to 50)": "Pitch adjustment (-50 to 50)",
"Speed adjustment (-50 to 50)": "Speed adjustment (-50 to 50)",
"Receive audio directly as Base64 instead of a file URL": "Receive audio directly as Base64 instead of a file URL",
"The text to be synthesized.": "The text to be synthesized.",
"Specify audio length. If 0, Murf ignores this. Only for Gen2 model.": "Specify audio length. If 0, Murf ignores this. Only for Gen2 model.",
"Mono or Stereo output.": "Mono or Stereo output.",
"Return Base64 encoded audio instead of URL (zero retention).": "Return Base64 encoded audio instead of URL (zero retention).",
"Select audio format.": "Select audio format.",
"Choose Gen1 or Gen2.": "Choose Gen1 or Gen2.",
"Set multi-language voice (e.g., en-US, es-ES). Only for Gen2.": "Set multi-language voice (e.g., en-US, es-ES). Only for Gen2.",
"Pitch adjustment (-50 to 50).": "Pitch adjustment (-50 to 50).",
"Speed adjustment (-50 to 50).": "Speed adjustment (-50 to 50).",
"Voice style (e.g., 'default', 'calm', 'energetic'). Check voice details.": "Voice style (e.g., 'default', 'calm', 'energetic'). Check voice details.",
"Defaults to 44100. Allowed: 8000, 24000, 44100, 48000.": "Defaults to 44100. Allowed: 8000, 24000, 44100, 48000.",
"Variation level (05). Defaults to 1. Higher = more natural pauses/pitch/speed.": "Variation level (05). Defaults to 1. Higher = more natural pauses/pitch/speed.",
"If true, response word timings map to original text. (English only).": "If true, response word timings map to original text. (English only).",
"Custom word pronunciations.": "Custom word pronunciations.",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"MP3": "MP3",
"WAV": "WAV",
"FLAC": "FLAC",
"OGG": "OGG",
"Mono": "Mono",
"Stereo": "Stereo",
"ALAW": "ALAW",
"ULAW": "ULAW",
"PCM": "PCM",
"GEN1": "GEN1",
"GEN2": "GEN2",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD"
}

View File

@@ -0,0 +1,85 @@
{
"Enter your API key from https://murf.ai": "Enter your API key from https://murf.ai",
"List Voices": "List Voices",
"Translate Text": "Translate Text",
"Voice Changer": "Voice Changer",
"Text to Speech": "Text to Speech",
"Custom API Call": "自定义 API 呼叫",
"Get the list of available voices for text-to-speech": "Get the list of available voices for text-to-speech",
"Translate one or more texts to the target language.": "Translate one or more texts to the target language.",
"Convert an input audio file to a different voice using Murf Voice Changer.": "Convert an input audio file to a different voice using Murf Voice Changer.",
"Converts input text into speech using Murf AI.": "Converts input text into speech using Murf AI.",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Language": "Language",
"Style": "Style",
"Texts": "Texts",
"Voice": "Voice",
"File URL": "File URL",
"Upload File": "Upload File",
"Output Format": "Output Format",
"Channel Type": "Channel Type",
"Pitch": "Pitch",
"Rate": "Rate",
"Encode Output as Base64": "Encode Output as Base64",
"Text": "文本",
"Audio Duration (seconds)": "Audio Duration (seconds)",
"Encode as Base64": "Encode as Base64",
"Audio Format": "Audio Format",
"Model Version": "Model Version",
"Multi Native Locale": "Multi Native Locale",
"Sample Rate": "Sample Rate",
"Variation": "Variation",
"Word Durations as Original Text": "Word Durations as Original Text",
"Pronunciation Dictionary": "Pronunciation Dictionary",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"Select your preferred language for the translated output.": "Select your preferred language for the translated output.",
"Filter by style (optional)": "Filter by style (optional)",
"List of texts to translate": "List of texts to translate",
"Choose a voice for converting text into speech": "Choose a voice for converting text into speech",
"Publicly accessible URL of the input audio file. Either provide this or upload a file.": "Publicly accessible URL of the input audio file. Either provide this or upload a file.",
"Upload an audio file for voice conversion": "Upload an audio file for voice conversion",
"Format of the generated audio file": "Format of the generated audio file",
"Choose MONO or STEREO output": "Choose MONO or STEREO output",
"Pitch adjustment (-50 to 50)": "Pitch adjustment (-50 to 50)",
"Speed adjustment (-50 to 50)": "Speed adjustment (-50 to 50)",
"Receive audio directly as Base64 instead of a file URL": "Receive audio directly as Base64 instead of a file URL",
"The text to be synthesized.": "The text to be synthesized.",
"Specify audio length. If 0, Murf ignores this. Only for Gen2 model.": "Specify audio length. If 0, Murf ignores this. Only for Gen2 model.",
"Mono or Stereo output.": "Mono or Stereo output.",
"Return Base64 encoded audio instead of URL (zero retention).": "Return Base64 encoded audio instead of URL (zero retention).",
"Select audio format.": "Select audio format.",
"Choose Gen1 or Gen2.": "Choose Gen1 or Gen2.",
"Set multi-language voice (e.g., en-US, es-ES). Only for Gen2.": "Set multi-language voice (e.g., en-US, es-ES). Only for Gen2.",
"Pitch adjustment (-50 to 50).": "Pitch adjustment (-50 to 50).",
"Speed adjustment (-50 to 50).": "Speed adjustment (-50 to 50).",
"Voice style (e.g., 'default', 'calm', 'energetic'). Check voice details.": "Voice style (e.g., 'default', 'calm', 'energetic'). Check voice details.",
"Defaults to 44100. Allowed: 8000, 24000, 44100, 48000.": "Defaults to 44100. Allowed: 8000, 24000, 44100, 48000.",
"Variation level (05). Defaults to 1. Higher = more natural pauses/pitch/speed.": "Variation level (05). Defaults to 1. Higher = more natural pauses/pitch/speed.",
"If true, response word timings map to original text. (English only).": "If true, response word timings map to original text. (English only).",
"Custom word pronunciations.": "Custom word pronunciations.",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"MP3": "MP3",
"WAV": "WAV",
"FLAC": "FLAC",
"OGG": "OGG",
"Mono": "Mono",
"Stereo": "Stereo",
"ALAW": "ALAW",
"ULAW": "ULAW",
"PCM": "PCM",
"GEN1": "GEN1",
"GEN2": "GEN2",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色"
}

View File

@@ -0,0 +1,35 @@
import { createPiece } from '@activepieces/pieces-framework';
import { murfAuth } from './lib/common/auth';
import { listVoices } from './lib/actions/list-voices';
import { translateText } from './lib/actions/translate-text';
import { voiceChange } from './lib/actions/voice-change';
import { textToSpeech } from './lib/actions/text-to-speech';
import { PieceCategory } from '@activepieces/shared';
import { createCustomApiCallAction } from '@activepieces/pieces-common';
import { BASE_URL } from './lib/common/client';
export const murfApi = createPiece({
displayName: "Murf AI",
auth: murfAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/murf-api.png',
authors: ['Niket2035'],
categories: [PieceCategory.ARTIFICIAL_INTELLIGENCE],
actions: [
listVoices,
translateText,
voiceChange,
textToSpeech,
createCustomApiCallAction({
auth: murfAuth,
baseUrl: () => BASE_URL,
authMapping: async (auth) => {
return {
'api-key': auth.secret_text,
};
},
}),
],
triggers: [],
});

View File

@@ -0,0 +1,87 @@
import { createAction, Property } from "@activepieces/pieces-framework";
import { HttpMethod } from "@activepieces/pieces-common";
import { makeRequest } from "../common/client";
import { murfAuth } from "../common/auth";
import { murfCommon } from "../common/dropdown";
export const listVoices = createAction({
auth: murfAuth,
name: "list-voices",
displayName: "List Voices",
description: "Get the list of available voices for text-to-speech",
props: {
locale: murfCommon.language,
style: Property.Dropdown({
auth: murfAuth,
displayName: "Style",
description: "Filter by style (optional)",
required: false,
refreshers: ["locale"],
options: async ({ auth, locale }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: "Please connect your Murf account first",
};
}
const response = await makeRequest(auth.secret_text , HttpMethod.GET, "/speech/voices");
const voices = Array.isArray(response) ? response : [];
const filtered = locale
? voices.filter((v: any) => v.locale === locale || (Array.isArray(v.supportedLocales) && v.supportedLocales.includes(locale)))
: voices;
const allStyles = new Set<string>();
filtered.forEach((voice: any) => {
if (Array.isArray(voice.availableStyles)) {
voice.availableStyles.forEach((s: string) => allStyles.add(s));
}
});
return {
disabled: false,
options: [
{ label: "All Styles", value: "" },
...Array.from(allStyles).map((s) => ({
label: s.charAt(0).toUpperCase() + s.slice(1),
value: s,
})),
],
};
},
}),
},
async run(context) {
const { locale, style } = context.propsValue;
const response = await makeRequest(context.auth.secret_text, HttpMethod.GET, "/speech/voices");
const voices = Array.isArray(response) ? response : [];
let filtered = voices;
if (locale) {
filtered = filtered.filter(
(v: any) => v.locale === locale || (Array.isArray(v.supportedLocales) && v.supportedLocales.includes(locale))
);
}
if (style) {
filtered = filtered.filter((v: any) =>
v.availableStyles?.includes(style)
);
}
return {
voices: filtered.map((voice: any) => ({
voiceId: voice.voiceId,
displayName: voice.displayName,
gender: voice.gender,
locale: voice.locale,
supportedLocales: voice.supportedLocales,
availableStyles: voice.availableStyles,
})),
};
},
});

View File

@@ -0,0 +1,145 @@
import { createAction, Property } from "@activepieces/pieces-framework";
import { murfAuth } from "../common/auth";
import { makeRequest } from "../common/client";
import { HttpMethod } from "@activepieces/pieces-common";
import { murfCommon } from "../common/dropdown";
export const textToSpeech = createAction({
auth: murfAuth,
name: "text_to_speech",
displayName: "Text to Speech",
description: "Converts input text into speech using Murf AI.",
props: {
language: murfCommon.language,
voiceId: murfCommon.voiceId,
text: Property.LongText({
displayName: "Text",
description: "The text to be synthesized.",
required: true,
}),
audioDuration: Property.Number({
displayName: "Audio Duration (seconds)",
description:
"Specify audio length. If 0, Murf ignores this. Only for Gen2 model.",
required: false,
}),
channelType: Property.StaticDropdown({
displayName: "Channel Type",
description: "Mono or Stereo output.",
required: false,
options: {
options: [
{ label: "Mono", value: "MONO" },
{ label: "Stereo", value: "STEREO" },
],
},
}),
encodeAsBase64: Property.Checkbox({
displayName: "Encode as Base64",
description:
"Return Base64 encoded audio instead of URL (zero retention).",
required: false,
}),
format: Property.StaticDropdown({
displayName: "Audio Format",
description: "Select audio format.",
required: false,
options: {
options: [
{ label: "MP3", value: "MP3" },
{ label: "WAV", value: "WAV" },
{ label: "FLAC", value: "FLAC" },
{ label: "ALAW", value: "ALAW" },
{ label: "ULAW", value: "ULAW" },
{ label: "PCM", value: "PCM" },
{ label: "OGG", value: "OGG" },
],
},
}),
modelVersion: Property.StaticDropdown({
displayName: "Model Version",
description: "Choose Gen1 or Gen2.",
required: false,
options: {
options: [
{ label: "GEN1", value: "GEN1" },
{ label: "GEN2", value: "GEN2" },
],
},
}),
multiNativeLocale: Property.ShortText({
displayName: "Multi Native Locale",
description:
"Set multi-language voice (e.g., en-US, es-ES). Only for Gen2.",
required: false,
}),
pitch: Property.Number({
displayName: "Pitch",
description: "Pitch adjustment (-50 to 50).",
required: false,
}),
rate: Property.Number({
displayName: "Rate",
description: "Speed adjustment (-50 to 50).",
required: false,
}),
style: Property.ShortText({
displayName: "Style",
description:
"Voice style (e.g., 'default', 'calm', 'energetic'). Check voice details.",
required: false,
}),
sampleRate: Property.Number({
displayName: "Sample Rate",
description: "Defaults to 44100. Allowed: 8000, 24000, 44100, 48000.",
required: false,
}),
variation: Property.Number({
displayName: "Variation",
description:
"Variation level (05). Defaults to 1. Higher = more natural pauses/pitch/speed.",
required: false,
}),
wordDurationsAsOriginalText: Property.Checkbox({
displayName: "Word Durations as Original Text",
description:
"If true, response word timings map to original text. (English only).",
required: false,
}),
pronunciationDictionary: Property.Json({
displayName: "Pronunciation Dictionary",
description:
"Custom word pronunciations.",
required: false,
}),
},
async run(context) {
const body = {
text: context.propsValue.text,
voiceId: context.propsValue.voiceId,
audioDuration: context.propsValue.audioDuration,
channelType: context.propsValue.channelType,
encodeAsBase64: context.propsValue.encodeAsBase64,
format: context.propsValue.format,
modelVersion: context.propsValue.modelVersion,
multiNativeLocale: context.propsValue.multiNativeLocale,
pitch: context.propsValue.pitch,
rate: context.propsValue.rate,
sampleRate: context.propsValue.sampleRate,
style: context.propsValue.style,
variation: context.propsValue.variation,
wordDurationsAsOriginalText:
context.propsValue.wordDurationsAsOriginalText,
pronunciationDictionary: context.propsValue.pronunciationDictionary,
};
const response = await makeRequest(
context.auth.secret_text ,
HttpMethod.POST,
"/speech/generate",
body
);
return response;
},
});

View File

@@ -0,0 +1,33 @@
import { createAction, Property } from "@activepieces/pieces-framework";
import { murfAuth } from "../common/auth";
import { murfCommon } from "../common/dropdown";
import { makeRequest } from "../common/client";
import { HttpMethod } from "@activepieces/pieces-common";
export const translateText = createAction({
auth: murfAuth,
name: "translateText",
displayName: "Translate Text",
description: "Translate one or more texts to the target language.",
props: {
targetLanguage: murfCommon.language,
texts: Property.Array({
displayName: "Texts",
description: "List of texts to translate",
required: true,
}),
},
async run({ auth, propsValue }) {
const response = await makeRequest(
auth.secret_text ,
HttpMethod.POST,
"/text/translate",
{
target_language: propsValue.targetLanguage,
texts: propsValue.texts,
}
);
return response;
},
});

View File

@@ -0,0 +1,139 @@
import { ApFile, createAction, Property } from "@activepieces/pieces-framework";
import { HttpMethod } from "@activepieces/pieces-common";
import { murfAuth } from "../common/auth";
import { murfCommon } from "../common/dropdown";
import { makeRequest } from "../common/client";
import FormData from "form-data";
export const voiceChange = createAction({
auth: murfAuth,
name: "voice-changer-convert",
displayName: "Voice Changer",
description: "Convert an input audio file to a different voice using Murf Voice Changer.",
props: {
language: murfCommon.language,
voiceId: murfCommon.voiceId,
fileUrl: Property.ShortText({
displayName: "File URL",
description: "Publicly accessible URL of the input audio file. Either provide this or upload a file.",
required: false,
}),
file: Property.File({
displayName: "Upload File",
description: "Upload an audio file for voice conversion",
required: false,
}),
format: Property.StaticDropdown({
displayName: "Output Format",
description: "Format of the generated audio file",
required: false,
options: {
options: [
{ label: "MP3", value: "MP3" },
{ label: "WAV", value: "WAV" },
{ label: "FLAC", value: "FLAC" },
{ label: "OGG", value: "OGG" },
],
},
}),
channelType: Property.StaticDropdown({
displayName: "Channel Type",
description: "Choose MONO or STEREO output",
required: false,
options: {
options: [
{ label: "Mono", value: "MONO" },
{ label: "Stereo", value: "STEREO" },
],
},
}),
pitch: Property.Number({
displayName: "Pitch",
description: "Pitch adjustment (-50 to 50)",
required: false,
}),
rate: Property.Number({
displayName: "Rate",
description: "Speed adjustment (-50 to 50)",
required: false,
}),
encodeOutputAsBase64: Property.Checkbox({
displayName: "Encode Output as Base64",
description: "Receive audio directly as Base64 instead of a file URL",
required: false,
}),
},
async run({ auth, propsValue }) {
try {
const { voiceId, file, fileUrl, format, pitch, rate, encodeOutputAsBase64 } =
propsValue as {
voiceId: string;
file?: ApFile;
fileUrl?: string;
format?: string;
pitch?: number;
rate?: number;
encodeOutputAsBase64?: boolean;
};
// Validation
if (!file && !fileUrl) {
throw new Error(" Either 'Source Audio File' or 'Source File URL' must be provided.");
}
if (file && fileUrl) {
throw new Error(" Provide only one: 'Source Audio File' OR 'Source File URL', not both.");
}
// Build FormData
const formData = new FormData();
formData.append("voice_id", voiceId);
if (fileUrl) {
formData.append("file_url", fileUrl);
}
if (file) {
try {
const fileBuffer = Buffer.from(file.base64, "base64");
const blob = new Blob([fileBuffer]);
formData.append("file", blob, file.filename);
} catch (e) {
throw new Error("Failed to process uploaded file. Ensure it's a valid audio file.");
}
}
if (format) formData.append("format", format);
if (pitch !== undefined) formData.append("pitch", pitch.toString());
if (rate !== undefined) formData.append("rate", rate.toString());
if (encodeOutputAsBase64) formData.append("encode_output_as_base64", "true");
// API request
const response = await makeRequest(
auth.secret_text,
HttpMethod.POST,
"/voice-changer/convert",
formData,
true
);
// Handle Murf error response
if (response?.errorMessage) {
throw new Error(
` Murf API error (${response.errorCode || "unknown"}): ${response.errorMessage}`
);
}
return {
success: true,
message: " Voice conversion successful",
data: response,
};
} catch (error: any) {
return {
success: false,
message: error.message || "Unexpected error during voice conversion",
details: error.response?.body || error,
};
}
},
});

View File

@@ -0,0 +1,35 @@
import { PieceAuth } from "@activepieces/pieces-framework";
import { makeRequest } from "./client";
import { HttpMethod } from "@activepieces/pieces-common";
export const murfAuth = PieceAuth.SecretText({
displayName: "API Key",
description: "Enter your API key from https://murf.ai",
required: true,
validate: async ({ auth }) => {
if (!auth) {
return {
valid: false,
error: "API Key is required",
};
}
try {
const response = await makeRequest(auth as string, HttpMethod.GET, "/auth/token");
if (response && response.token) {
return { valid: true };
}
return {
valid: false,
error: "Invalid API key or token could not be generated",
};
} catch (e: any) {
return {
valid: false,
error: `Auth validation failed: ${e.message}`,
};
}
},
});

View File

@@ -0,0 +1,38 @@
import { HttpMethod, httpClient } from "@activepieces/pieces-common";
export const BASE_URL = "https://api.murf.ai/v1";
export async function makeRequest(
apiKey: string,
method: HttpMethod,
path: string,
body?: any,
isFormData = false
) {
try {
let headers: Record<string, string> = {
"api-key": apiKey,
};
const requestBody = body;
if (!isFormData) {
headers["Content-Type"] = "application/json";
} else if (body && typeof (body as any).getHeaders === "function") {
headers = { ...headers, ...(body as any).getHeaders() };
}
const response = await httpClient.sendRequest({
method,
url: `${BASE_URL}${path}`,
headers,
body: requestBody,
});
return response.body;
} catch (error: any) {
throw new Error(
`Unexpected error: ${JSON.stringify(error.response || error.message || error)}`
);
}
}

View File

@@ -0,0 +1,121 @@
import { Property } from "@activepieces/pieces-framework";
import { HttpMethod } from "@activepieces/pieces-common";
import { makeRequest } from "./client";
import { murfAuth } from "./auth";
// Helper to fetch voices
const getVoices = async (apiKey: string) => {
return await makeRequest(apiKey, HttpMethod.GET, "/speech/voices");
};
// Helper to build unique language list
const getLanguages = async (apiKey: string) => {
const voices = await getVoices(apiKey);
const languageMap = new Map<string, string>();
voices.forEach((voice: any) => {
if (voice.supportedLocales) {
Object.keys(voice.supportedLocales).forEach((localeCode) => {
if (!languageMap.has(localeCode)) {
languageMap.set(
localeCode,
voice.supportedLocales[localeCode].detail || localeCode
);
}
});
}
});
return Array.from(languageMap, ([value, label]) => ({ label, value }));
};
export const murfCommon = {
language: Property.Dropdown({
auth: murfAuth,
displayName: "Language",
description: "Select your preferred language for the translated output.",
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: "Please connect your Murf account first.",
options: [],
};
}
const langs = await getLanguages(auth.secret_text);
return {
disabled: false,
options: langs,
};
},
}),
voiceId: Property.Dropdown({
auth: murfAuth,
displayName: "Voice",
description: "Choose a voice for converting text into speech",
required: true,
refreshers: ["language"],
options: async ({ auth, language }) => {
if (!auth|| !language) {
return {
disabled: true,
placeholder: "Please select a language and connect your Murf account first.",
options: [],
};
}
const voices = await getVoices(auth.secret_text);
const filtered = voices.filter((v: any) =>
Object.keys(v.supportedLocales || {}).includes(language as string)
);
return {
disabled: false,
options: filtered.map((v: any) => ({
label: `${v.displayName} (${v.gender}, ${v.locale})`,
value: v.voiceId,
})),
};
},
}),
sourceLocale: Property.Dropdown({
auth: murfAuth,
displayName: "Source Locale",
description: "Select the source locale for input text.",
required: false,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: "Please connect your Murf account first.",
options: [],
};
}
const voices = await getVoices(auth.secret_text);
const localeMap = new Map<string, string>();
voices.forEach((voice: any) => {
if (voice.supportedLocales) {
Object.entries(voice.supportedLocales).forEach(([localeCode, localeData]: any) => {
if (!localeMap.has(localeCode)) {
localeMap.set(localeCode, localeData.detail);
}
});
}
});
return {
disabled: false,
options: Array.from(localeMap, ([value, label]) => ({ value, label })),
};
},
}),
};

View File

@@ -0,0 +1,20 @@
{
"extends": "../../../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"importHelpers": true,
"noImplicitOverride": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"noPropertyAccessFromIndexSignature": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
}
]
}

View File

@@ -0,0 +1,9 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"include": ["src/**/*.ts"]
}