Spaces:
Running
on
Zero
Running
on
Zero
File size: 4,478 Bytes
bef66de 4d2d3bd f4fa6cb bef66de f4fa6cb d01f68f ab55ccc bef66de 4d2d3bd bef66de eefa888 7a1d956 4d2d3bd bef66de 0b6b418 bef66de eefa888 bef66de ab55ccc d01f68f 2abc41d 5f43bee d01f68f ab55ccc bef66de d01f68f 5c91bae 4d2d3bd 5c91bae 5331478 f4fa6cb 3f63243 e8dc53b bef66de f4fa6cb d4d32c6 bef66de 4d2d3bd 5c91bae bef66de f4fa6cb bef66de 5331478 5c91bae bef66de 0b6b418 5c91bae 0b6b418 bef66de 5c91bae eefa888 2abc41d ab55ccc bef66de eefa888 bef66de e8dc53b 0d7f0d9 4d2d3bd 0b6b418 409084a 0b6b418 409084a eefa888 d50db7b 7a1d956 409084a bef66de 409084a bef66de d01f68f eefa888 d01f68f d50db7b bef66de a1694cd d01f68f bef66de d01f68f bef66de eefa888 5c91bae 0b6b418 bef66de 2abc41d bef66de |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
import os
import time
import warnings
from pathlib import Path
import gradio as gr
import librosa
import spaces
import torch
from loguru import logger
from transformers import pipeline
warnings.filterwarnings("ignore")
is_hf = os.getenv("SYSTEM") == "spaces"
generate_kwargs = {
"language": "Japanese",
"do_sample": False,
"num_beams": 1,
"no_repeat_ngram_size": 5,
"max_new_tokens": 64,
}
model_dict = {
"whisper-large-v3-turbo": "openai/whisper-large-v3-turbo",
"kotoba-whisper-v2.0": "kotoba-tech/kotoba-whisper-v2.0",
"anime-whisper": "litagin/anime-whisper",
}
logger.info("Initializing pipelines...")
pipe_dict = {
k: pipeline(
"automatic-speech-recognition",
model=v,
device="cuda" if torch.cuda.is_available() else "cpu",
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
)
for k, v in model_dict.items()
}
logger.success("Pipelines initialized!")
@spaces.GPU
def transcribe_common(audio: str, model: str) -> str:
if not audio:
return "No audio file"
filename = Path(audio).name
logger.info(f"Model: {model}")
logger.info(f"Audio: {filename}")
# Read and resample audio to 16kHz
try:
y, sr = librosa.load(audio, mono=True, sr=16000)
except Exception as e:
# First convert to wav if librosa cannot read the file
logger.error(f"Error reading file: {e}")
from pydub import AudioSegment
audio = AudioSegment.from_file(audio)
audio.export("temp.wav", format="wav")
y, sr = librosa.load("temp.wav", mono=True, sr=16000)
Path("temp.wav").unlink()
# Get duration of audio
duration = librosa.get_duration(y=y, sr=sr)
logger.info(f"Duration: {duration:.2f}s")
if duration > 15:
logger.error(f"Audio too long, limit is 15 seconds, got {duration:.2f}s")
return f"Audio too long, limit is 15 seconds, got {duration:.2f}s"
start_time = time.time()
result = pipe_dict[model](y, generate_kwargs=generate_kwargs)["text"]
end_time = time.time()
logger.success(f"Finished in {end_time - start_time:.2f}s\n{result}")
return result
def transcribe_others(audio) -> tuple[str, str]:
result_v3 = transcribe_common(audio, "whisper-large-v3-turbo")
result_kotoba_v2 = transcribe_common(audio, "kotoba-whisper-v2.0")
return result_v3, result_kotoba_v2
def transcribe_anime_whisper(audio) -> str:
return transcribe_common(audio, "anime-whisper")
initial_md = """
# Anime-Whisper Demo
[**Anime Whisper**](https://huggingface.co/litagin/anime-whisper): 5千時間以上のアニメ調セリフと台本でファインチューニングされた日本語音声認識モデルのデモです。句読点や感嘆符がリズムや感情に合わせて自然に付き、NSFW含む非言語発話もうまく台本調に書き起こされます。
- デモでは**音声は15秒まで**しか受け付けません
- 日本語のみ対応 (Japanese only)
- 比較のために [openai/whisper-large-v3-turbo](https://huggingface.co/openai/whisper-large-v3-turbo) と [kotoba-tech/kotoba-whisper-v2.0](https://huggingface.co/kotoba-tech/kotoba-whisper-v2.0) も用意しています
pipeに渡しているkwargsは以下:
```python
generate_kwargs = {
"language": "Japanese",
"do_sample": False,
"num_beams": 1,
"no_repeat_ngram_size": 5,
"max_new_tokens": 64, # 結果が長いときは途中で打ち切られる
}
```
"""
with gr.Blocks() as app:
gr.Markdown(initial_md)
audio = gr.Audio(type="filepath")
with gr.Row():
with gr.Column():
gr.Markdown("### Anime-Whisper")
button_galgame = gr.Button("Transcribe with Anime-Whisper")
output_galgame = gr.Textbox(label="Result")
gr.Markdown("### Comparison")
button_others = gr.Button("Transcribe with other models")
with gr.Row():
with gr.Column():
gr.Markdown("### Whisper-Large-V3-Turbo")
output_v3 = gr.Textbox(label="Result")
with gr.Column():
gr.Markdown("### Kotoba-Whisper-V2.0")
output_kotoba_v2 = gr.Textbox(label="Result")
button_galgame.click(
transcribe_anime_whisper,
inputs=[audio],
outputs=[output_galgame],
)
button_others.click(
transcribe_others,
inputs=[audio],
outputs=[output_v3, output_kotoba_v2],
)
app.launch(inbrowser=True)
|