【发布时间】:2022-11-23 09:08:06
【问题描述】:
我正在尝试使用 Node JS 在单击按钮时运行 python 文件(实际上运行的是深度学习模型)。我正在尝试使用 html 中的输入表单和 index.js 文件中的路由来实现此目的。但这在运行一段时间后导致了这个错误:
我只想在后台运行 python 文件,没有参数,没有输入或输出。
这是我的 index.html 文件:
<form action="/runpython" method="POST">
<button type="submit">Run python</button>
</form>
这是我的 index.js 文件:
function callName(req, res) {
var spawn = require("child_process").spawn;
var process = spawn("python", ["denoising.py"]);
process.stdout.on("data", function (data) {
res.send(data.toString());
});
}
app.post("/runpython", callName);
注意:如果我的 .py 文件中有简单的打印语句,这就可以正常工作
print("Hello World!")
但是在 .py 文件中运行下面的代码会产生问题
"""# import modules"""
"""# loading previously trained model"""
import noisereduce as nr
import numpy as np
import librosa
import librosa.display
import IPython.display as ipd
import matplotlib.pyplot as plt
from keras.models import load_model
import soundfile as sf
model = load_model(
r'model/denoiser_batchsize_5_epoch_100_sample_2000_org_n_n.hdf5', compile=True)
"""# testing on real world audio
"""
# function of moving point average used for minimizing distortion in denoised audio.
def moving_average(x, w):
return np.convolve(x, np.ones(w), 'valid') / w
# audio , sr = librosa.load(r'real_world_data/noise speech.wav' , res_type='kaiser_fast')
audio, sr = librosa.load(r'real_world_data/winona.wav', res_type='kaiser_fast')
# audio, sr = librosa.load(r'real_world_data/babar.wav', res_type='kaiser_fast')
# audio, sr = librosa.load(r'real_world_data/sarfaraz_eng.wav', res_type='kaiser_fast')
print(audio)
print(len(audio))
ipd.Audio(data=audio, rate=22050)
real_audio_spec = np.abs(librosa.stft(audio))
fig, ax = plt.subplots()
img = librosa.display.specshow(librosa.amplitude_to_db(
real_audio_spec, ref=np.max), y_axis='log', x_axis='time', ax=ax)
ax.set_title('Power spectrogram input real audio ')
fig.colorbar(img, ax=ax, format="%+2.0f dB")
ipd.Audio(data=audio, rate=22050)
start = 0
end = 65536
print(len(audio))
print(len(audio)/22050)
split_range = int(len(audio) / 65536)
print(split_range)
predicted_noise = []
input_audio = []
for i in range(split_range):
audio_frame = audio[start:end]
input_audio.append(audio_frame)
audio_reshape = np.reshape(audio_frame, (1, 256, 256, 1))
prediction = model.predict(audio_reshape)
prediction = prediction.flatten()
predicted_noise.append([prediction])
start = start + 65536
end = end + 65536
predicted_noise = np.asarray(predicted_noise).flatten()
input_audio = np.asarray(input_audio).flatten()
real_pred_noise_spec = np.abs(librosa.stft(predicted_noise))
"""## input audio to model"""
ipd.Audio(data=input_audio, rate=22050)
sf.write('input_audio.wav', input_audio.astype(np.float32), 22050, 'PCM_16')
fig, ax = plt.subplots()
img = librosa.display.specshow(librosa.amplitude_to_db(
real_pred_noise_spec, ref=np.max), y_axis='log', x_axis='time', ax=ax)
ax.set_title('Power spectrogram pred noise of real audio ')
fig.colorbar(img, ax=ax, format="%+2.0f dB")
ipd.Audio(data=predicted_noise, rate=22050)
sf.write('predicted_noise.wav', predicted_noise.astype(
np.float32), 22050, 'PCM_16')
ipd.Audio(data=moving_average(predicted_noise, 8), rate=22050)
denoised_final_audio = input_audio - predicted_noise
real_denoised_audio_spec = np.abs(librosa.stft(denoised_final_audio))
fig, ax = plt.subplots()
img = librosa.display.specshow(librosa.amplitude_to_db(
real_denoised_audio_spec, ref=np.max), y_axis='log', x_axis='time', ax=ax)
ax.set_title('Power spectrogram final denoised real audio ')
fig.colorbar(img, ax=ax, format="%+2.0f dB")
ipd.Audio(data=denoised_final_audio, rate=22050)
sf.write('denoised_final_audio_by_model.wav',
denoised_final_audio.astype(np.float32), 22050, 'PCM_16')
"""## moving point average of the real world denoised signal"""
real_world_mov_avg = moving_average(denoised_final_audio, 4)
print(real_world_mov_avg)
print(len(real_world_mov_avg))
ipd.Audio(data=real_world_mov_avg, rate=22050)
"""## noise reduce library"""
# !pip install noisereduce
"""### nr on real world audio"""
# if you cant import it. than you need to install it using 'pip install noisereduce'
"""#### using noise reduce directly on the real world audio to see how it works on it. """
reduced_noise_direct = nr.reduce_noise(
y=audio.flatten(), sr=22050, stationary=False)
ipd.Audio(data=reduced_noise_direct, rate=22050)
sf.write('denoised_input_audio_direct_by_noisereduce_no_model.wav',
reduced_noise_direct.astype(np.float32), 22050, 'PCM_16')
"""#### using noise reduce on model denoised final output. to make it more clean."""
# perform noise reduction
reduced_noise = nr.reduce_noise(y=real_world_mov_avg.flatten(
), sr=22050, y_noise=predicted_noise, stationary=False)
# wavfile.write("mywav_reduced_noise.wav", rate, reduced_noise)
ipd.Audio(data=reduced_noise, rate=22050)
sf.write('denoised_final_audio_by_model_than_noisereduce_applied.wav',
reduced_noise.astype(np.float32), 22050, 'PCM_16')
print("python code executed")
如果有其他选择,请告诉我。我是 Node JS 的新手,这是我发现的唯一可行的方法
【问题讨论】:
-
process.stdout.on("data")可能会触发多次。但是每次触发时您都在调用res.send,这也会多次发送响应标头。那是不允许的。等到您的过程完成并同时收集数据。该过程结束后,一次性发送所有数据。 -
@derpirscher 理解,但不是在实施层面。你能告诉我我应该做哪些改变吗?我从 2 天起就被困在这部分。
标签: javascript python node.js python-3.x express