别再死磕复杂算法了!用 Hugging Face,小白也能 30 分钟搭出实用 AI 工具

一 前言介绍

Hugging Face 是一个以自然语言处理(NLP)和机器学习为核心的开源社区与技术平台,被称为 “机器学习界的 GitHub”,主要提供以下服务和功能:

模型仓库

包含数万种预训练模型,覆盖文本、图像、音频等多模态任务,支持主流框架(PyTorch、TensorFlow 等)。开发者可直接下载使用或微调模型(如 BERT、GPT、Stable Diffusion 等)。

1.数据集平台

提供大量公开数据集,涵盖翻译、分类、生成等任务,支持一键加载到模型训练流程中,降低数据准备门槛。

2.开源工具库

开发了著名的 transformers 库,简化了预训练模型的调用和微调;还有 datasets(数据处理)、accelerate(分布式训练)等工具,大幅降低机器学习应用的开发难度。 

利用Hugging Face开发的transformers库,结合上面众多的预训练好的众多模型,可以让我们轻松搭建AI应用,下面是实践。

二 实践

本次试验过程发现, transformers加载模型的时候,需要依赖torch库2.6版本。

ValueError: Due to a serious vulnerability issue in `torch.load`, even with `weights_only=True`,  
we now require users to upgrade torch to at least v2.6 in order to use the function.  
This version restriction does not apply when loading files with safetensors.

可气的是,我机器是macbook,intel芯片版本,最高只支持torch版本到2.2.2.

❯ pip install --trusted-host download.pytorch.org torch==2.3.0 
 --index-url https://download.pytorch.org/whl/cpu

Looking in indexes: https://download.pytorch.org/whl/cpu
ERROR: Could not find a version that satisfies the requirement torch==2.3.0 (from versions: 2.0.0, 2.0.1, 2.1.0, 2.1.1, 2.1.2, 2.2.0, 2.2.1, 2.2.2)

没办法,好在找了一个jupyter环境来运行简单的测试,下面开始。

2.1 模型选择

hugging face 上模型很多,我们如何选择那,首先可以通过Task,选择不同的种类的AI模型,如下:模型选择比如点选“问答”后,右边自动过滤出问答AI模型,然后我们可以根据下载量和最多赞排序,然后选择合适的模型。选择排序条件

需要根据硬件选择,简单评估,来说模型运行需要内存为模型文件的1.2倍左右。

2.2 自然语言处理-构建聊天机器人

准备阶段,默认需要安装好:pip install transformers 这个开源库。

transformers 是 Hugging Face 开发的一个非常流行的 Python 自然语言处理库,主要作用是提供各种预训练的 Transformer 模型(如 BERT、GPT、T5 等)及其相关工具,帮助开发者快速实现自然语言处理任务。

提供丰富的预训练模型: 包含数百种预训练模型,支持多语言处理,涵盖文本分类、命名实体识别、机器翻译、问答系统、文本生成等多种任务。简化模型使用流程: 封装了复杂的模型构建和训练细节,通过简单的 API 即可加载预训练模型并进行推理,无需从零开始构建模型。

支持模型微调:可以基于预训练模型,使用自定义数据集进行微调,快速适配特定任务需求。 

from transformers import pipeline
from transformers import logging


# 设置日志输出级别为错误,只有错误才输出 减少日志量
logging.set_verbosity_error()
chatbot = pipeline(task="conversational",
                   model="facebook/blenderbot-400M-distill")

#在hugging face上找到合适的模型,用pipeline直接加载模型
# 这个中文机器人模型还是大,经常失败
#chatbot = pipeline("question-answering", model="FlagAlpha/Llama2-Chinese-7b-Chat")
user_message="""I plan to visit Shanghai recently. How's the weather there lately? And what are the interesting places to visit and delicious foods to try? """
conversation = Conversation(user_message)
conversation = chatbot(conversation)
print(conversation)

conversation.add_message(
    {"role": "user",
     "content": """What delicious food is there? """
    })
print(chatbot(conversation))

