すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:オーディオマージとは

最終更新日:Mar 20, 2026

オーディオマージは、OSS に格納された複数のオーディオオブジェクトを単一の出力ファイルに連結する機能です。各ソースクリップは、ユーザーが指定した順序で端から端まで配置され、非同期操作により一括してターゲットフォーマットへトランスコードされます。

ローカルのオーディオ処理ツールを実行することなく、ナレーション付きチャプターの編集、マルチトラック録音の統合、対話と環境音の結合など、ポストプロダクション作業を自動化するためにオーディオマージをご利用ください。

適用範囲/利用シーン

  • 音楽制作:個別の楽器演奏およびボーカル録音を、完成済みのトラックとして統合します。

  • オーディオブック制作:ナレーション付きチャプターをシームレスなフルレングスのオーディオファイルに連結します。

  • 映画・テレビ番組のポストプロダクション:対話、ナレーション、環境音、音楽を統一されたオーディオミックスに組み込みます。

  • ソーシャルメディア向けコンテンツ:効果音、ナレーション、バックグラウンド音声を重ねて、動画コンテンツの品質を向上させます。

前提条件

開始前に、以下の条件を満たしていることを確認してください。

  • Intelligent Media Management (IMM) プロジェクトにバインドされた OSS バケット。セットアップ手順については、「クイックスタート」(OSS コンソール) または「AttachOSSBucket」(IMM API) をご参照ください。

  • オーディオマージを使用するために必要な権限。詳細については、「権限」をご参照ください。

  • 認証済みアクセスであること(匿名リクエストは拒否されます)。

仕組み

オーディオマージは、audio/concat 操作と x-oss-async-process ヘッダーを用いて実行されます。すべてのリクエストは非同期です。

クリップの並び順は、リクエスト文字列内の /pre および /sur マーカーによって制御されます。

  • /pre — クリップを、これまでにリストアップされたすべてのクリップのに配置します。

  • /sur — クリップを、これまでにリストアップされたすべてのクリップのに配置します。

リクエスト文字列内における /pre および /sur の出現順序が、最終的な出力順序を決定します。また、各クリップは連結前に ss(開始オフセット)および t(持続時間)パラメーターを用いてトリミングできます。

連結後に、マージされたオーディオは指定した出力フォーマットへトランスコードされます。sys/saveas を使用して結果を対象 OSS オブジェクトに書き込み、notify を使用して完了通知を受信します。

1 回のリクエストでマージできるオーディオオブジェクトは最大 11 個です。
サンプリングレート(ar)またはサウンドチャンネル数(ac)をデフォルト値のままにした場合、出力は align で特定されたソースオーディオからこれらの値を継承します。デフォルト値とターゲットコンテナ形式との不一致によりマージが失敗する可能性があります。この問題を回避するには、ar および ac を明示的に指定してください。

オーディオオブジェクトのマージ

クイックスタート

以下の Python の例では、2 つの MP3 ファイルをマージし、AAC 形式のファイルとして保存します。このコードを起点として、ご自身のユースケースに合わせてパラメーターを調整してください。

Python 向け OSS SDK バージョン 2.18.4 以降が必要です。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数を設定してください。

# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider


def main():
    # 環境変数からアクセス認証情報を読み込みます。
    # このコードを実行する前に、OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET を設定します。
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

    # バケットが配置されているリージョンのエンドポイントを指定します。
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    # リージョン ID を指定します。 例: cn-hangzhou。
    region = 'cn-hangzhou'

    bucket_name = 'examplebucket'
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)

    # 出力オーディオオブジェクト名を指定します。
    target_audio = 'dest.aac'
    # マージするソースオーディオオブジェクトを指定します。
    audio1 = 'src1.mp3'
    audio2 = 'src2.mp3'

    # ソースオーディオオブジェクト名を URLセーフな Base64 でエンコードします。
    audio1_encoded = base64.urlsafe_b64encode(audio1.encode()).decode().rstrip('=')
    audio2_encoded = base64.urlsafe_b64encode(audio2.encode()).decode().rstrip('=')

    # audio/concat プロセス文字列を構築します。
    style = f"audio/concat,f_aac,ac_1,ar_44100,ab_96000,align_2/pre,o_{audio1_encoded}/pre,o_{audio2_encoded},t_0"

    # sys/saveas および notify パラメーターを追加します。
    bucket_encoded = base64.urlsafe_b64encode(bucket_name.encode()).decode().rstrip('=')
    target_encoded = base64.urlsafe_b64encode(target_audio.encode()).decode().rstrip('=')
    process = f"{style}|sys/saveas,b_{bucket_encoded},o_{target_encoded}/notify,topic_QXVkaW9Db252ZXJ0"

    # 非同期マージタスクを送信します。
    try:
        result = bucket.async_process_object(audio1, process)
        print(f"EventId: {result.event_id}")
        print(f"RequestId: {result.request_id}")
        print(f"TaskId: {result.task_id}")
    except Exception as e:
        print(f"Error: {e}")


