Запустите файл кода преобразования звука Python ffmpeg из subprocess.call () на сервере фляги - PullRequest
0 голосов
/ 11 ноября 2019

Я собрал небольшой колб-сервер для обработки запроса. У меня есть 3 параметра в API-функции, которые я хочу получить. это type, user_id, audio_file, один файл. Так как он используется для преобразования аудио файлов. Я должен получить файл .. Я проверил это в аудиофайле Postman, но сохранить файл subprocess.call (команда) в функции api не работает ..

это код сервера фляги

@app.route('/voice', methods=['GET','POST'])
def process_audio():
 try:
    if request.method == 'POST':
        input_type = request.form['type']
        user_id = request.form['user_id']
        static_file = request.files['audio_file']
        audio_name = secure_filename(static_file.filename)
        path = 't/'
        status = static_file.save(path + audio_name)
        full_file = path + audio_name
        if input_type == 1:
            cmd = "python t/convert_english.py --audio " + full_file
            res = subprocess.call([cmd],shell=True)
            f = open('t/ress.txt', 'w')
            f.write(str(res))
            f.close()
            return "true"
        else:
            cmd = "python t/convert_sinhala.py --audio " + full_file
            os.system(cmd)
            return "true"
    else:
        return "false"

except Exception as e:
    print(e)
    logger.error(e)
    return e

Аудиофайл сохраняется в каталоге, как и ожидалось ..

это convert_english.py

import subprocess
import argparse
import os
import logging
import speech_recognition as sr
from tqdm import tqdm
from multiprocessing.dummy import Pool

#subprocess.call('pip install pydub',shell=True)

from os import path
from pydub import AudioSegment

logging.basicConfig(filename='/var/www/img-p/t/ee.log', level=logging.DEBUG, 
                    format='%(asctime)s %(levelname)s %(name)s %(message)s')
logger=logging.getLogger(__name__)

ap = argparse.ArgumentParser()
ap.add_argument("-a", "--audio", required=True,
    help="path to input audio file")
args = vars(ap.parse_args())

src = args["audio"]
dst = "audio.wav"

sound = AudioSegment.from_mp3(src)
sound.export(dst, format="wav")

#subprocess.call('pip install ffmpeg-python',shell=True)

subprocess.call('mkdir parts',shell=True)

subprocess.call('ffmpeg -i audio.wav -f segment -segment_time 30 -c copy parts/out%09d.wav',shell=True)

#subprocess.call('pip install SpeechRecognition',shell=True)


pool = Pool(8) # Number of concurrent threads

with open("api-key.json") as f:
    GOOGLE_CLOUD_SPEECH_CREDENTIALS = f.read()

r = sr.Recognizer()
files = sorted(os.listdir('parts/'))

def transcribe(data):
    idx, file = data
    name = "parts/" + file
    print(name + " started")
    # Load audio file
    with sr.AudioFile(name) as source:
        audio = r.record(source)
    # Transcribe audio file
    text = r.recognize_google_cloud(audio, credentials_json=GOOGLE_CLOUD_SPEECH_CREDENTIALS)
    print(name + " done")
    return {
        "idx": idx,
        "text": text
    }

all_text = pool.map(transcribe, enumerate(files))
pool.close()
pool.join()

transcript = ""
for t in sorted(all_text, key=lambda x: x['idx']):
    total_seconds = t['idx'] * 30
    # Cool shortcut from:
    # /439808/kak-ya-mogu-preobrazovat-sekundy-v-chasy-minuty-i-sekundy
    # to get hours, minutes and seconds
    m, s = divmod(total_seconds, 60)
    h, m = divmod(m, 60)

    # Format time as h:m:s - 30 seconds of text
    transcript = transcript + "{:0>2d}:{:0>2d}:{:0>2d} {}\n".format(h, m, s, t['text'])

print(transcript)

with open("transcript.txt", "w") as f:
    f.write(transcript)

f = open("transcript.txt")
lines = f.readlines()
f.close()
f = open("transcript.txt", "w", encoding="utf-8")
for line in lines:
    f.write(line[8:])
f.close()

Дело в том, что код выше работаеткогда я вручную запускаю команду -> python t / convert_english.py --audio t / tttttttttt.mp3, как это в терминале ..

Но когда я пытаюсь запустить с самого сервера фляги этоне работает .. И я тоже не получаю ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...