21小时上手深度学习3-Neural Song

Neural Style Audio

源码python文件解析

import tensorflowas tf

import librosa

import os

from IPython.displayimport Audio, display

import numpyas np

import matplotlib.pyplotas plt



#load style and content

CONTENT_FILENAME="inputs/imperials.mp3"

STYLE_FILENAME="inputs/usa.mp3"

display(Audio(CONTENT_FILENAME))

display(Audio(STYLE_FILENAME))


#Read wav file and produces spectrum

# Fourier Phases are ignored

n_fft=2048

# 构造一个函数 读音频频谱。用到了librosa库里的load和stft. stft是短时傅里叶变换。姑且看做一种构造频谱的方式

#吧。 fs是采样频率

def read_audio_spectum(filename):

     x,fs=librosa.load(filename)

     s=librosa.stft(x,n_fft)

     p=np.angle(S)

     S=np.log1p(np.abs(S[:,:430])) 

      return S,fs


#用之前那个函数读出来content和style的频谱再reshape一下。保证content和#style的频谱矩阵大小一样,这样方便做计算。这里是以content的频谱为基准。#也可以自己定义

a_content, fs=read_audio_spectum(CONTENT_FILENAME)

a_style, fs=read_audio_spectum(STYLE_FILENAME)

N_SAMPLES=a_content.shape[1]

N_CHANNELS=a_content.shape[0]

a_style=a_style[:N_CHANNELS, :N_SAMPLES]

# reshape a_style. to be like a_content



####### Visualize spectrograms for content and style tracks

#这里用的是plt这个包。 figure是图像,subplot是说两个图像一起显示了。

#另外还有imshow和title

plt.figure(fig size=(10,5))

plt.subplot(1,2,1)

plt.title('Content')

plt.imshow(a_content[:400,:])

plt.subplot(1,2,2)

plt.title('Style')

plt.imshow(a_style[:400,:])

plt.show()



########## Compute content and style feats##

# 这一步里面的卷积是用来抽取特征的,跟计算y无关。不属于人工智能机器学习哦

N_FILTERS =4096

#现在把a_content和a_style都变成tensor flow的输入。这里用到了

#np的ascontiguousarray 就是给转换成连续数组。 后面括号里是定义了数据类

a_content_tf = np.ascontiguousarray(a_content.T[None,None,:,:])

a_style_tf = np.ascontiguousarray(a_style.T[None,None,:,:])


# filter shape is"[filter_height, filter_width, in_channels, out_channels)

#这里构造了filter 也就是卷积核 。先定义了filter的形状。 std是标准差。其实# # 我不知道为什么要这么算

# 可能是用一些噪声单元增加随机性,让生成的图像更加连贯? 这个教学视频里面说过

std=np.sqrt(2)*np.sqrt(2.0 / ((N_CHANNELS + N_FILTERS) *11))

kernel = np.random.randn(1, 11, N_CHANNELS, N_FILTERS)*std


#现在开始编译运行tensor flow了 with后面描述了一些条件

g = tf.Graph()

with g.as_default(), g.device('/cpu:0'), tf.Session()as sess:

    x = tf.placeholder('float32', [1,1,N_SAMPLES,N_CHANNELS], name="x")

    kernel_tf = tf.constant(kernel, name="kernel", dtype='float32')

    conv = tf.nn.conv2d(

        x,

        kernel_tf,

        strides=[1, 1, 1, 1],

        padding="VALID",

        name="conv")

    # data shape is "[batch, in_height, in_width, in_channels]",

   #这里tensor flow的placeholder 注意和后面的variable的区别。

   #跟两次用到卷积神经网络的时候 CNN的作用不同有关

   #数据形状是, 批次batch是1, 高度是1,宽度是N_SAMPLES, 通道数是 N_CHANNELS

     net = tf.nn.relu(conv)

     content_features = net.eval(feed_dict={x: a_content_tf})

     style_features = net.eval(feed_dict={x: a_style_tf})

     features = np.reshape(style_features, (-1, N_FILTERS))

     style_gram = np.matmul(features.T, features) / N_SAMPLES