if __name__ == "__main__":
    main()

Java および Go の例については、「SDK の例」をご参照ください。

操作

audio/concat

マージ用パラメーター

/pre および /sur マーカーはそれぞれ 1 つのオーディオクリップを表します。各マーカーの後には、そのクリップを記述する 1 つ以上のパラメーターが続きます。

パラメーター必須説明
ostringはいOSS バケット内のオーディオオブジェクト名。URL セーフ Base64 エンコーディングである必要があります。
ssintいいえ開始オフセット(ミリ秒単位)。0 の場合は先頭から(デフォルト)、0 より大きい値の場合は、その位置からソースオーディオを再生します。
tintいいえ持続時間(ミリ秒単位)。0 の場合はソースオーディオの末尾まで(デフォルト)、0 より大きい値の場合は、そのミリ秒分のみを使用します。

トランスコード用パラメーター

これらのパラメーターは、マージ後の出力全体に適用されます。

パラメーター必須説明
fstringはい出力オーディオのコンテナ形式。有効な値:mp3aacflacogaac3opusamr
ssintいいえトランスコードの開始オフセット(ミリ秒単位)。0 の場合は先頭から(デフォルト)。
tintいいえトランスコードの持続時間(ミリ秒単位)。0 の場合はマージ済みオーディオの末尾まで(デフォルト)。
arintいいえ出力オーディオのサンプリングレート(Hz 単位)。align で特定されたソースオーディオのサンプリングレートがデフォルト値となります。有効な値:80001102512000160002205024000320004410048000640008820096000。フォーマット固有の制限については、下記をご参照ください。
acintいいえサウンドチャンネル数。align で特定されたソースオーディオのチャンネル数がデフォルト値となります。有効な値:18。フォーマット固有の制限については、下記をご参照ください。
abintいいえターゲットオーディオビットレート(bit/s 単位)。有効な値:100010000000aq と排他的です。両方とも省略された場合、コーデックのデフォルトビットレートが使用されます。
aqintいいえオーディオ圧縮品質。有効な値:0100ab と排他的です。両方とも省略された場合、コーデックのデフォルトビットレートが使用されます。
aboptstringいいえソースクリップのビットレートが ab より低い場合のビットレート処理方法。ab の指定が必要です。有効な値:0(常に ab を使用、デフォルト)、1(低い方のビットレートを使用)、2(失敗を返す)。
alignintいいえデフォルトトランスコーディングパラメーターを取得するソースオーディオのインデックス(0 基準)。デフォルト値:0(リスト内の最初のクリップ)。
adepthintいいえ出力オーディオのサンプリングビット深度。有効な値:1624fflac の場合にのみ適用されます。

フォーマット固有の制限

フォーマット最大サンプリングレート最大チャンネル数
MP348 kHz2
Opus8、12、16、24、または 48 kHz
AC332、44.1、または 48 kHz6(5.1)
AMR8 または 16 kHz1

追加パラメーター

audio/concat と共に使用可能なパラメーターは以下のとおりです。

  • sys/saveas — 出力を指定された OSS オブジェクトに書き込みます。パラメーター:b_<bucket> および o_<object>(いずれも URL セーフ Base64 エンコーディング)。詳細については、「sys/saveas」をご参照ください。

  • notify — 完了通知を送信します。パラメーター:topic_<topic>(URL セーフ Base64 エンコーディング)。詳細については、「メッセージ通知」をご参照ください。

5 つのクリップを AAC ファイルにマージ(REST API)

