看见本帖标题,你可能会问:“声音大挪移”是什么鬼玩意,和张无忌有什么关系。

如果你没看过鬼畜,先温习两个:【元首】粉红的回忆、【圣地亚哥金曲】客官不可以。(本帖内容和鬼畜关系不大)

前文《实现谷歌Deep Dream》可生成带有艺术感的图片。其实,还有另一种合成图片的方式,洋文叫Style Transfer,这种方法需要用到两张图片,如下图:

  +  = 
皮特 + Style = 皮特 Style

Style Transfer的原始论文:https://arxiv.org/abs/1508.06576;基于Torch的代码实现:neural-style

本帖只是在音频上应用Style Transfer,应该能生成非常搞笑的玩意。

代码:

[python] view plain copy
  1. import tensorflow as tf
  2. import librosa  # 用来提取音频文件, 参看<中文语音识别>
  3. import numpy as np
  4. import os
  5. #import shlex  # python2 pipes
  6. # 音频文件路径
  7. content_audio = "./Traveling_Light.mp3"
  8. style_audio = "./东风破.mp3"
  9. # 为洋文歌曲<Traveling Light>添加周杰伦风味
  10. # 剪辑一段音频, 默认取开头的10s, 太大内存吃不消
  11. def cut_audio(filename, start_pos='00:00:00', lens=10):
  12. newfile = os.path.splitext(os.path.basename(filename))[0] + '_' + str(lens) + 's.mp3'
  13. # 确保系统中已安装ffmpeg
  14. cmd = "ffmpeg -i {} -ss {} -t {} {}".format(filename, start_pos, lens, newfile)
  15. os.system(cmd)
  16. return newfile
  17. content_audio_10s = cut_audio(content_audio, start_pos='00:00:33')
  18. style_audio_10s = cut_audio(style_audio, start_pos='00:00:38')
  19. # Short Time Fourier Transform音频转spectrogram(把1维信号转为2维, 可以被视作图像)
  20. # https://en.wikipedia.org/wiki/Short-time_Fourier_transform
  21. N_FFT = 2048
  22. def read_audio(filename):
  23. x, fs = librosa.load(filename)
  24. S = librosa.stft(x, N_FFT)
  25. p = np.angle(S)
  26. S = np.log1p(np.abs(S[:,:430]))
  27. return S, fs
  28. content_data, _ = read_audio(content_audio_10s)
  29. style_data, fs = read_audio(style_audio_10s)
  30. samples_n = content_data.shape[1]  # 430
  31. channels_n = style_data.shape[0]   # 1025
  32. style_data = style_data[:channels_n, :samples_n]
  33. content_data_tf = np.ascontiguousarray(content_data.T[None,None,:,:])
  34. style_data_tf = np.ascontiguousarray(style_data.T[None,None,:,:])
  35. # filter shape "[filter_height, filter_width, in_channels, out_channels]"
  36. N_FILTERS = 4096
  37. std = np.sqrt(2) * np.sqrt(2.0 / ((channels_n + N_FILTERS) * 11))
  38. kernel = np.random.randn(1, 11, channels_n, N_FILTERS)*std
  39. # content and style features
  40. g = tf.Graph()
  41. with g.as_default(), g.device('/cpu:0'), tf.Session() as sess:
  42. # data shape "[batch, in_height, in_width, in_channels]",
  43. x = tf.placeholder('float32', [1, 1, samples_n, channels_n], name="x")
  44. kernel_tf = tf.constant(kernel, name="kernel", dtype='float32')
  45. conv = tf.nn.conv2d(x, kernel_tf, strides=[1, 1, 1, 1], padding="VALID", name="conv")
  46. net = tf.nn.relu(conv)
  47. content_features = net.eval(feed_dict={x: content_data_tf})
  48. style_features = net.eval(feed_dict={x: style_data_tf})
  49. features = np.reshape(style_features, (-1, N_FILTERS))
  50. style_gram = np.matmul(features.T, features) / samples_n
  51. # Optimize
  52. ALPHA= 0.01   # ALPHA越大,content越占主导; 如果ALPHA为0,表示没有content
  53. result = None
  54. with tf.Graph().as_default():
  55. learning_rate= 0.001
  56. x = tf.Variable(np.random.randn(1, 1, samples_n, channels_n).astype(np.float32)*learning_rate, name="x")
  57. kernel_tf = tf.constant(kernel, name="kernel", dtype='float32')
  58. conv = tf.nn.conv2d(x, kernel_tf, strides=[1, 1, 1, 1], padding="VALID", name="conv")
  59. net = tf.nn.relu(conv)
  60. content_loss = ALPHA * 2 * tf.nn.l2_loss(net - content_features)
  61. style_loss = 0
  62. _, height, width, number = map(lambda i: i.value, net.get_shape())
  63. size = height * width * number
  64. feats = tf.reshape(net, (-1, number))
  65. gram = tf.matmul(tf.transpose(feats), feats)  / samples_n
  66. style_loss = 2 * tf.nn.l2_loss(gram - style_gram)
  67. # loss
  68. loss = content_loss + style_loss
  69. opt = tf.contrib.opt.ScipyOptimizerInterface(loss, method='L-BFGS-B', options={'maxiter': 300})
  70. # Optimization
  71. with tf.Session() as sess:
  72. sess.run(tf.global_variables_initializer())
  73. opt.minimize(sess)
  74. result = x.eval()
  75. # 把spectrogram转回wav音频
  76. audio = np.zeros_like(content_data)
  77. audio[:channels_n,:] = np.exp(result[0,0].T) - 1
  78. p = 2 * np.pi * np.random.random_sample(audio.shape) - np.pi
  79. for i in range(500):
  80. S = audio * np.exp(1j*p)
  81. x = librosa.istft(S)
  82. p = np.angle(librosa.stft(x, N_FFT))
  83. librosa.output.write_wav("output.mp3", x, fs)

