抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
Original: https://blog.csdn.net/qq_36686437/article/details/123216213
Author: 点云侠
Title: matlab svd奇异值分解
相关阅读1
Title: Android如何播放一组音频文件(类似支付宝收款播报或者叫号播报)
最近项目有个需求,一个app需要能够播报金额,另一个需要播报叫号,因为金额和排队号是可变的,所以需要播放的音频是不固定的。方案有如下几种:
1、集成百度TTS,通过离在线的sdk接口进行播报;
2、录制表示数字,金额,小数点,英文字母的单个字符,然后先将所需的音频合成为一个音频,再播报,或者直接顺序播报一组音频;
具体实现:
由于本人在别的项目中使用过百度TTS语音播报,这种离在线系统的机制在网络不稳定时,可能出现不播报的情况,而本项目app很可能在一些网络环境较差的情况下使用,所以选择第二种实现方案。
需要使用的库
//exoplayer
implementation 'com.google.android.exoplayer:exoplayer:2.8.1'
implementation 'com.google.android.exoplayer:exoplayer-core:2.8.1'
具体播报方法如下:
先根据金额或者排队序号得到一组音频文件,然后使用下面方法即可正常播报。
音频文件放在app/assets目录下
public void playAudios(Context context, List<string> fileNames){
if (fileNames == null){
return;
}
if (player == null){
player = ExoPlayerFactory.newSimpleInstance(context, new DefaultTrackSelector());
//第一个参数是播放速度,第二个参数是播放音调的高低
player.setPlaybackParameters(new PlaybackParameters(0.8f, 1.0f));
}
// userAgent -> audio/mpeg 不能为空
DefaultDataSourceFactory defaultDataSourceFactory = new DefaultDataSourceFactory(context, "audio/mpeg");
//创建一个媒体连接源
ConcatenatingMediaSource concatenatingMediaSource = new ConcatenatingMediaSource();
for (int i=0;i<filenames.size();i++){ string filename="fileNames.get(i);" log.e(tag, "playaudios filename: " + filename); 创建一个播放数据源 mediasource extractormediasource.factory(defaultdatasourcefactory).createmediasource(uri.parse("file: android_asset filename)); concatenatingmediasource.addmediasource(mediasource); } player.setplaywhenready(true); player.prepare(concatenatingmediasource); }< code></filenames.size();i++){></string>
如果在Activity直接调用该方法,可能出现未播报完,页面中止的情况,导致音频播报不完全,所以可以定义一个Service,然后在Service中开启一个线程播报,这样即使当前页面中止了,音频也可以正常完成播报。
/**
* 进行语音播报操作(支付的语音播报)
* @param numFileNames
*/
private void playAudio(ArrayList<string> numFileNames){
Log.e(TAG, "playAudio execute");
new Thread(){
@Override
public void run() {
List<string> fileNames2 = new ArrayList<>();
fileNames2.add("xxx.mp3");
player.playAudios(mContext, fileNames2);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (numFileNames != null){
List<string> fileNames = new ArrayList<>();
fileNames.addAll(numFileNames);
player.playAudios(mContext, fileNames);
numFileNames.clear();
}
}
}.start();
}</string></string></string>
具体使用时需要注意以下几点:
1、Service需要在AndroidManifest.xml当中进行配置
2、每次调用playAudios方法时,传入的一组音频文件格式需要相同,因为默认是根据一组音频的第一个音频格式去解析后面的所有音频文件格式,如果这种音频格式不同,可能导致跟第一个音频不同格式的音频文件不能被正常解析,也不能正常播报。
具体代码,可以去我的资源里面下载相关类。
Original: https://blog.csdn.net/chali1314/article/details/122918769
Author: 晒干的老咸鱼
Title: Android如何播放一组音频文件(类似支付宝收款播报或者叫号播报)
相关阅读2
Title: tf.nn.dynamic_rnn和tf.nn.static_rnn
为什么会有tf.nn.dynamic_rnn和tf.nn.static_rnn,首先理解time_step是干什么的。
1. 首先理解time_step
举例说明:
- 文字数据
如果数据有1000段时序的句子,每句话有25个字,对每个字进行向量化,每个字的向量维度为300,那么batch_size=1000
,time_steps=25
,input_size=300
。
解析:time_steps一般情况下就是等于句子的长度,input_size等于字量化后向量的长度。 - 图片数据
拿MNIST手写数字集来说,训练数据有6000个手写数字图像,每个数字图像大小为28*28,batch_size=6000
,time_steps=28
,input_size=28
,我们可以理解为把图片图片分成28份,每份shape=(1, 28)。
2. 解释为什么出现dynamic_rnn和static_rnn
在tensorflow中,可以通过 tf.nn.rnn_cell.BasicLSTMCell
构建LSTM,最常使用的参数是 num_units
,表示的是LSTM中隐含状态的维度。
lstm_cell=tf.nn.rnn_cell.BasicLSTMCell(num_units=hidden_size)
LSTM的输入不仅有数据输入,还有前一个时刻的状态输入,因此需要初始化输入状态。
initial_state=lstm_cell.zero_state(batch_size,dtype=tf.float32)
构建多层LSTM,其中hidden_layer_num为LSTM的层数
cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell]*hidden_layer_num)
构建LSTM完整代码如下:
import tensorflow as tf
import numpy as np
batch_size=2
hidden_size=64
num_steps=10
input_dim=8
input=np.random.randn(batch_size,num_steps,input_dim)
input[1,6:]=0
x=tf.placeholder(dtype=tf.float32,shape=[batch_size,num_steps,input_dim],name='input_x')
lstm_cell=tf.nn.rnn_cell.BasicLSTMCell(num_units=hidden_size)
initial_state=lstm_cell.zero_state(batch_size,dtype=tf.float32)
outputs=[]
with tf.variable_scope('RNN'):
for i in range(num_steps):
if i > 0 :
tf.get_variable_scope().reuse_variables()
output=lstm_cell(x[:,i,:],initial_state)
outputs.append(output)
从上面可以看出,要想获得num_steps后的output结果,需要for循环进行迭代。此时可以通过dynamic_rnn和static_rnn两个函数进行简化,让他们去做循环的工作。
tf.nn.static_rnn(
cell,
inputs,
initial_state=None,
dtype=None,
sequence_length=None,
scope=None
)
tf.nn.dynamic_rnn(
cell,
inputs,
sequence_length=None,
initial_state=None,
dtype=None,
parallel_iterations=None,
swap_memory=False,
time_major=False,
scope=None
)
总结:基础的RNNCell有一个很明显的问题:对于单个的RNNCell,使用它的call函数进行运算时,只是在序列时间上前进了一个step。比如使用x1、h0得到h1,通过x2、h1得到h2等。这样的话,如果序列长度为10,就要调用10次call函数,比较麻烦。对此,TensorFlow提供了一个tf.nn.dynamic_rnn和tf.nn.static_rnn函数,使用该函数就相当于调用了n次call函数。即通过{h0,x1, x2, ...., xn}直接得{h1,h2...,hn}。
3. dynamic_rnn和static_rnn对比
dynamic_rnnstatic_rnninput shape【batch_size,time_step(序列长度),input-dim】【time_steps,batch_size,input_dim】output shape【batch_size,n_steps,n_hidden】【n_steps,batch_size,n_hiddentime_step是否可以不同可以不可以
其中,需要注意
cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden_units,forget_bias=1.0,state_is_tuple=True)
init_state = cell.zero_state(batch_size,dtype=tf.float32)
outputs,final_state = tf.nn.dynamic_rnn(cell,X_in,initial_state=init_state,time_major=False)
outputs = tf.transpose(outputs,[1,0,2])
last_output = outputs[-1]
'''还有一种方法,可以转换为list(忽略其中的加入输入层部分)
_X = tf.transpose(_X, [1, 0, 2]) # permute n_steps and batch_size
_X = tf.reshape(_X, [-1, n_inputs]) # (n_steps*batch_size, n_input)
_X = tf.matmul(_X, weights['in']) + biases['in']
lstm_cell =tf.nn.rnn_cell.BasicLSTMCell(n_hidden_unis, forget_bias=1.0) _init_state=lstm_cell.zero_state(batch_size,dtype=tf.float32)
_X = tf.split(_X, n_step,0 ) # n_steps * (batch_size, n_hidden) #得到我们对应想要的list
##上方的axis 默认是为0的 所以可写可不写
outputs, states =tf.nn.static_rnn(lstm_cell, _X, initial_state=_init_state)
'''
input=tf.unstack(x ,time_steps,1)
lstm_layer=rnn.BasicLSTMCell(num_units,forget_bias=1)
outputs,_=rnn.static_rnn(lstm_layer,input,dtype="float32")
Original: https://blog.csdn.net/weixin_42555080/article/details/121214607
Author: Blessy_Zhu
Title: tf.nn.dynamic_rnn和tf.nn.static_rnn
相关阅读3
Title: 【编程教室】Python绘制冬奥吉祥物“冰墩墩”
大家好,欢迎来到 Crossin的编程教室 !
这两天,随着北京冬奥会的开幕,吉祥物"冰墩墩"可是火出了圈,多少人排长队都买不到。据说甚至有人把价格炒到了几千元。
就连昨天的"虎虎生威"文章下面,都有同学求冰墩墩
为了帮助大家早日实现"一户一墩",Crossin连夜加班,肝出了这个:
Python版冰墩墩
话不多说,直接上效果
绘制过程:
成图:
说实话,这个没什么技术含量,就是硬"肝",不断调整曲线细节。
用的是 Python 自带的 turtle 库。这个库之前介绍过很多次,就不再啰嗦了,历史文章里搜索"turtle"或"海龟作图"就能看到。
说个用 turtle 画图的小技巧:你可以通过
turtle.bgpic(r'bg.png')
这个语句把你要参考的图先绘制在窗口中,然后再对照着进行绘制调整,就方便许多了。
由于代码比较长,这里贴一小段供参考:
# 爱心
turtle.penup()
turtle.goto(220, 115)
turtle.pencolor("brown")
turtle.pensize(1)
turtle.fillcolor("brown")
turtle.begin_fill()
turtle.pendown()
turtle.setheading(36)
turtle.circle(-8, 180)
turtle.circle(-60, 24)
turtle.setheading(110)
turtle.circle(-60, 24)
turtle.circle(-8, 180)
turtle.end_fill()
# 五环
turtle.penup()
turtle.goto(-5, -170)
turtle.pendown()
turtle.pencolor("blue")
turtle.circle(6)
turtle.penup()
turtle.goto(10, -170)
turtle.pendown()
turtle.pencolor("black")
turtle.circle(6)
turtle.penup()
turtle.goto(25, -170)
turtle.pendown()
turtle.pencolor("brown")
turtle.circle(6)
turtle.penup()
turtle.goto(2, -175)
turtle.pendown()
turtle.pencolor("lightgoldenrod")
turtle.circle(6)
turtle.penup()
turtle.goto(16, -175)
turtle.pendown()
turtle.pencolor("green")
turtle.circle(6)
turtle.penup()
turtle.pencolor("black")
turtle.goto(-16, -160)
turtle.write("BEIJING 2022", font=('Arial', 10, 'bold italic'))
turtle.hideturtle()
turtle.done()
完整代码在github上开源:
https://github.com/crossin/snippet/tree/master/BingDwenDwen
如果对你有帮助,欢迎点赞转发支持一下~
Original: https://www.cnblogs.com/crossin/p/BingDwenDwen.html
Author: Crossin先生
Title: 【编程教室】Python绘制冬奥吉祥物“冰墩墩”