この例では、異なるフォーマットの 5 つのソースオーディオオブジェクトを、モノラルチャンネル、44.1 kHz サンプリングレート、96 Kbit/s ビットレートの単一 AAC 出力にマージします。タスク完了時にシンプルメッセージキュー(SMQ)通知が送信されます。

ソースクリップおよびマージ順序

オーディオオブジェクト順序使用セグメント
pre1.mp31完全な持続時間
pre2.wav2最初の 2 秒間
example.oga3全体の持続時間
sur1.aac44~10 秒目
sur2.wma510 秒目から終了まで

出力

  • フォーマット:AAC

  • サンプリングレート:44.1 kHz、モノラル

  • ビットレート:96 Kbit/s

  • 保存先:oss://outbucket/outobj.aac

以下に示すすべてのオブジェクト名は URL セーフ Base64 エンコーディングされています。align_2 パラメーターは、example.oga(インデックス 2)からデフォルトトランスコーディングプロパティを設定します。

POST /example.oga?x-oss-async-process HTTP/1.1
Host: video-demo.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 28 Oct 2022 06:40:10 GMT
Authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20250417/cn-hangzhou/oss/aliyun_v4_request,Signature=a7c3554c729d71929e0b84489addee6b2e8d5cb48595adfc51868c299c0c218e

x-oss-async-process=audio/concat,f_aac,ac_1,ar_44100,ab_96000,align_2/pre,o_cHJlMS5tcDMK/pre,o_cHJlMi53YXYK,t_2000/sur,o_c3VyMS5hYWMK,ss_4000,t_10000/sur,o_c3VyMi53bWEK,ss_10000|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqLnthdXRvZXh0fQo/notify,topic_QXVkaW9Db252ZXJ0

SDK の例

OSS SDK では、Java、Python、Go のみでオーディオマージがサポートされています。

Java

Java 向け OSS SDK バージョン 3.17.4 以降が必要です。

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.AsyncProcessObjectRequest;
import com.aliyun.oss.model.AsyncProcessObjectResult;
import com.aliyuncs.exceptions.ClientException;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class Demo {

    public static void main(String[] args) throws ClientException {
        // Specify the endpoint of the region where the bucket is located.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Specify the region ID. Example: cn-hangzhou.
        String region = "cn-hangzhou";
        // Load access credentials from environment variables.
        // Set OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET before running this code.
        EnvironmentVariableCredentialsProvider credentialsProvider =
                CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Specify the bucket name.
        String bucketName = "examplebucket";
        // Specify the output audio object name.
        String targetAudio = "dest.aac";
        // Specify the source audio objects to merge.
        String audio1 = "src1.mp3";
        String audio2 = "src2.mp3";

        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // Encode source audio object names in URL-safe Base64.
            String audio1Encoded = Base64.getUrlEncoder()
                    .encodeToString(audio1.getBytes(StandardCharsets.UTF_8)).replace("=", "");
            String audio2Encoded = Base64.getUrlEncoder()
                    .encodeToString(audio2.getBytes(StandardCharsets.UTF_8)).replace("=", "");

            // Build the audio/concat process string.
            String style = String.format(
                    "audio/concat,f_aac,ac_1,ar_44100,ab_96000,align_2/pre,o_%s/pre,o_%s,t_0",
                    audio1Encoded, audio2Encoded);

            // Append sys/saveas and notify parameters.
            String bucketEncoded = Base64.getUrlEncoder()
                    .encodeToString(bucketName.getBytes(StandardCharsets.UTF_8)).replace("=", "");
            String targetEncoded = Base64.getUrlEncoder()
                    .encodeToString(targetAudio.getBytes(StandardCharsets.UTF_8)).replace("=", "");
            String process = String.format(
                    "%s|sys/saveas,b_%s,o_%s/notify,topic_QXVkaW9Db252ZXJ0",
                    style, bucketEncoded, targetEncoded);

            // Submit the asynchronous merge task.
            AsyncProcessObjectRequest request = new AsyncProcessObjectRequest(bucketName, audio1, process);
            AsyncProcessObjectResult response = ossClient.asyncProcessObject(request);
            System.out.println("EventId: " + response.getEventId());
            System.out.println("RequestId: " + response.getRequestId());
            System.out.println("TaskId: " + response.getTaskId());

        } finally {
            ossClient.shutdown();
        }
    }
}

