当前位置: 首页 > wzjs >正文

福州制作手机网站哪家培训机构好

福州制作手机网站,哪家培训机构好,上海做兼职网站有吗,网站后台修改的页面不能显示数字水印技术可以将隐藏信息嵌入到音频文件中而不明显影响音频质量。下面我将介绍几种在Python中实现音频数字水印的方法。 方法一:LSB (最低有效位) 水印 import numpy as np from scipy.io import wavfile def embed_watermark_lsb(audio_path, watermark, ou…

数字水印技术可以将隐藏信息嵌入到音频文件中而不明显影响音频质量。下面我将介绍几种在Python中实现音频数字水印的方法。

方法一:LSB (最低有效位) 水印

import numpy as np

from scipy.io import wavfile

def embed_watermark_lsb(audio_path, watermark, output_path):

    # 读取音频文件

    sample_rate, audio_data = wavfile.read(audio_path)    

    # 确保是立体声,如果是单声道则转换为立体声

    if len(audio_data.shape) == 1:

        audio_data = np.column_stack((audio_data, audio_data))   

    # 将水印转换为二进制

    watermark_bin = ''.join(format(ord(c), '08b') for c in watermark)

    watermark_bin += '00000000' # 添加结束标记   

    # 检查水印是否适合音频

    if len(watermark_bin) > audio_data.size:

        raise ValueError("水印太大,无法嵌入到音频中")  

    # 嵌入水印到最低有效位

    watermark_index = 0

    for i in range(len(audio_data)):

        for j in range(len(audio_data[i])):

            if watermark_index < len(watermark_bin):

                # 替换最低有效位

                audio_data[i][j] = (audio_data[i][j] & 0xFE) | int(watermark_bin[watermark_index])

                watermark_index += 1

            else:

                break   

    # 保存带水印的音频

    wavfile.write(output_path, sample_rate, audio_data)

def extract_watermark_lsb(audio_path, watermark_length):

    # 读取音频文件

    sample_rate, audio_data = wavfile.read(audio_path)    

    # 提取最低有效位

    watermark_bits = []

    for i in range(len(audio_data)):

        for j in range(len(audio_data[i])):

            watermark_bits.append(str(audio_data[i][j] & 1))   

    # 将比特转换为字节

    watermark = ''

    for i in range(0, len(watermark_bits), 8):

        byte = ''.join(watermark_bits[i:i+8])

        if byte == '00000000': # 遇到结束标记

            break

        watermark += chr(int(byte, 2))   

    return watermark[:watermark_length]

# 使用示例

embed_watermark_lsb('original.wav', '秘密消息', 'watermarked.wav')

extracted = extract_watermark_lsb('watermarked.wav', 4)

print("提取的水印:", extracted)

方法二:频域水印 (DCT变换)

import numpy as np

from scipy.fftpack import dct, idct

from scipy.io import wavfile

def embed_watermark_dct(audio_path, watermark, output_path, alpha=0.01):

    # 读取音频

    sample_rate, audio_data = wavfile.read(audio_path)  

    # 如果是立体声,只使用一个声道

    if len(audio_data.shape) > 1:

        audio_data = audio_data[:, 0]   

    # 将水印转换为二进制

    watermark_bin = ''.join(format(ord(c), '08b') for c in watermark)

    watermark_bin = [int(b) for b in watermark_bin]    

    # 分段处理音频

    segment_size = 1024

    num_segments = len(audio_data) // segment_size

    watermark_length = len(watermark_bin)   

    if num_segments < watermark_length:

        raise ValueError("音频太短,无法嵌入水印")   

    # 嵌入水印

    watermarked_audio = np.copy(audio_data)

    for i in range(watermark_length):

        start = i * segment_size

        end = start + segment_size        

        segment = audio_data[start:end]

        dct_coeffs = dct(segment, norm='ortho')       

        # 修改中频系数嵌入水印

        coeff_index = 100 # 选择一个中频系数

        if watermark_bin[i] == 1:

            dct_coeffs[coeff_index] += alpha * np.abs(dct_coeffs[coeff_index])

        else:

            dct_coeffs[coeff_index] -= alpha * np.abs(dct_coeffs[coeff_index])      

        # 逆DCT变换

        watermarked_segment = idct(dct_coeffs, norm='ortho')

        watermarked_audio[start:end] = watermarked_segment   

    # 保存带水印的音频

    wavfile.write(output_path, sample_rate, watermarked_audio.astype(np.int16))

def extract_watermark_dct(audio_path, original_path, watermark_length):

    # 读取带水印音频和原始音频

    sample_rate, watermarked = wavfile.read(audio_path)

    _, original = wavfile.read(original_path)    

    # 如果是立体声,只使用一个声道

    if len(watermarked.shape) > 1:

        watermarked = watermarked[:, 0]

        original = original[:, 0]   

    segment_size = 1024

    watermark_bits = []    

    for i in range(watermark_length):

        start = i * segment_size

        end = start + segment_size       

        wm_segment = watermarked[start:end]

        orig_segment = original[start:end]        

        wm_dct = dct(wm_segment, norm='ortho')

        orig_dct = dct(orig_segment, norm='ortho')        

        coeff_index = 100

        if wm_dct[coeff_index] > orig_dct[coeff_index]:

            watermark_bits.append('1')

        else:

            watermark_bits.append('0')    

    # 将比特转换为字符串

    watermark = ''

    for i in range(0, len(watermark_bits), 8):

        byte = ''.join(watermark_bits[i:i+8])

        watermark += chr(int(byte, 2))  

    return watermark

# 使用示例

embed_watermark_dct('original.wav', '秘密', 'watermarked_dct.wav', 0.02)

extracted = extract_watermark_dct('watermarked_dct.wav', 'original.wav', 16)

print("提取的水印:", extracted)

方法三:扩频水印

import numpy as np

from scipy.io import wavfile

def generate_pn_sequence(length, seed=42):

    np.random.seed(seed)

    return np.random.choice([-1, 1], size=length)

def embed_watermark_spread_spectrum(audio_path, watermark, output_path, alpha=0.01):

    # 读取音频

    sample_rate, audio_data = wavfile.read(audio_path)    

    # 如果是立体声,只使用一个声道

    if len(audio_data.shape) > 1:

        audio_data = audio_data[:, 0]    

    # 将水印转换为二进制

    watermark_bin = ''.join(format(ord(c), '08b') for c in watermark)

    watermark_bits = np.array([int(b) for b in watermark_bin])

    watermark_bits = 2 * watermark_bits - 1 # 转换为±1   

    # 生成伪随机序列

    pn_length = len(audio_data) // len(watermark_bits)

    pn_sequence = generate_pn_sequence(pn_length)   

    # 创建扩频水印

    spread_watermark = np.repeat(watermark_bits, pn_length)

    spread_watermark = spread_watermark[:len(audio_data)] * pn_sequence[:len(audio_data)]   

    # 嵌入水印

    watermarked_audio = audio_data + alpha * spread_watermark * np.abs(audio_data)

    watermarked_audio = np.clip(watermarked_audio, -32768, 32767) # 确保在16位范围内 

    # 保存带水印的音频

    wavfile.write(output_path, sample_rate, watermarked_audio.astype(np.int16))

def extract_watermark_spread_spectrum(audio_path, original_path, watermark_length, pn_length):

    # 读取音频

    sample_rate, watermarked = wavfile.read(audio_path)

    _, original = wavfile.read(original_path)   

    # 如果是立体声,只使用一个声道

    if len(watermarked.shape) > 1:

        watermarked = watermarked[:, 0]

        original = original[:, 0]    

    # 计算差异

    diff = watermarked - original   

    # 生成相同的伪随机序列

    num_bits = watermark_length * 8

    pn_sequence = generate_pn_sequence(pn_length)   

    extracted_bits = []

    for i in range(num_bits):

        start = i * pn_length

        end = start + pn_length       

        segment_diff = diff[start:end]

        segment_pn = pn_sequence[:len(segment_diff)]        

        correlation = np.sum(segment_diff * segment_pn)

        extracted_bits.append('1' if correlation > 0 else '0')    

    # 将比特转换为字符串

    watermark = ''

    for i in range(0, len(extracted_bits), 8):

        byte = ''.join(extracted_bits[i:i+8])

        watermark += chr(int(byte, 2))    

    return watermark

# 使用示例

embed_watermark_spread_spectrum('original.wav', '秘密', 'watermarked_ss.wav', 0.01)

extracted = extract_watermark_spread_spectrum('watermarked_ss.wav', 'original.wav', 2, 1000)

print("提取的水印:", extracted)

 

## 注意事项

1. **音频质量**:水印嵌入会影响音频质量,需要平衡水印强度和音频质量。

2. **鲁棒性**:不同方法对音频处理的抵抗能力不同:

   - LSB方法脆弱但容量大

   - DCT方法对压缩有一定抵抗能力

   - 扩频方法鲁棒性最强但容量小

3. **安全性**:可以考虑加密水印内容提高安全性

4. **格式支持**:示例中使用WAV格式,因其是无损格式,其他格式可能需要先解码

 扩展建议

1. 添加错误校正码提高水印提取的可靠性

2. 实现盲水印提取(不需要原始音频)

3. 添加同步信号提高对裁剪、时间拉伸的抵抗能力

4. 结合多种技术提高水印的鲁棒性和隐蔽

这些方法可以根据具体需求进行调整和组合,以实现不同场景下的音频数字水印需求。


文章转载自:

http://hoi2EeXw.rhgtc.cn
http://ubiAFID4.rhgtc.cn
http://QRaiU3HF.rhgtc.cn
http://loR2yF57.rhgtc.cn
http://i74clXig.rhgtc.cn
http://Kas5vn0q.rhgtc.cn
http://JxS2npY1.rhgtc.cn
http://2rK2c0iq.rhgtc.cn
http://VmLtJIMr.rhgtc.cn
http://kpasNTyz.rhgtc.cn
http://JWzD8KU1.rhgtc.cn
http://WDLj4Tyz.rhgtc.cn
http://fe3zoMf0.rhgtc.cn
http://yHqQpI5y.rhgtc.cn
http://ixaeb0l0.rhgtc.cn
http://snQj2ymL.rhgtc.cn
http://AJwBrczu.rhgtc.cn
http://qWo8mHTO.rhgtc.cn
http://XoU4RtyZ.rhgtc.cn
http://Q36mFOXr.rhgtc.cn
http://vPhEC2rb.rhgtc.cn
http://bcznEE0l.rhgtc.cn
http://g2KXb6RU.rhgtc.cn
http://lAr4FSCV.rhgtc.cn
http://vP1ohd81.rhgtc.cn
http://ksDxX6VH.rhgtc.cn
http://88PiYft9.rhgtc.cn
http://fekpJoQz.rhgtc.cn
http://jdgE6gcL.rhgtc.cn
http://AMcoGlqT.rhgtc.cn
http://www.dtcms.com/wzjs/673918.html

相关文章:

  • 免费网站软件大全网站 系统 区别
  • 免展网站后台注册大连工程建设信息网站
  • 网站调优住房和城乡建设部网站职称查询
  • 上海卖房网站饮料网站建设市场分析
  • wordpress整站打包平台网站制作
  • 大学生做企业网站电子工程设计网站
  • 预约做家庭清洁的网站wordpress免签接口
  • 肇庆城乡建设网站基于o2o的旅游网站建设
  • 怎么登陆建设银行网站看开户行青岛需要做网站的公司有哪些
  • 遵义市网站建设公司商务网站建设的调研
  • 网站如何做单项链接做营销型网站多少钱
  • 广州网站建设便宜制作一个网站的步骤
  • 凡科网站能在百度做推广吗只做健康产品的网站
  • 西安手机网站建设公司黑彩网站建设需要什么东西
  • 网站支持ipv6怎么做网页源码怎么做网站
  • python搭建网站环球资源网官方网站
  • 用DW做的网站怎么弄成链接手机网站列表页源码
  • 网站设计公司地址台州网站建设咨询
  • 域名备案与网站不一致优的网站建设
  • 惠普gen8可以做网站吗办公用品网站建设策划书
  • 什么是网站建设与维护企业网站设计方式
  • 医院网站制作好吗做公众号首图的网站
  • 商务网站策划书手机html5网站模板
  • 公司网站怎么维护在网站上做的h5如何发到微信上
  • 如何个网站做二维码2023年不用做核酸了吗
  • dw怎么建设网站做个人网页
  • 阜平网站建设wordpress发布图片
  • 网站需要去工信部做备案做网页怎么在网站播放视频
  • 网站优化是什么意思搭建网站架构怎么做
  • 广州做礼物的网站定制开发教程