aopstudio 的个人博客

记录精彩的程序人生

AOP=art of programming=编程的艺术=程艺
  menu
46 文章
0 浏览
0 当前访客
ღゝ◡╹)ノ❤️

人工智能生成合成内容标识方法解析:文件隐式标识的 Python 实践

前言

2025年9月1日起,《人工智能生成合成内容标识办法》正式实行,AI生成合成内容必须添加标识。与之相应的国家标准《网络安全技术人工智能生成合成内容标识方法》(GB45438—2025)也已经版本,其中说明了不同文件格式应当添加什么标识。

具体来说,人工智能生成合成内容标识包含显式标识和隐式标识二种方式。显式标识指在人工智能生成合成内容或交互场景界面中添加的,以文字、声音、图形等方式呈现并可被用户明显感知到的标识,主要用途是向公众提示内容由人工智能生成合成;隐式标识指采取技术措施在人工智能生成合成内容文件数据中添加的,不易被用户明显感知到的标识,主要用途是记录生成合成内容相关信息。

国标中对于显式标识的说明很清晰,作为开发人员实现起来也很简单。隐式标识需要修改文件的元数据,但只说明了哪几个字段,查了一下网上,也并没有现成的代码,只有全国网络安全标准化技术委员会的网站https://www.tc260.org.cn/front/postDetail.html?id=20250828165129 上提供了实践指南,但其中除了针对图片文件给了添加隐式标识的Python代码,其他文件格式依然需要自己去实现相关代码。而且经过本人的尝试,针对图片文件的Python代码在运行时也会有一些坑。

因此,本文将介绍针对不同格式的人工智能生成合成文件如何使用Python代码添加隐式标识,以及实践指南中给的针对图片文件的Python代码的注意事项。

图片文件(原版代码使用exempi)

实践指南中只给出了针对图片文件的添加隐式标识的Python代码,我将注释精简后如下所示:

from libxmp import XMPFiles, XMPMeta
from libxmp.consts import XMP_NS_DC

def add_image_tag(file_path):
    AIGC_NS_URI = "http://www.tc260.org.cn/ns/AIGC/1.0/"
    AIGC_NS_PREFIX = "TC260"
    XMPMeta.register_namespace(AIGC_NS_URI, AIGC_NS_PREFIX)

    xmpfile = XMPFiles(file_path=file_path, open_forupdate=True)
    try:
        xmp = xmpfile.get_xmp() or XMPMeta()
        xmp.set_property(XMP_NS_DC, "title", "example title")
        xmp.set_property(AIGC_NS_URI, "AIGC",
                         '{"Label":"value1","ContentProducer":"value2","ProduceID":"value3",'
                         '"ReservedCode1":"value4","ContentPropagator":"value5",'
                         '"PropagateID":"value6","ReservedCode2":"value7"}')
        xmpfile.put_xmp(xmp)
        print(f"成功写入扩展 XMP 到 {file_path}")
    except Exception as e:
        print(f"写入失败:{str(e)}")
    finally:
        xmpfile.close_file()
if __name__ == '__main__':
    add_image_tag("sample.jpg")

但这段代码想要运行成功,必须安装exempi(系统级工具库)和python-xmp-toolkit(python工具库)这两个库,安装命令为:

brew install exempi   # mac系统,其他系统请自行调整
pip install python-xmp-toolkit

同时,在我本机运行时,即便已经安装了exempi库,并且重启了终端,但在运行这段python代码时仍然无法找到exempi库。经过我的尝试发现,在代码前面还需要手动设置一下环境变量以便于python能够找到exempi库。因此,完整代码为:

import os
# 设置 DYLD_LIBRARY_PATH,让 Python 能找到 libexempi.dylib。如果不写这句会报错找不到exempi
os.environ["DYLD_LIBRARY_PATH"] = "/opt/homebrew/lib"   # 注意要根据自己的操作系统来设定,这里是mac系统的

from libxmp import XMPFiles, XMPMeta
from libxmp.consts import XMP_NS_DC

def add_image_tag(file_path):
    AIGC_NS_URI = "http://www.tc260.org.cn/ns/AIGC/1.0/"
    AIGC_NS_PREFIX = "TC260"
    XMPMeta.register_namespace(AIGC_NS_URI, AIGC_NS_PREFIX)

    xmpfile = XMPFiles(file_path=file_path, open_forupdate=True)
    try:
        xmp = xmpfile.get_xmp() or XMPMeta()
        xmp.set_property(XMP_NS_DC, "title", "example title")
        xmp.set_property(AIGC_NS_URI, "AIGC",
                         '{"Label":"value1","ContentProducer":"value2","ProduceID":"value3",'
                         '"ReservedCode1":"value4","ContentPropagator":"value5",'
                         '"PropagateID":"value6","ReservedCode2":"value7"}')
        xmpfile.put_xmp(xmp)
        print(f"成功写入扩展 XMP 到 {file_path}")
    except Exception as e:
        print(f"写入失败:{str(e)}")
    finally:
        xmpfile.close_file()
if __name__ == '__main__':
    add_image_tag("sample.jpg")

最后想要检查自己写入的元数据,在终端执行以下命令就可以查看:

exempi -x sample.jpg

图片文件(使用exiv2)

除了exempi库,也可以使用exiv2库来修改图片元数据,前提需要安装相关的库:

brew install exiv2  # mac系统,其他系统请自行调整
pip install pyexiv2

python代码如下

import pyexiv2
import json