运行结果:

Conversation id: 52fef548-3b79-4dd5-be11-68958b246d72
user: I plan to visit Shanghai recently. How's the weather there lately? And what are the interesting places to visit and delicious foods to try? 
assistant:  It is very hot and humid. I would love to try some of the food there.

代码解释:

1. conversation = Conversation(user_message)
作用:创建一个对话对象,封装用户输入的消息,用于跟踪对话状态。
细节:
Conversation 是 transformers 库专门设计的类,用于管理多轮对话的上下文(包括用户消息和模型回复)。
初始化时传入用户当前输入的消息(user_message),会将其存储为对话的起始内容。
此时的 conversation 对象中仅包含用户的提问,还没有模型的回复。
2. conversation = chatbot(conversation)
作用:将对话对象传入对话管道(chatbot),让模型生成回复,并更新对话状态。
细节:
chatbot 是通过 pipeline("conversational", model=...) 创建的对话管道,内部封装了模型调用逻辑。
当把 conversation 对象传入 chatbot 时,管道会:
解析对话历史(首次调用时只有用户的初始消息);
调用模型生成针对当前对话的回复;
自动将生成的回复添加到 conversation 对象中,更新对话状态。
赋值操作 conversation = ... 是为了接收更新后的对话对象(包含了模型回复)。

3. conversation.add_message(...)
conversation 是之前创建的对话对象(transformers.Conversation 类的实例)。
add_message() 是该类的方法,用于向对话历史中追加新消息(可以是用户输入或模型回复),确保后续对话能基于完整上下文生成回复。
消息格式:{"role": "user", "content": "..."}
这是一个遵循对话角色规范的字典,包含两个关键键值对:
role: "user":表示这条消息的发送者是 “用户”(提问方)。
(对应的,模型回复的角色通常是 "assistant")
content: "What delicious food is there? ":表示消息的具体内容(这里是用户询问 “有什么美食?”)。
作用
向对话历史中手动添加用户的新提问,替代了直接创建新 Conversation 对象的方式。这样做的好处是:
保留之前的对话上下文(比如用户之前问过 “推荐一个旅游城市”,现在接着问当地美食,模型能关联起来)。
配合后续的 chatbot(conversation) 调用,模型会基于包括这条新消息在内的完整历史生成回复。

输出内容:最后输出完整内容

2.3 自然语言处理-构建AI翻译器

自然语言翻译,应用非常广泛,现在AI更强大了,用AI做语言翻译,也变的非常简单。 利用Hugging face上的模型可以轻松创建一个AI翻译应用。

需要安装库:

pip install transformers 
  pip install torch

代码如下:

from transformers import pipeline

# 加载翻译模型
translator = pipeline(
        "translation",
        model="Helsinki-NLP/opus-mt-zh-en")
chinese_texts = [
        "我爱自然语言处理。",
        "今天天气很好,适合去公园散步。",
        "Hugging Face的transformers库非常实用。",
        "人工智能正在改变我们的生活。"
    ]
 results = translator(chinese_texts, max_length=100)

for chinese, result in zip(chinese_texts, results):
        print(f"中文: {chinese}")
        print(f"英文: {result['translation_text']}\n")
AI翻译
AI翻译

2.4 自动语音识别

语音识别,现在应用非常广泛,比如我们开会的时候,需要将语音内容自动转成文字,然后再进一步存档,总结。以前需要人工做会议纪要,现在可以简单的通过AI进行语音识别,并通过AI做会议内容总结。

需要安装库:

pip install transformers
  pip install -U datasets
  pip install soundfile
  pip install librosa
  pip install gradio

说明:

datasets库:用于加载和处理各种机器学习数据集(尤其是 NLP 领域),支持自动下载、格式转换、数据清洗和预处理。

soundfile库:用于读取和写入音频文件(支持 WAV、FLAC、OGG 等格式),提供简单的 API 处理音频数据。

librosa库:专业的音频分析库,用于提取音频特征(如梅尔频谱、音高、节奏等),支持音频可视化和预处理。

