38 lines
1.8 KiB
Python
38 lines
1.8 KiB
Python
"""Offline CPU inference with fixed models; WAV input only, no model code downloads."""
|
|
import os, sys, json, contextlib
|
|
from pathlib import Path
|
|
for key in ('OMP_NUM_THREADS','OPENBLAS_NUM_THREADS','MKL_NUM_THREADS','NUMBA_NUM_THREADS'):
|
|
os.environ[key]='2'
|
|
os.environ['HF_HUB_OFFLINE']='1'
|
|
os.environ['TRANSFORMERS_OFFLINE']='1'
|
|
from analyze import capabilities, analyze
|
|
from separate import separate
|
|
|
|
def run(operation, source, destination):
|
|
import soundfile as sf
|
|
import numpy as np
|
|
meta=sf.info(source)
|
|
if meta.format not in ('WAV','WAVEX') or not 0<meta.duration<=180 or meta.channels not in (1,2) or meta.samplerate not in (16000,22050,44100,48000):
|
|
raise ValueError('仅接受 180 秒内、1/2 声道的 PCM WAV 音频')
|
|
if meta.subtype not in ('PCM_16','PCM_24','PCM_32','FLOAT'):
|
|
raise ValueError('音频编码不支持')
|
|
root=Path(destination)
|
|
result={'durationSeconds':meta.duration}
|
|
if operation=='separate':
|
|
separate(source,destination)
|
|
import hashlib
|
|
result['stems']={}
|
|
for stem in ['vocals','background']:
|
|
f=root/(stem+'.wav')
|
|
result['stems'][stem]={'bytes':f.stat().st_size,'sha256':hashlib.sha256(f.read_bytes()).hexdigest()}
|
|
elif operation=='transcribe':
|
|
result['subtitles']=analyze({'audio':source,'transcribe':True})['subtitles']
|
|
if len(result['subtitles'])>500: raise ValueError('字幕数量超过 500 条')
|
|
else: raise ValueError('未知音频操作')
|
|
(root/'result.json').write_text(json.dumps(result,ensure_ascii=False))
|
|
if __name__=='__main__':
|
|
if sys.argv[1:]==['--check']:
|
|
c=capabilities(); print(json.dumps({'asr':c['asr'],'separation':c['separation']}))
|
|
else:
|
|
with contextlib.redirect_stdout(sys.stderr):run(*sys.argv[1:4])
|