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])