# 训练开始 

from sys import stderr

ALPHA =1e-2

learning_rate =1e-3

iterations =100

result =None

with tf.Graph().as_default():

     # Build graph with variable input

     # x = tf.Variable(np.zeros([1,1,N_SAMPLES,N_CHANNELS], dtype=np.float32), name="x")

     # 这里用的是variable而不是placeholder 因为这里x是我们要训练的东西哦。

     # 从初始值白噪声开始 一步一步近似 到生成最后结果

     x = tf.Variable(np.random.randn(1, 1, N_SAMPLES, N_CHANNELS).astype(np.float32)*1e-3, name="x")

     kernel_tf = tf.constant(kernel, name="kernel", dtype='float32')

     conv = tf.nn.conv2d(

        x,

        kernel_tf,

        strides=[1, 1, 1, 1],

        padding="VALID",

        name="conv")

# 第一个参数x 是卷积的输入图像, 它的要求是一个tensor, 具有[batch, in_height, in_width, in_channels]这样的shape

# 具体含义是训练时候一个batch的图片数量,图片高度,图片宽度,图像通道数

# 4维度tensor. 要求类型为float32和 float64之一

# 第二个参数filter: 相当于CNN中的卷积核, 要求也是一个tensor, 具有[filter_height, filter_width, in_channels, out_channels]

# 这样的shape 具体含义是 [卷积核的高度, 卷积核的宽度,图像通道数,卷积核个数]

# 要求类型与input相同 第三维是input的第四维

# 第三个参数 strides: 卷积时在图像的每一维的步长, 是一个一维向量,长度4

# 第四个参数 padding: string类型的量, 只能是"SAME" "VALID"其中之一

# 这个值决定了不同的卷积方式

# 第五个参数: use_cudnn_on——GPU bool类型. 是否使用cudnn加速, 默认为true

     net = tf.nn.relu(conv)

     content_loss = ALPHA *2 * tf.nn.l2_loss(net - content_features)

     style_loss =0

     #  内容损失函数设置完毕

     _, height, width, number =map(lambda i: i.value, net.get_shape())

     size = height * width * number

     feats = tf.reshape(net, (-1, number))

     gram = tf.matmul(tf.transpose(feats), feats) / N_SAMPLES

     style_loss =2 * tf.nn.l2_loss(gram - style_gram)

     # 风格损失函数设置完毕

     # Overall loss

     loss = content_loss + style_loss

     opt = tf.contrib.opt.ScipyOptimizerInterface(loss, method='L-BFGS-B', options={'maxiter':300})

     # tf.contrib的文档值得一看.里面有很多东西.这里只是用到了一些优化routine

     # Optimization

     with tf.Session()as sess:

        sess.run(tf.initialize_all_variables())

        print('Started optimization.')

        opt.minimize(sess)

        print('Final loss:', loss.eval())

        result = x.eval()



# Invert spectrogram and save results

a = np.zeros_like(a_content)

a[:N_CHANNELS, :] = np.exp(result[0, 0].T) -1

# This code is supposed to do phase reconstruction

p =2 * np.pi * np.random.random_sample(a.shape) - np.pi

for i in range(500):

     S = a * np.exp(1j*p)

     x = librosa.istft(S) 

     p = np.angle(librosa.stft(x, n_fft_))

OUTPUT_FILENAME ='outputs/out.wav'

librosa.output.write_wav(OUTPUT_FILENAME, x, fs)

print(OUTPUT_FILENAME)

display(Audio(OUTPUT_FILENAME))



# Visualize spectrograms

plt.figure(figsize=(15, 5))

plt.subplot(1, 3, 1)

plt.title('Content')

plt.imshow(a_content[:400, :])

plt.subplot(1, 3, 2)

plt.title('Style')

plt.imshow(a_style[:400, :])

plt.subplot(1, 3, 3)

plt.title('Result')

plt.imshow(a[:400, :])

plt.show()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342