gradio库:快速构建机器学习模型的交互式 Web 界面,无需前端知识,几行代码即可生成可交互的演示页面。

代码:

from transformers.utils import logging
logging.set_verbosity_error()


from datasets import load_dataset
#加载一个专门用于语音识别的经典公开数据集(LibriSpeech ASR), 
#该数据集包含大量带文本标注的英语语音片段,来自公共领域的有声书籍朗读录音。
#split="train.clean.100",指定加载数据集的子集,最清晰的100小时子集。
#streaming =True 采用流式加载,减少内存占用,按需加载
#rust_remote_code=True 允许执行数据集附带的远程代码
dataset = load_dataset("librispeech_asr",
                       split="train.clean.100",
                       streaming=True,
                       trust_remote_code=True)

examples = dataset.take(3)
list(examples)

加载后,可以看到数据集中不光有录音,还有标签,以及应该识别到的内容:语音数据集数据展示

语音数据集的每条数据结构如下:

{
 'file': '/home/albert/.cache/huggingface/datasets/downloads/extracted/bc0d9a6ef85c2d487c9c6efbc91f8892df927c69d3f80545a668cc058d5f677e/374-180298-0000.flac',
 'audio': {
  'path': '374-180298-0000.flac',
  'array': array([7.01904297e-04, 7.32421875e-04, 7.32421875e-04, ..., -2.74658203e-04, -1.83105469e-04, -3.05175781e-05]),
  'sampling_rate': 16000
 },
 'text': 'CHAPTER SIXTEEN I MIGHT HAVE TOLD YOU OF THE BEGINNING OF THIS LIAISON IN A FEW LINES BUT I WANTED YOU TO SEE EVERY STEP BY WHICH WE CAME I TO AGREE TO WHATEVER MARGUERITE WISHED',
 'speaker_id': 374,
 'chapter_id': 180298,
 'id': '374-180298-0000'
}

我们其实需要里面的audio中内容,先来放下这个录音,停下效果:

from IPython.display import Audio as IPythonAudio

IPythonAudio(example["audio"]["array"],
             rate=example["audio"]["sampling_rate"])

解释:

example["audio"]["array"]:通常是一个音频波形数据的数组(numpy 数组或 Python 列表), 
存储了语音信号的振幅信息(即 “原始音频数据”)。
rate=...:指定音频的采样率(见下文详细解释)。
这行代码会创建一个音频播放器控件,在 IPython 环境中显示,点击即可播放array中的语音数据。

这里面音频的采样率非常重要:

rate(采样率,单位:赫兹 Hz)是音频处理中的核心参数,定义为每秒对模拟语音信号的采样次数。

其作用包括:

决定音频的 “时间精度”例如: 16000 Hz(语音识别常用):每秒采样 16000 次,每次采样间隔约 0.0000625 秒。 44100 Hz(CD 音质):每秒采样 44100 次,精度更高。 采样率越高, 音质越好,但数据量也越大。

决定音频的可播放频率范围:

采样率必须至少是音频中最高频率的 2 倍才能准确还原信号。 人类语音的频率范围通常在 300Hz~3400Hz,因此 8000Hz 或 16000Hz 的采样率足以覆盖(16000Hz > 2×3400Hz)。

接着我们加载语音识别模型:

from transformers import pipeline
asr = pipeline(task="automatic-speech-recognition",
               model="distil-whisper/distil-small.en")

解释:

distil-whisper:是对 OpenAI 的 Whisper 模型进行蒸馏(Distillation)得到的轻量版模型,保留了大部分性能但体积更小、速度更快。

distil-small.en:表示 “小型”(small)的英语(.en)专用版本,适合英语语音识别场景,资源占用较低(相比原 Whisper 模型更易部署)

在使用模型之前,我们需要检查模型的默认采用率,采用率不同,会导致数据失真,无法准确识别, 检查方法:

asr.feature_extractor.sampling_rate
#输出
16000

example["audio"]["sampling_rate"]
#输出
16000

