technology

利用Huggingface的一键模型部署,零门槛生成播客脚本

播客已成为过去几十年中最受欢迎的新闻与娱乐创作传播工具之一。其流行原因众多,包括便捷的访问性、近乎免费的特性以 […]

利用Huggingface的一键模型部署,零门槛生成播客脚本

播客已成为过去几十年中最受欢迎的新闻与娱乐创作传播工具之一。其流行原因众多,包括便捷的访问性、近乎免费的特性以及涵盖主题的多样性。也正因如此,启动新播客成为许多人热衷的创意项目。

新手播客作者面临的最大挑战之一是需要填充大量内容,撰写脚本。尽管播客时长不一,但根据Google Gemini数据,单集平均时长为20至40分钟。因此,许多创作者在完成初始选题后,可能会陷入内容枯竭的困境。

本文将分享一种解决方案:通过在DigitalOcean GPU Droplets云服务器上,运行HuggingFace一键模型部署功能(在 DigitalOcean后台这个功能叫做1-Click Models),辅助播客创作脚本。DigitalOcean的一键模型部署功能是目前能在NVIDIA GPU上部署HuggingFace模型的最快途径,能为内容创作者提供强大支持。请跟随本教程构建适用于任意主题的播客内容生成系统!

注:本教程不需要资深的技术背景也能学会。也不需要花太多时间去学习 DigitalOcean 云服务的后台,因为它比 AWS 或谷歌云服务要简单易用得多。

前期准备工作

  • Python代码能力:本教程需使用Python代码调用模型
  • 终端操作基础:需简单操作终端窗口(代码将直接提供)
  • 播客主题或大纲:明确单集核心内容以生成相关脚本
  • DigitalOcean账号:如无账号,请访问digitalocean.com注册

如何配置Digitalocean GPU Droplets云服务器?

首先需配置生成播客脚本的运行环境。我们将沿用《将一键模型GPU Droplets转化为个人助手》教程中的设置流程,建议先阅读该教程了解可用模型及访问方式。

操作步骤:

  1. 由于 Huggingface 与 DigitalOcean 有深度合作,所以你也可以按照HuggingFace官方文档创建新的GPU Droplets实例。
  2. 你也可以在 bilibili 搜索“如何使用DigitalOcean GPU Droplets的一键部署HuggingFace模型功能”,观看配套视频,获取完整操作指引。

在这里,我们就不过多赘述,因为不论是通过往期文章,还是视频,你都能看到完整的指引。那么在实例启动完成后,我们就可以进入下一步操作了。

启动个人助手

首先,我们将启动之前开发的同一个个人助手 Gradio 应用程序。这将作为我们构建和测试脚本的功能环境。或者,您也可以使用 HuggingFace 1-click Models 文档中提供的 UNIX 和 Python 脚本,不过在本教程中我们不会介绍这种方法。

打开您的 GPU Droplet 的终端窗口,并粘贴以下脚本:

cd ../home
apt-get install python3-pip
pip install gradio tts huggingface_hub transformers datasets scipy torch torchaudio accelerate
touch personalAssistant.py
vim personalAssistant.py

这将安装演示所需的包,然后为我们创建一个用于运行个人助手的脚本。接下来,它会创建并打开一个 Vim 文本编辑器。请将以下脚本粘贴到窗口中,然后按下 Esc 键,接着输入 :wq 以保存对文件所做的更改。

import gradio as gr
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, StoppingCriteria, StoppingCriteriaList, TextIteratorStreamer
from threading import Thread
import os
from huggingface_hub import InferenceClient
import gradio as gr
import random
import time
from TTS.api import TTS
import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
from datasets import load_dataset
import scipy.io.wavfile as wavfile
import numpy as np


device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32

model_id_w = "openai/whisper-large-v3"

