Skip to main content

convertToCaptions()v4.0.131

warning

此 API 假定 Whisper.cpp 的版本比稳定版本更新,以支持 tokenLevelTimestamps。不过,这个版本可能会意外崩溃。 如果您更喜欢使用稳定版本的 Whisper.cpp 并放弃 tokenLevelTimeStamps 支持,请使用旧版本的 Whisper.cpp(1.0.54 或更早版本)。

主观化函数,将 transcribe() 的输出转换为易于理解的字幕。
还可以将时间戳接近的单词组合在一起。
适用于 TikTok/Reel 类型的视频,逐字逐句地显示字幕。

transcribe.mjs
tsx
import path from "path";
import { transcribe, convertToCaptions } from "@remotion/install-whisper-cpp";
 
const { transcription } = await transcribe({
inputPath: "/path/to/audio.wav",
whisperPath: path.join(process.cwd(), "whisper.cpp"),
model: "medium.en",
tokenLevelTimestamps: true,
});
 
const { captions } = convertToCaptions({
transcription,
combineTokensWithinMilliseconds: 200,
});
 
for (const line of captions) {
console.log(line.text, line.startInSeconds);
}
transcribe.mjs
tsx
import path from "path";
import { transcribe, convertToCaptions } from "@remotion/install-whisper-cpp";
 
const { transcription } = await transcribe({
inputPath: "/path/to/audio.wav",
whisperPath: path.join(process.cwd(), "whisper.cpp"),
model: "medium.en",
tokenLevelTimestamps: true,
});
 
const { captions } = convertToCaptions({
transcription,
combineTokensWithinMilliseconds: 200,
});
 
for (const line of captions) {
console.log(line.text, line.startInSeconds);
}

选项

transcription

transcribe() 检索到的 transcription 对象。
必须将 tokenLevelTimestamps 选项设置为 true

combineTokensWithinMilliseconds

将接近的单词组合在一起。
如果不组合单词,如果正在使用逐字逐句的字幕,它们可能会显示很短的时间。
通过设置 0 来禁用组合。
建议值:200

返回值

以下形状的对象对象:

ts
type Caption = {
text: string;
startInSeconds: number;
};
 
type ReturnValue = {
captions: Caption[];
};
ts
type Caption = {
text: string;
startInSeconds: number;
};
 
type ReturnValue = {
captions: Caption[];
};

建议用法

这显示了如何在 Remotion 项目中呈现由 convertToCaptions() 生成的数据结构的逐字逐句字幕。
查看我们的 TikTok 模板 以获取完整的参考实现。

note

@remotion/install-whisper-cpp 无法在前端导入,它是一个 Node.js API。
此示例中仅导入 TypeScript 类型。

tsx
import type { Caption } from "@remotion/install-whisper-cpp";
import { Sequence, useVideoConfig } from "remotion";
 
const Captions: React.FC<{
subtitles: Caption[];
}> = ({ subtitles }) => {
const { fps } = useVideoConfig();
 
return (
<>
{subtitles.map((subtitle, index) => {
const nextSubtitle = subtitles[index + 1] ?? null;
const subtitleStartFrame = subtitle.startInSeconds * fps;
const subtitleEndFrame = Math.min(
nextSubtitle ? nextSubtitle.startInSeconds * fps : Infinity,
subtitleStartFrame + fps,
);
 
return (
<Sequence
from={subtitleStartFrame}
durationInFrames={subtitleEndFrame - subtitleStartFrame}
>
<Subtitle key={index} text={subtitle.text} />;
</Sequence>
);
})}
</>
);
};
tsx
import type { Caption } from "@remotion/install-whisper-cpp";
import { Sequence, useVideoConfig } from "remotion";
 
const Captions: React.FC<{
subtitles: Caption[];
}> = ({ subtitles }) => {
const { fps } = useVideoConfig();
 
return (
<>
{subtitles.map((subtitle, index) => {
const nextSubtitle = subtitles[index + 1] ?? null;
const subtitleStartFrame = subtitle.startInSeconds * fps;
const subtitleEndFrame = Math.min(
nextSubtitle ? nextSubtitle.startInSeconds * fps : Infinity,
subtitleStartFrame + fps,
);
 
return (
<Sequence
from={subtitleStartFrame}
durationInFrames={subtitleEndFrame - subtitleStartFrame}
>
<Subtitle key={index} text={subtitle.text} />;
</Sequence>
);
})}
</>
);
};

另请参阅

Please paste the Markdown content you would like me to translate into Chinese.