可以看到录音的采用频率和模型默认的一样,可以直接使用。 通过下面的语句自动识别:

asr(example["audio"]["array"])

语音识别输出结果和原文相比,语句加了标点符号,适配了合适的大小写,更易读了。

除了处理数据集里面的数据,当然我们还可以录音,让模型识别:

import os
import gradio as gr

# 创建一个高级界面容器,用于组合多个组件
demo = gr.Blocks()
def transcribe_speech(filepath):
    if filepath is None:
        gr.Warning("No audio found, please retry.")
        return ""
    # 调用之前定义的asr语音识别管道
    output = asr(filepath)
    return output["text"]

# 界面1:麦克风录音识别
mic_transcribe = gr.Interface(
    fn=transcribe_speech,
    inputs=gr.Audio(sources="microphone", # 输入源为麦克风
                    type="filepath"),  # 输出格式为音频文件路径(而非原始数据)
    outputs=gr.Textbox(label="Transcription",  # 文本框标签
                       lines=3),   # 文本框显示行数
    allow_flagging="never")

# 界面2:音频文件上传识别
file_transcribe = gr.Interface(
    fn=transcribe_speech,
    inputs=gr.Audio(sources="upload",
                    type="filepath"),
    outputs=gr.Textbox(label="Transcription",
                       lines=3),
    allow_flagging="never",
)
# 使用with语法向Blocks容器中添加内容
with demo:
    gr.TabbedInterface(
        [mic_transcribe,
         file_transcribe],
        ["Transcribe Microphone",
         "Transcribe Audio File"], # 放入两个界面
    )

demo.launch(share=True, # 生成公共链接,允许其他人访问(有效期约72小时)
            server_port=int(os.environ['PORT1']))# 从环境变量获取端口(常用于服务器部署)
运行效果
运行效果

但是上面界面的录音,只能最长30s,这对我们的会议来说显然是不够的,但是仍然可以通过pipeline来实现语音识别。

让我们来测试个长的录音:

import soundfile as sf
import io
audio, sampling_rate = sf.read('narration_example.wav')
print(sampling_rate)
print(audio.shape)

会发现打印结果如下,会发现采样频率和库的默认不一样,而且维度竟然是2维的,因为是立体双通道原因,可以变换成单通道,因为双通道除了精度高,对我们识别没什么帮助的。

采样频率和维度代码:

import numpy as np
import librosa
from IPython.display import Audio as IPythonAudio


#矩阵转置
audio_transposed = np.transpose(audio)
print(audio_transposed.shape)
#将多声道(如立体声,通常为左、右两个声道)的音频数据转换为单声道,合并所有声道的音频信息为一个声道。 
audio_mono = librosa.to_mono(audio_transposed)

#播放下听听效果
IPythonAudio(audio_mono,
             rate=sampling_rate)

#核心功能:改变音频的采样率(每秒采样次数),将原始音频的采样率转换为 16000Hz。
audio_16KHz = librosa.resample(audio_mono,
                               orig_sr=sampling_rate,
                               target_sr=16000)
asr(audio_16KHz)


asr(
    audio_16KHz,
    chunk_length_s=30, # 30 seconds
    batch_size=4,
    return_timestamps=True,
)["chunks"]

返回结果:长语音识别结果

核心代码是:

asr(
    audio_16KHz,
    chunk_length_s=30, # 30 seconds
    batch_size=4,
    return_timestamps=True,
)["chunks"]

作用:

对预处理后的 16KHz 单声道音频(audio_16KHz)进行语音识别,并返回按时间分段的识别结果(包含每个片段的文本和对应时间戳)。
1.   chunk_length_s=30  指定音频分块长度为 30 秒。对于长音频(超过模型单次处理上限),模型会自动按 30 秒为单位分割成多个片段(chunk),逐段处理后再拼接结果,
避免因音频过长导致内存不足或识别精度下降。
2. batch_size=4:
批处理大小为 4,即同时处理 4 个 30 秒的音频片段,加速长音频的识别效率(利用并行计算能力)。
3. return_timestamps=True:
启用时间戳功能,让模型返回每个识别片段在原始音频中的起始和结束时间(单位:秒),方便定位文本对应的语音位置。
4. 模型输出是一个字典,其中 ["chunks"] 键对应的值是一个列表,包含所有分块的识别结果,每个元素是一个带时间戳的片段信息