def add_image_tag(file_path):
    AIGC_NS_URI = "http://www.tc260.org.cn/ns/AIGC/1.0/"
    AIGC_NS_PREFIX = "TC260"

    aigc_value = {
        "Label": "value1",
        "ContentProducer": "value2",
        "ProduceID": "value3",
        "ReservedCode1": "value4",
        "ContentPropagator": "value5",
        "PropagateID": "value6",
        "ReservedCode2": "value7",
    }

    # 打开文件
    img = pyexiv2.Image(file_path)

    pyexiv2.registerNs(AIGC_NS_URI, AIGC_NS_PREFIX)

    # 设置 XMP 属性,键名形如:Xmp.TC260.AIGC
    img.modify_xmp({
        f"Xmp.{AIGC_NS_PREFIX}.AIGC": json.dumps(aigc_value, ensure_ascii=False)
    })

    img.close()
    print(f"成功写入扩展XMP 到 {file_path}")


if __name__ == "__main__":
    add_image_tag("exiv_sample.jpg")

在终端检查写入的元数据命令为:

exiv2 -pX sample.jpg

在我个人的尝试中,使用exiv2并不会像exempi那样python找不到系统库的情况,因此也无需设置环境变量,只要通过brew安装好即可

音频文件(以mp3为例)

在实践指南中,给出了使用ffmpeg工具为音频文件添加隐式标识的方法,我将其转换为了Python代码的实现。

首先需要安装相关的库:

brew install ffmpeg
pip install ffmpeg-python

Python代码如下:

import ffmpeg

input_file = "input.mp3"
output_file = "example.mp3"

def add_mp3_tag(input_file, output_file):
    metadata = {
        "AIGC": '{"Label":"value1","ContentProducer":"value2","ProduceID":"value3",'
                '"ReservedCode1":"value4","ContentPropagator":"value5",'
                '"PropagateID":"value6","ReservedCode2":"value7"}'
    }

    (   
        ffmpeg
        .input(input_file)
        .output(
            output_file,
            metadata=f"AIGC={metadata['AIGC']}",  # 设置 metadata
            c="copy"
        )
        .run(overwrite_output=True)
    )

if __name__ == '__main__':
    add_mp3_tag(input_file, output_file)

在终端检查写入的元数据命令:

ffprobe -i output.mp3   # ffprobe在安装ffmpeg时会自动安装

视频文件(以mp4为例)

在实践指南中,给出了使用ffmpeg工具为视频文件添加隐式标识的方法,我将其转换为了Python代码的实现。

首先依旧需要安装相关的库:

brew install ffmpeg
pip install ffmpeg-python

Python代码如下:

import ffmpeg

input_file = "input.mp4"
output_file = "output.mp4"

def add_video_tag(input_file, output_file):
    metadata = {
        "AIGC": '{"Label":"value1","ContentProducer":"value2","ProduceID":"value3",'
                '"ReservedCode1":"value4","ContentPropagator":"value5",'
                '"PropagateID":"value6","ReservedCode2":"value7"}'
    }

    (   
        ffmpeg
        .input(input_file)
        .output(
            output_file,
            metadata=f"AIGC={metadata['AIGC']}",  # 设置 metadata
            movflags="use_metadata_tags",
            c="copy"
        )
        .run(overwrite_output=True)
    )

if __name__ == "__main__":
    add_video_tag(input_file, output_file)

在终端检查写入的元数据命令:

ffprobe -i output.mp34  # ffprobe在安装ffmpeg时会自动安装

文本文件(以PDF为例)

实践指南中针对文本文件添加隐式标识只给了伪代码,我尝试编写了Python代码实现。

代码运行需要安装PyPDF2这个库,安装命令为:

pip install PyPDF2

具体代码为:

import json
from PyPDF2 import PdfReader, PdfWriter

def add_pdf_tag(input_pdf, output_pdf, metadata_dict):
    """
    在 PDF 的 Document Information Dictionary 中写入自定义 /AIGC 字段
    :param input_pdf: 输入 PDF 文件路径
    :param output_pdf: 输出 PDF 文件路径
    :param metadata_dict: Python dict,内容会被写入 /AIGC
    """

    # 将 dict 转为 JSON 字符串
    aigc_json = json.dumps(metadata_dict, ensure_ascii=False)

    reader = PdfReader(input_pdf)
    writer = PdfWriter()

    # 复制所有页面
    for page in reader.pages:
        writer.add_page(page)

    # 获取原有信息字典
    info = reader.metadata or {}

    # 新增 /AIGC 字段
    info.update({"/AIGC": aigc_json})

    # 写入新的 PDF
    writer.add_metadata(info)
    with open(output_pdf, "wb") as f:
        writer.write(f)
    print(f"AIGC metadata written to {output_pdf}")

# 示例使用
metadata = {
    "Label": "value1",
    "ContentProducer": "value2",
    "ProduceID": "value3",
    "ReservedCode1": "value4",
    "ContentPropagator": "value5",
    "PropagateID": "value6",
    "ReservedCode2": "value7"
}

if __name__ == "__main__":
    add_pdf_tag("input.pdf", "output.pdf", metadata)

检查元数据可以直接使用文本编辑器以原始编码形式打开pdf文件,可以看到类似于下面这样的信息:

<<
/Producer
/Author
/CreationDate 
/ModDate
/Title 
/AIGC ...
>>

本文声明

本文声明:本文代码仅为个人研究使用,且使用了AI辅助编程,请勿用于真实生产环境,如有因此导致的风险损失,本文概不负责。


标题:人工智能生成合成内容标识方法解析:文件隐式标识的 Python 实践
作者:aopstudio
地址:https://www.neusoftware.top/articles/2025/09/05/1757041502961.html