Python

Python 向け OSS SDK バージョン 2.18.4 以降が必要です。

# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider


def main():
    # Load access credentials from environment variables.
    # Set OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET before running this code.
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

    # Specify the endpoint of the region where the bucket is located.
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    # Specify the region ID. Example: cn-hangzhou.
    region = 'cn-hangzhou'

    bucket_name = 'examplebucket'
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)

    # Specify the output audio object name.
    target_audio = 'dest.aac'
    # Specify the source audio objects to merge.
    audio1 = 'src1.mp3'
    audio2 = 'src2.mp3'

    # Encode source audio object names in URL-safe Base64.
    audio1_encoded = base64.urlsafe_b64encode(audio1.encode()).decode().rstrip('=')
    audio2_encoded = base64.urlsafe_b64encode(audio2.encode()).decode().rstrip('=')

    # Build the audio/concat process string.
    style = f"audio/concat,f_aac,ac_1,ar_44100,ab_96000,align_2/pre,o_{audio1_encoded}/pre,o_{audio2_encoded},t_0"

    # Append sys/saveas and notify parameters.
    bucket_encoded = base64.urlsafe_b64encode(bucket_name.encode()).decode().rstrip('=')
    target_encoded = base64.urlsafe_b64encode(target_audio.encode()).decode().rstrip('=')
    process = f"{style}|sys/saveas,b_{bucket_encoded},o_{target_encoded}/notify,topic_QXVkaW9Db252ZXJ0"

    # Submit the asynchronous merge task.
    try:
        result = bucket.async_process_object(audio1, process)
        print(f"EventId: {result.event_id}")
        print(f"RequestId: {result.request_id}")
        print(f"TaskId: {result.task_id}")
    except Exception as e:
        print(f"Error: {e}")


if __name__ == "__main__":
    main()

Go

Go 向け OSS SDK バージョン 3.0.2 以降が必要です。

package main

import (
	"encoding/base64"
	"fmt"
	"log"
	"os"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Load access credentials from environment variables.
	// Set OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, and OSS_SESSION_TOKEN before running this code.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Create an OSS client.
	// Specify the endpoint of the region where the bucket is located.
	client, err := oss.New(
		"https://oss-cn-hangzhou.aliyuncs.com", "", "",
		oss.SetCredentialsProvider(&provider),
		oss.AuthVersion(oss.AuthV4),
		oss.Region("cn-hangzhou"),
	)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Specify the bucket name.
	bucketName := "examplebucket"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Specify the source audio objects to merge and the output object name.
	audio1 := "src1.mp3"
	audio2 := "src2.mp3"
	targetAudio := "dest.aac"

	// Encode source audio object names in URL-safe Base64.
	audio1Encoded := base64.URLEncoding.EncodeToString([]byte(audio1))
	audio2Encoded := base64.URLEncoding.EncodeToString([]byte(audio2))

	// Build the audio/concat process string.
	style := fmt.Sprintf(
		"audio/concat,f_aac,ac_1,ar_44100,ab_96000,align_2/pre,o_%s/pre,o_%s,t_0",
		audio1Encoded, audio2Encoded,
	)

	// Append sys/saveas and notify parameters.
	bucketEncoded := base64.URLEncoding.EncodeToString([]byte(bucketName))
	targetEncoded := base64.URLEncoding.EncodeToString([]byte(targetAudio))
	process := fmt.Sprintf(
		"%s|sys/saveas,b_%s,o_%s/notify,topic_QXVkaW9Db252ZXJ0",
		style, bucketEncoded, targetEncoded,
	)

	// Submit the asynchronous merge task.
	result, err := bucket.AsyncProcessObject(audio1, process)
	if err != nil {
		log.Fatalf("Failed to submit async process task: %s", err)
	}

	fmt.Printf("EventId: %s\n", result.EventId)
	fmt.Printf("RequestId: %s\n", result.RequestId)
	fmt.Printf("TaskId: %s\n", result.TaskId)
}

次のステップ

  • sys/saveas — 出力を特定の OSS オブジェクトパスに保存します。

  • メッセージ通知 — 非同期タスクの完了時にコールバックを受信します。

  • 権限 — 音声処理操作のアクセスの制御を設定します。