超过30s的在线录音,可以通过上面切分文件的思路来进行识别,如下:

def transcribe_long_form(filepath):
    if filepath is None:
        gr.Warning("No audio found, please retry.")
        return ""
    output = asr(
      filepath,
      max_new_tokens=256,
      chunk_length_s=30,
      batch_size=8,
    )
    return output["text"]

其他的不用变,即可以处理超过30s的录音识别了,其中:

max_new_tokens=256 是控制语音识别模型生成文本长度的关键参数,这里的 256 表示模型针对单次语音识别结果时,最多生成 256 个 token(词元)。
即我们在30s内,支持多大识别的token为256个。

总结

总的来说啊,Hugging Face这东西是真挺好用的。你看,不管管是想整个能聊天的机器人,还是做个翻译工具,甚至把语音转成文字,用它家的工具和模型,几行代码就能搞定,根本不用自己从头攒模型,省老事儿了。

当然了,用的时候也可能碰到些小麻烦,比如电脑配置不够啊,软件版本不兼容啥的,但好在办法总比困难多,换个环境试试,或者用个轻量点的模型,基本都能解决。

对咱们普通开发者来说,这就意味着不用死磕那些复杂的算法,也能快速搭出能用的AI小工具。以后这东西肯定会越来越厉害,能做的事儿也越来越多。不管是想试试手,还是真要做个实用的小应用,借着它入门肯定错不了,能少走不少弯路呢。

参考:https://learn.deeplearning.ai/courses/open-source-models-hugging-face/lesson/wcnno/automatic-speech-recognition

### smolagents AI智能体框架概述 smolagents是一个专注于创建轻量级、高效能AI智能体的框架,旨在简化开发者构建复杂人工智能系统的流程。该框架特别强调对ollama本地部署的支持,允许用户在私有环境中运行这些智能体。 ### Ollama本地部署实践 对于希望保护敏感数据或寻求更快速响应时间的应用场景而言,在本地环境内部署像Ollama这样的大型语言模型至关重要。通过使用Hugging Face提供的`huggingface_hub`库可以方便地管理模型版本并将其下载至本地存储: ```python from huggingface_hub import snapshot_download snapshot_path = snapshot_download(repo_id="your_model_repo", local_dir="./models/ollama") print(f"Model downloaded at {snapshot_path}") ``` 此过程不仅限于简单的文件传输;它还涉及配置必要的依赖项和服务以便顺利启动和维护已安装的模型实例[^1]。 ### 利用Hugging Face开源工具进行开发 借助Hugging Face平台上的资源和技术支持,smolagents能够集成多种先进的自然语言处理能力。例如,当涉及到将自然语言查询转换成结构化查询语句(SQL)的任务时,可以通过加载特定任务优化过的预训练模型来完成这一目标: ```python from transformers import pipeline text_to_sql_pipeline = pipeline("text-to-sql", model="path/to/text2sql/model") query_result = text_to_sql_pipeline("Show me all users who signed up after January 1st, 2023.") for result in query_result: print(result['generated_text']) ``` 上述代码片段展示了如何初始化一个用于文本转SQL的pipeline对象,并对其输入一段描述性的命令字符串以获得相应的数据库操作指令。 ### 文本到SQL功能的具体应用场景 Text to SQL作为一项重要的技术手段,使得非技术人员也能轻松编写复杂的数据库查询。这对于提高工作效率尤其有用——无论是业务分析师想要获取最新销售报告还是客服代表试图解决客户问题。smolagents结合了这种强大的转化机制与其他实用特性一起提供给最终用户更加友好且高效的交互体验[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值