model_w = AutoModelForSpeechSeq2Seq.from_pretrained(
    model_id_w, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
model_w.to(device)

processor = AutoProcessor.from_pretrained(model_id_w)

pipe_w = pipeline(
    "automatic-speech-recognition",
    model=model_w,
    tokenizer=processor.tokenizer,
    feature_extractor=processor.feature_extractor,
    torch_dtype=torch_dtype,
    device=device,
)

client = InferenceClient(base_url="http://localhost:8080", api_key=os.getenv("BEARER_TOKEN"))

# Example voice cloning with YourTTS in English, French and Portuguese
# tts = TTS("tts_models/multilingual/multi-dataset/bark", gpu=True)

# get v2.0.2
tts = TTS(model_name="xtts_v2.0.2", gpu=True)

with gr.Blocks() as demo:
    chatbot = gr.Chatbot(type="messages")
    with gr.Row():
        msg = gr.Textbox(label = 'Prompt')
        audi = gr.Audio(label = 'Transcribe audio')
    with gr.Row():
        submit = gr.Button('Submit')
        submit_audio = gr.Button('Submit Audio')
        read_audio = gr.Button('Transcribe Text to Audio')
        clear = gr.ClearButton([msg, chatbot])
    with gr.Row():
        token_val = gr.Slider(label = 'Max new tokens', value = 512, minimum = 128, maximum = 1024, step = 8, interactive=True)
        temperature_ = gr.Slider(label = 'Temperature', value = .7, minimum = 0, maximum =1, step = .1, interactive=True)
        top_p_ = gr.Slider(label = 'Top P', value = .95, minimum = 0, maximum =1, step = .05, interactive=True)

    def respond(message, chat_history, token_val, temperature_, top_p_):
        bot_message = client.chat.completions.create(messages=[{"role":"user","content":f"{message}"},],temperature=temperature_,top_p=top_p_,max_tokens=token_val,).choices[0]['message']['content']
        chat_history.append({"role": "user", "content": message})
        chat_history.append({"role": "assistant", "content": bot_message})
        # tts.tts_to_file(bot_message, speaker_wav="output.wav", language="en", file_path="output.wav")

        return "", chat_history, #"output.wav"
    
    def respond_audio(audi, chat_history, token_val, temperature_, top_p_):  
        wavfile.write("output.wav", 44100, audi[1]) 
        result = pipe_w('output.wav')
        message = result["text"]
        print(message)
        bot_message = client.chat.completions.create(messages=[{"role":"user","content":f"{message}"},],temperature=temperature_,top_p=top_p_,max_tokens=token_val,).choices[0]['message']['content']
        chat_history.append({"role": "user", "content": message})
        chat_history.append({"role": "assistant", "content": bot_message})
        tts.tts_to_file(bot_message, speaker_wav="output.wav", language="en", file_path="output2.wav")
        tts.tts_to_file(bot_message,
                file_path="output.wav",
                speaker_wav="output.wav",
                language="en")
        return "", chat_history, #"output.wav"
    def read_text(chat_history):
        print(chat_history)
        print(type(chat_history))
        tts.tts_to_file(chat_history[-1]['content'],
                file_path="output.wav",
                speaker_wav="output.wav",
                language="en")
        return 'output.wav'


    msg.submit(respond, [msg, chatbot, token_val, temperature_, top_p_], [msg, chatbot])
    submit.click(respond, [msg, chatbot, token_val, temperature_, top_p_], [msg, chatbot])
    submit_audio.click(respond_audio, [audi, chatbot, token_val, temperature_, top_p_], [msg, chatbot])
    read_audio.click(read_text, [chatbot], [audi])
demo.launch(share = True)

我们可以通过输入以下命令来运行该应用程序:

python personalAssistant.py

打开共享的公共链接,即可在本地浏览器中访问该应用程序。

生成播客脚本

在启动并打开个人助手之后,我们就可以开始操作了。

首先,我们需要确定一个主题。为 1-click Model GPU Droplet 提供支持的大型语言模型(LLM)非常灵活,几乎可以涵盖我们提供的任何主题。在我们的实验中,它们都具备相对较新的知识库,能够体现过去一年内的最新信息。在这个示例中,我们将创建一个科技新闻播客,重点讨论新技术带来的颠覆性影响。

在编写输入提示时,关键是要让模型考虑到你希望涉及的每一个要点。

示例输入:

请编写一个播客脚本,内容为乔治和玛雅两人讨论一款理论上可能出现的苹果 iPhone 新竞争对手所带来的影响。让他们详细探讨这款新手机发布后可能引发的政治、经济和社会层面的影响,特别是当 iPhone 的统治地位终结时所带来的深远后果。

然后我们就得到了这样一个输出结果:

好的,以下是保留“Breaking Point”不翻译的版本:

**标题:《新挑战者的崛起:理论上的iPhone竞争对手的含义》**

**开场音乐**

乔治:欢迎来到“科技畅谈”,这是一个深入探讨科技领域最新趋势和创新的播客。我是主持人乔治。

玛雅:我是玛雅。今天,我们将探讨一个在科技行业引起轩然大波的假设性场景:苹果iPhone的新竞争对手的发布。

乔治:没错。想象一下一款不仅在硬件和软件上与iPhone不相上下,还提供独特用户体验的手机,可能会颠覆市场。

玛雅:没错。那么,让我们深入探讨这种场景的含义。乔治,如果这款新手机成为现实,你认为会有什么直接后果?

**Breaking Point 1: Initial Reaction**

乔治:我觉得最大的影响可能是苹果的股价。如果新竞争对手以更低的价格提供类似产品,苹果的销售可能会受到影响,这也会反映在其股价上。

玛雅:这是一个很好的观点。那么对消费者的影响呢?他们会愿意转向新品牌吗?

**Breaking Point 2: Consumer Perspective**

乔治:我觉得一些消费者可能会对尝试新品牌感兴趣,特别是如果它提供iPhone没有的独特功能或用户体验。但同时,iPhone生态系统已经积累了大量的用户忠诚度,所以看看消费者如何反应会很有趣。

玛雅:没错。那么对生态系统本身的影响呢?这个新竞争对手会颠覆整个应用市场吗?

**Breaking Point 3: Ecosystem Disruption**

乔治:啊,这是一个很好的问题。如果一款新手机获得显著的市场份额,它可能会颠覆整个应用市场。开发者需要为多个平台开发应用,这可能会导致市场的碎片化。

玛雅:没错。那么对经济的影响呢?这个新竞争对手会创造新的工作岗位还是会扰乱现有的工作岗位?

**Breaking Point 4: Economic Impact**

乔治:新竞争对手的发布可能会在制造和开发领域创造新的工作岗位,但也可能导致与iPhone生态系统密切相关行业的岗位流失。

玛雅:这是一个很好的观点。那么对政治的影响呢?这个新竞争对手会对国家安全或贸易政策产生任何影响吗?

**Breaking Point 5: Political Implications**

乔治:啊,这是一个有趣的问题。如果一个新竞争对手获得显著的市场份额,它可能会在贸易领域引发新的紧张局势,特别是如果新手机是在美国有贸易协定的国家制造的。

玛雅:没错。最后,这个新竞争对手的社会影响呢?它会带来一个更加多样化和包容性的科技行业吗?

**Breaking Point 6: Social Impact**

乔治:我觉得一个新竞争对手可能会带来一个更加多样化和包容性的科技行业,特别是如果新手机设计了无障碍功能或其他包容性技术。

玛雅:这是一个很好的观点。那么对社会变革的潜力呢?这个新竞争对手能够挑战围绕科技和社会的主导叙事吗?

**Breaking Point 7: Social Change**

乔治:啊,这是一个很好的问题。如果一个新竞争对手获得显著的市场份额,它可能会挑战围绕科技和社会的主导叙事,特别是如果新手机专注于社会责任设计。

玛雅:没错。好了,今天的时间就到这里。感谢你和我一起进行这个思想实验,乔治。

**结束音乐**

乔治:感谢收听“科技畅谈”。下次请继续关注,我们将带来更多关于科技领域最新趋势和创新的讨论。

玛雅:别忘了订阅我们的播客,获取更多深入分析和专家见解。

**结束音乐继续**

**注:Breaking Point处标示出对话可以即兴发挥,使讨论更具动态性和吸引力。**

看看模型是如何自动格式化这段内容的。众多的Breaking Point为我们提供了进一步填充内容的空间,可以利用模型来完善。我们可以在每个Breaking Point处添加提示,进一步将新的框架扩展成一个完整的脚本。例如,我们可以为“Breaking Point4:经济影响”输入完整的段落内容,并添加额外的指令来充实这一部分。以下是我们在尝试后得到的结果:

## 输入  
继续这段对话。完全聚焦于iPhone新竞争对手的政治经济影响。  
“Breaking Point 4: Economic Impact  
George: 嗯,新竞争对手的出现可能会在制造和开发领域创造新的工作岗位,但也可能导致与iPhone生态系统密切相关行业的岗位流失。  
Maya: 这是一个很好的观点。那么对政治的影响呢?这个新竞争对手会对国家安全或贸易政策产生任何影响吗?”  

## 输出  
George: 这是一个很好的问题,玛雅。新竞争对手对国家安全和贸易政策的影响可能是相当显著的。iPhone是美国创新和技术实力的象征,任何对市场的冲击都可能对美国经济及其在全球的地位产生更广泛的影响。  
Maya: 我明白你的意思。但竞争对手的来源国呢?如果它是一家来自像中国这样的国家的公司,这是否会改变贸易政策和国家安全问题的动态?  
George: 正是这样。如果竞争对手是一家中国公司,这可能会导致对中国的贸易行为进行更严格的审查,甚至可能引发呼吁加征关税或其他贸易限制。这可能会对全球经济产生连锁反应,甚至可能引发贸易战。  
Maya: 这听起来确实令人担忧。那么对美元的影响呢?如果竞争对手能够获得显著的市场份额,会不会导致美元贬值?  
George: 这是有可能的。美元贬值可能会使美国出口商品变得更贵,并且可能会引发通货膨胀。这可能会对美国经济产生负面影响,甚至可能导致经济衰退。  
Maya: 我明白你的意思。但对苹果的股价呢?如果竞争对手能够获得显著的市场份额,会不会导致苹果股价下跌?  
George: 这是一个很好的问题。如果竞争对手能够获得显著的市场份额,可能会导致苹果股价下跌,跌幅可能达到10%到20%甚至更多。这可能会对公司的估值产生重大影响,甚至可能导致管理层的变动。  
Maya: 哇,这确实有很多需要考虑的因素。那么对消费者的影响呢?新竞争对手是否会推动智能手机市场的价格降低和创新加速?  
George: 当然。新竞争对手可能会加剧市场竞争,从而推动价格下降,并推动智能手机市场的创新。这对消费者来说是个好消息,他们可能会享受到更低的价格、更高的质量和更多的功能。  
Maya: 这是一个很好的观点。但对苹果的生态系统呢?如果竞争对手能够获得显著的市场份额,会不会导致苹果生态系统(包括其应用商店和其他服务)的价值下降?  
George: 这是一个很好的问题。如果竞争对手能够获得显著的市场份额,可能会导致苹果生态系统的价值下降。

正如我们所见,这个模型对这一想法有一些突出的观点,为我们提供了相关的对话话题。然后,作者们可以在此基础上进行扩展,通过增加细节、统计数据和有根据的研究来更新和完善现有的输出内容。

写在最后

通过HuggingFace一键模型部署与DigitalOcean GPU Droplets云服务器,我们成功实现了播客脚本的AI辅助生成。这个项目的使用场景也可以扩展到文章的撰写、语音自动化合成等场景,未来甚至可构建全AI驱动的播客生产流水线。