生成的文件:output.mp3

相关资源

  • https://github.com/DmitryUlyanov/neural-style-audio-torch
  • https://github.com/anishathalye/neural-style
  • https://gitxiv.com/posts/jG46ukGod8R7Rdtud/a-neural-algorithm-of-artistic-style
  • https://gist.github.com/genekogan/d61c8010d470e1dbe15d

Share the post "TensorFlow练习17: “声音大挪移”"

tf17: “声音大挪移”相关推荐

  1. 由某梦CMS导致近来改版的太多数据库大挪移手软了

    由某梦CMS导致近来改版的太多数据库大挪移手软了,作为一位开发人员,说的有点直白,但都是实话 1.各种PHP程序站点大挪移 说白了就是重新写前端程序,没什么程序能直接替换标签直接搞定的-或许我的水平还 ...

  2. 【字源大挪移—读书笔记】 第三部分:字尾

    [字源大挪移-读书笔记] 第三部分:字尾 [3 字尾:[3.1]名词字尾.[3.2]形容词字尾.[3.3]副词字尾.[3.4]动词字尾 [3.1]名词字尾(Noun) [3.1.1]表示[人]的字尾 ...

  3. 红黑棋子交换java,象棋大挪移 红黑棋子 红先黑后,输了不臭

    小故事:红黑棋子 我们知道,象棋分为红.黑两个阵营:红色的"帅"阵营,代表刘邦:黑色的"将"阵营,代表项羽.那么,这一红一黑又有什么来历呢? 相传,刘邦带兵攻打 ...

  4. 【字源大挪移—读书笔记】 第一部分:字首

    [1] 字首:[1.1]表示[否定]的字首.[1.2]表示[方位]的字首.[1.3]表示[程度]的字首.[1.4]表示[状态.现象]的字首.[1.5]表示[数字]的字首 [1.1] 表示[否定]的字首 ...

  5. “三驾马车“上演人事大挪移,京东靠什么复刻亚马逊的增长神话?

    发展战略需要与组织架构的调整相匹配,无论何种规模的企业都是如此.大脑若有想法,四肢却无法支持,那战略自然也失去了有效支撑. 年关将至,一批互联网巨头都进行着新一轮的组织架构调整.阿里.美团.滴滴.快手 ...

  6. 爬虫:JS逆向之Webpack-乾坤大挪移

    本教程仅供技术研究参考,勿做它用! 网上看了几个webpack逆向的教程,写的比较跳跃,初学者实操起来会感觉有点跳跃,重新理了一下,方便初学者一步一步验证. 技术门槛:会使用nodejs调试代码,会浏 ...

  7. cpu风扇声音大_笔记本电脑风扇声音大怎么办

    点击蓝字 关注我们 笔记本电脑风扇声音大的几个可能的原因 1. 风机盘管因使用时间过长而老化.缺油. 2. 由于使用不当,中心轴因冲击或振动而弯曲. 3.由于积尘过多或固定螺丝松动,风机位置偏移. 4 ...

  8. thinkpad风扇声音大_笔记本风扇声音很大怎么解决

    笔记本风扇声音很大怎么解决?正常来说,风扇转动的时候是有一些声音的,不过应该不会太大声,声音大就有问题咯! 一.笔记本风扇声音大的原因: 1.使用时间过长,风扇的线圈老化,缺油. 2.由于使用不当,受 ...

  9. 台式计算机风扇声音大怎么处理,如何解决电脑电源风扇声音大的问题?

    现在的台式机一般用3到5年后,一些问题自然也就慢慢表现出来了.很多网友在使用电脑过程中都有电脑风扇声音大怎么办的问题,电脑风扇声音大就会让人觉得使用电脑很不舒服,怎么办好呢?出现重要的问题要如何解决好 ...

最新文章

  1. Android怎么不显示手机模型,以编程方式获取Android手机模型
  2. 基于STC8H1K28的BH60的角度读写模块
  3. 数据分析小白入门指南
  4. visual studio code安装shadertoy特效环境
  5. 为什么有很多人认为“深圳是举全国之力发展起来的?
  6. 程序员啊程序员...济南昊锐科技
  7. c语言 文件加密头文件,[C语言]文件加密
  8. 前端成功调用后端接口,返回值却报404
  9. [Linux网络编程学习笔记]索引
  10. 国内开源的一款超好用 Redis 可视化工具,高颜值 UI,真香!!
  11. 如何创建强命名程序集
  12. 【JZOJ 省选模拟】6638.Seat
  13. Android Fragment already added 解决方式
  14. 电脑同时开有线和无线,优先使用哪个?
  15. 双11之后,国际、大型、创业、传统、搜索等电商架构首次深度较量
  16. 实验 详解K8S多节点部署群集
  17. 【概率论与数理统计】期末复习抱佛脚:公式总结与简单例题(完结)
  18. 基于Flask的web微信
  19. php+分针和时针重合,时针、分针和秒针重合问题
  20. win10 wsl 调用ST-LINK_CLI.exe 遇到的问题总结

热门文章

  1. jquery实现app开发闹钟功能_APP商城开发的优势与功能
  2. 红米手机使用应用沙盒一键修改imsi信息
  3. python如何调用cpp文件的接口函数_C++中嵌入Python调用
  4. 变量作用域与预处理命令习题
  5. 【c语言】蓝桥杯算法训练 整除问题
  6. webpack4.x配置
  7. 26.angularJS $routeProvider
  8. golang reflect
  9. fastReport 随记
  10. 维护窗口和停机时间 可用率99.99%