【问题标题】:Running a python file on the button click in Node JS在 Node JS 中单击按钮运行 python 文件
【发布时间】: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


【解决方案1】:

你为什么使用res.send(data.toString());,我在你的代码中没有看到这一行的任何用途。尝试删除提到的代码并再次运行。

【讨论】:

    【解决方案2】:

    检查https://www.npmjs.com/package/pymport,它完全符合您的要求

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 2020-12-07
      相关资源
      最近更新 更多