Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Crie um aplicativo que converte áudio falado em anotações organizadas – inteiramente em seu dispositivo. O aplicativo primeiro transcreve um arquivo de áudio usando um modelo de fala em texto e, em seguida, usa um modelo de chat para resumir e organizar a transcrição em anotações limpas.
Neste tutorial, você aprenderá como:
- Configurar um projeto e instalar o SDK Local do Foundry
- Carregar um modelo de conversão de fala em texto e transcrever um arquivo de áudio
- Carregue um modelo de chat e resuma a transcrição
- Combinar transcrição e resumo em um aplicativo completo
- Limpar os recursos
Pré-requisitos
- Um computador Windows, macOS ou Linux com pelo menos 8 GB de RAM.
- Um
.wavarquivo de áudio para transcrever (o tutorial usa um arquivo de exemplo).
Instalar pacotes
Repositório de exemplos
O código de exemplo completo deste artigo está disponível no repositório Foundry Local GitHub. Para clonar o repositório e acessar o exemplo, use:
git clone https://github.com/microsoft/Foundry-Local.git
cd Foundry-Local/samples/cs/tutorial-voice-to-text
Se você estiver desenvolvendo ou enviando em Windows, selecione a guia Windows. O pacote Windows integra-se ao runtime Windows ML – ele fornece a mesma área de superfície de API com uma amplitude maior de aceleração de hardware.
dotnet add package Microsoft.AI.Foundry.Local.WinML
dotnet add package OpenAI
Os exemplos de C# no repositório GitHub são projetos pré-configurados. Se você estiver criando do zero, leia a referência do SDK Local do Foundry para obter mais detalhes sobre como configurar seu projeto em C# com o Foundry Local.
Transcrever um arquivo de áudio
Nesta etapa, você carrega um modelo de conversão de fala em texto e transcreve um arquivo de áudio. O SDK Local do Foundry usa o alias whisper do modelo para selecionar a melhor variante Whisper para seu hardware.
Abra
Program.cse substitua seu conteúdo pelo seguinte código para inicializar o SDK, carregar o modelo de fala e transcrever um arquivo de áudio:// Load the speech-to-text model var speechModel = await catalog.GetModelAsync("whisper-tiny") ?? throw new Exception("Speech model not found"); await speechModel.DownloadAsync(progress => { Console.Write($"\rDownloading speech model: {progress:F2}%"); if (progress >= 100f) Console.WriteLine(); }); await speechModel.LoadAsync(); Console.WriteLine("Speech model loaded."); // Transcribe the audio file var audioClient = await speechModel.GetAudioClientAsync(); var transcriptionText = new StringBuilder(); Console.WriteLine("\nTranscription:"); var audioResponse = audioClient .TranscribeAudioStreamingAsync("meeting-notes.wav", ct); await foreach (var chunk in audioResponse) { Console.Write(chunk.Text); transcriptionText.Append(chunk.Text); } Console.WriteLine(); // Unload the speech model to free memory await speechModel.UnloadAsync();O
GetAudioClientAsyncmétodo retorna um cliente para operações de áudio. OTranscribeAudioStreamingAsyncmétodo transmite partes de transcrição à medida que ficam disponíveis. Você acumula o texto para que possa passá-lo para o modelo de chat na próxima etapa.
Observação
Substitua "meeting-notes.wav" pelo caminho para o seu arquivo de áudio. Os formatos com suporte incluem WAV, MP3 e FLAC.
Resumir a transcrição
Agora, use um modelo de chat para organizar a transcrição bruta em notas estruturadas. Carregue o modelo qwen2.5-0.5b e envie a transcrição como contexto usando um prompt do sistema para instruir o modelo a produzir anotações limpas e resumidas.
Adicione o seguinte código após a etapa de transcrição:
// Load the chat model for summarization
var chatModel = await catalog.GetModelAsync("qwen2.5-0.5b")
?? throw new Exception("Chat model not found");
await chatModel.DownloadAsync(progress =>
{
Console.Write($"\rDownloading chat model: {progress:F2}%");
if (progress >= 100f) Console.WriteLine();
});
await chatModel.LoadAsync();
Console.WriteLine("Chat model loaded.");
// Summarize the transcription into organized notes
var chatClient = await chatModel.GetChatClientAsync();
var messages = new List<ChatMessage>
{
new ChatMessage
{
Role = "system",
Content = "You are a note-taking assistant. Summarize " +
"the following transcription into organized, " +
"concise notes with bullet points."
},
new ChatMessage
{
Role = "user",
Content = transcriptionText.ToString()
}
};
var chatResponse = await chatClient.CompleteChatAsync(messages, ct);
var summary = chatResponse.Choices[0].Message.Content;
Console.WriteLine($"\nSummary:\n{summary}");
// Clean up
await chatModel.UnloadAsync();
Console.WriteLine("\nDone. Models unloaded.");
O prompt do sistema configura o formato de saída do modelo. Ao instruí-lo a produzir "notas organizadas e concisas com pontos de marcador", você obtém conteúdo estruturado em vez de uma parafrase bruta.
Combinar em um aplicativo completo
Substitua o conteúdo de Program.cs pelo seguinte código completo que transcreve um arquivo de áudio e resume a transcrição:
using Microsoft.AI.Foundry.Local;
using Betalgo.Ranul.OpenAI.ObjectModels.RequestModels;
using Microsoft.Extensions.Logging;
using System.Text;
CancellationToken ct = CancellationToken.None;
var config = new Configuration
{
AppName = "foundry_local_samples",
LogLevel = Microsoft.AI.Foundry.Local.LogLevel.Information
};
using var loggerFactory = LoggerFactory.Create(builder =>
{
builder.SetMinimumLevel(
Microsoft.Extensions.Logging.LogLevel.Information
);
});
var logger = loggerFactory.CreateLogger<Program>();
// Initialize the singleton instance
await FoundryLocalManager.CreateAsync(config, logger);
var mgr = FoundryLocalManager.Instance;
// Download and register all execution providers.
var currentEp = "";
await mgr.DownloadAndRegisterEpsAsync((epName, percent) =>
{
if (epName != currentEp)
{
if (currentEp != "") Console.WriteLine();
currentEp = epName;
}
Console.Write($"\r {epName.PadRight(30)} {percent,6:F1}%");
});
if (currentEp != "") Console.WriteLine();
var catalog = await mgr.GetCatalogAsync();
// Load the speech-to-text model
var speechModel = await catalog.GetModelAsync("whisper-tiny")
?? throw new Exception("Speech model not found");
await speechModel.DownloadAsync(progress =>
{
Console.Write($"\rDownloading speech model: {progress:F2}%");
if (progress >= 100f) Console.WriteLine();
});
await speechModel.LoadAsync();
Console.WriteLine("Speech model loaded.");
// Transcribe the audio file
var audioClient = await speechModel.GetAudioClientAsync();
var transcriptionText = new StringBuilder();
Console.WriteLine("\nTranscription:");
var audioResponse = audioClient
.TranscribeAudioStreamingAsync("meeting-notes.wav", ct);
await foreach (var chunk in audioResponse)
{
Console.Write(chunk.Text);
transcriptionText.Append(chunk.Text);
}
Console.WriteLine();
// Unload the speech model to free memory
await speechModel.UnloadAsync();
// Load the chat model for summarization
var chatModel = await catalog.GetModelAsync("qwen2.5-0.5b")
?? throw new Exception("Chat model not found");
await chatModel.DownloadAsync(progress =>
{
Console.Write($"\rDownloading chat model: {progress:F2}%");
if (progress >= 100f) Console.WriteLine();
});
await chatModel.LoadAsync();
Console.WriteLine("Chat model loaded.");
// Summarize the transcription into organized notes
var chatClient = await chatModel.GetChatClientAsync();
var messages = new List<ChatMessage>
{
new ChatMessage
{
Role = "system",
Content = "You are a note-taking assistant. Summarize " +
"the following transcription into organized, " +
"concise notes with bullet points."
},
new ChatMessage
{
Role = "user",
Content = transcriptionText.ToString()
}
};
var chatResponse = await chatClient.CompleteChatAsync(messages, ct);
var summary = chatResponse.Choices[0].Message.Content;
Console.WriteLine($"\nSummary:\n{summary}");
// Clean up
await chatModel.UnloadAsync();
Console.WriteLine("\nDone. Models unloaded.");
Observação
Substitua "meeting-notes.wav" pelo caminho para o seu arquivo de áudio. Os formatos com suporte incluem WAV, MP3 e FLAC.
Execute o aplicativo de anotações.
dotnet run
Você vê uma saída semelhante a:
Downloading speech model: 100.00%
Speech model loaded.
Transcription:
OK so let's get started with the weekly sync. First, the backend
API is nearly done. Sarah finished the authentication endpoints
yesterday. We still need to add rate limiting before we go to
staging. On the frontend, the dashboard redesign is about seventy
percent complete. Jake, can you walk us through the new layout?
Great. The charts look good. I think we should add a filter for
date range though. For testing, we have about eighty percent code
coverage on the API. We need to write integration tests for the
new auth flow before Friday. Let's plan to do a full regression
test next Tuesday before the release. Any blockers? OK, sounds
like we are in good shape. Let's wrap up.
Downloading chat model: 100.00%
Chat model loaded.
Summary:
- **Backend API**: Authentication endpoints complete. Rate limiting
still needed before staging deployment.
- **Frontend**: Dashboard redesign 70% complete. New chart layout
reviewed. Action item: add a date range filter.
- **Testing**: API code coverage at 80%. Integration tests for the
auth flow due Friday. Full regression test scheduled for next
Tuesday before release.
- **Status**: No blockers reported. Team is on track.
Done. Models unloaded.
O aplicativo primeiro transcreve o conteúdo de áudio com saída de streaming e, em seguida, passa o texto acumulado para um modelo de chat que extrai pontos-chave e os organiza em notas estruturadas.
Instalar pacotes
Repositório de exemplos
O código de exemplo completo deste artigo está disponível no repositório Foundry Local GitHub. Para clonar o repositório e acessar o exemplo, use:
git clone https://github.com/microsoft/Foundry-Local.git
cd Foundry-Local/samples/js/tutorial-voice-to-text
Se você estiver desenvolvendo ou enviando em Windows, selecione a guia Windows. O pacote Windows integra-se ao runtime Windows ML – ele fornece a mesma área de superfície de API com uma amplitude maior de aceleração de hardware.
npm install foundry-local-sdk-winml openai
Transcrever um arquivo de áudio
Nesta etapa, você carrega um modelo de conversão de fala em texto e transcreve um arquivo de áudio. O SDK Local do Foundry usa o alias whisper do modelo para selecionar a melhor variante Whisper para seu hardware.
Crie um ficheiro chamado
app.js.Adicione o seguinte código para inicializar o SDK, carregar o modelo de fala e transcrever um arquivo de áudio:
// Load the speech-to-text model const speechModel = await manager.catalog.getModel('whisper-tiny'); await speechModel.download((progress) => { process.stdout.write( `\rDownloading speech model: ${progress.toFixed(2)}%` ); }); console.log('\nSpeech model downloaded.'); await speechModel.load(); console.log('Speech model loaded.'); // Transcribe the audio file const audioClient = speechModel.createAudioClient(); const transcription = await audioClient.transcribe( path.join(__dirname, 'meeting-notes.wav') ); console.log(`\nTranscription:\n${transcription.text}`); // Unload the speech model to free memory await speechModel.unload();O
createAudioClientmétodo retorna um cliente para operações de áudio. Otranscribemétodo aceita um caminho de arquivo e retorna um objeto com umatextpropriedade que contém o conteúdo transcrito.
Observação
Substitua './meeting-notes.wav' pelo caminho para o seu arquivo de áudio. Os formatos com suporte incluem WAV, MP3 e FLAC.
Resumir a transcrição
Agora, use um modelo de chat para organizar a transcrição bruta em notas estruturadas. Carregue o modelo qwen2.5-0.5b e envie a transcrição como contexto usando um prompt do sistema para instruir o modelo a produzir anotações limpas e resumidas.
Adicione o seguinte código após a etapa de transcrição:
// Load the chat model for summarization
const chatModel = await manager.catalog.getModel('qwen2.5-0.5b');
await chatModel.download((progress) => {
process.stdout.write(
`\rDownloading chat model: ${progress.toFixed(2)}%`
);
});
console.log('\nChat model downloaded.');
await chatModel.load();
console.log('Chat model loaded.');
// Summarize the transcription into organized notes
const chatClient = chatModel.createChatClient();
const messages = [
{
role: 'system',
content: 'You are a note-taking assistant. Summarize ' +
'the following transcription into organized, ' +
'concise notes with bullet points.'
},
{
role: 'user',
content: transcription.text
}
];
const response = await chatClient.completeChat(messages);
const summary = response.choices[0]?.message?.content;
console.log(`\nSummary:\n${summary}`);
// Clean up
await chatModel.unload();
console.log('\nDone. Models unloaded.');
O prompt do sistema configura o formato de saída do modelo. Ao instruí-lo a produzir "notas organizadas e concisas com pontos de marcador", você obtém conteúdo estruturado em vez de uma parafrase bruta.
Combinar em um aplicativo completo
Crie um arquivo nomeado app.js e adicione o seguinte código completo que transcreve um arquivo de áudio e resume a transcrição:
import { FoundryLocalManager } from 'foundry-local-sdk';
import { fileURLToPath } from 'url';
import path from 'path';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
// Initialize the Foundry Local SDK
const manager = FoundryLocalManager.create({
appName: 'foundry_local_samples',
logLevel: 'info'
});
// Download and register all execution providers.
let currentEp = '';
await manager.downloadAndRegisterEps((epName, percent) => {
if (epName !== currentEp) {
if (currentEp !== '') process.stdout.write('\n');
currentEp = epName;
}
process.stdout.write(`\r ${epName.padEnd(30)} ${percent.toFixed(1).padStart(5)}%`);
});
if (currentEp !== '') process.stdout.write('\n');
// Load the speech-to-text model
const speechModel = await manager.catalog.getModel('whisper-tiny');
await speechModel.download((progress) => {
process.stdout.write(
`\rDownloading speech model: ${progress.toFixed(2)}%`
);
});
console.log('\nSpeech model downloaded.');
await speechModel.load();
console.log('Speech model loaded.');
// Transcribe the audio file
const audioClient = speechModel.createAudioClient();
const transcription = await audioClient.transcribe(
path.join(__dirname, 'meeting-notes.wav')
);
console.log(`\nTranscription:\n${transcription.text}`);
// Unload the speech model to free memory
await speechModel.unload();
// Load the chat model for summarization
const chatModel = await manager.catalog.getModel('qwen2.5-0.5b');
await chatModel.download((progress) => {
process.stdout.write(
`\rDownloading chat model: ${progress.toFixed(2)}%`
);
});
console.log('\nChat model downloaded.');
await chatModel.load();
console.log('Chat model loaded.');
// Summarize the transcription into organized notes
const chatClient = chatModel.createChatClient();
const messages = [
{
role: 'system',
content: 'You are a note-taking assistant. Summarize ' +
'the following transcription into organized, ' +
'concise notes with bullet points.'
},
{
role: 'user',
content: transcription.text
}
];
const response = await chatClient.completeChat(messages);
const summary = response.choices[0]?.message?.content;
console.log(`\nSummary:\n${summary}`);
// Clean up
await chatModel.unload();
console.log('\nDone. Models unloaded.');
Observação
Substitua './meeting-notes.wav' pelo caminho para o seu arquivo de áudio. Os formatos com suporte incluem WAV, MP3 e FLAC.
Execute o aplicativo de anotações.
node app.js
Você vê uma saída semelhante a:
Downloading speech model: 100.00%
Speech model downloaded.
Speech model loaded.
Transcription:
OK so let's get started with the weekly sync. First, the backend
API is nearly done. Sarah finished the authentication endpoints
yesterday. We still need to add rate limiting before we go to
staging. On the frontend, the dashboard redesign is about seventy
percent complete. Jake, can you walk us through the new layout?
Great. The charts look good. I think we should add a filter for
date range though. For testing, we have about eighty percent code
coverage on the API. We need to write integration tests for the
new auth flow before Friday. Let's plan to do a full regression
test next Tuesday before the release. Any blockers? OK, sounds
like we are in good shape. Let's wrap up.
Downloading chat model: 100.00%
Chat model downloaded.
Chat model loaded.
Summary:
- **Backend API**: Authentication endpoints complete. Rate limiting
still needed before staging deployment.
- **Frontend**: Dashboard redesign 70% complete. New chart layout
reviewed. Action item: add a date range filter.
- **Testing**: API code coverage at 80%. Integration tests for the
auth flow due Friday. Full regression test scheduled for next
Tuesday before release.
- **Status**: No blockers reported. Team is on track.
Done. Models unloaded.
O aplicativo primeiro transcreve o conteúdo de áudio e, em seguida, passa esse texto para um modelo de chat que extrai pontos-chave e os organiza em notas estruturadas.
Instalar pacotes
Repositório de exemplos
O código de exemplo completo deste artigo está disponível no repositório Foundry Local GitHub. Para clonar o repositório e acessar o exemplo, use:
git clone https://github.com/microsoft/Foundry-Local.git
cd Foundry-Local/samples/python/tutorial-voice-to-text
Se você estiver desenvolvendo ou enviando em Windows, selecione a guia Windows. O pacote Windows integra-se ao runtime Windows ML – ele fornece a mesma área de superfície de API com uma amplitude maior de aceleração de hardware.
pip install foundry-local-sdk-winml openai
Transcrever um arquivo de áudio
Nesta etapa, você carrega um modelo de conversão de fala em texto e transcreve um arquivo de áudio. O SDK Local do Foundry usa o alias whisper do modelo para selecionar a melhor variante Whisper para seu hardware.
Crie um ficheiro chamado
app.py.Adicione o seguinte código para inicializar o SDK, carregar o modelo de fala e transcrever um arquivo de áudio:
# Load the speech-to-text model speech_model = manager.catalog.get_model("whisper-tiny") speech_model.download( lambda progress: print( f"\rDownloading speech model: {progress:.2f}%", end="", flush=True, ) ) print() speech_model.load() print("Speech model loaded.") # Transcribe the audio file audio_client = speech_model.get_audio_client() transcription = audio_client.transcribe("meeting-notes.wav") print(f"\nTranscription:\n{transcription.text}") # Unload the speech model to free memory speech_model.unload()O
get_audio_clientmétodo retorna um cliente para operações de áudio. Otranscribemétodo aceita um caminho de arquivo e retorna um objeto com umatextpropriedade que contém o conteúdo transcrito.
Observação
Substitua "meeting-notes.wav" pelo caminho para o seu arquivo de áudio. Os formatos com suporte incluem WAV, MP3 e FLAC.
Resumir a transcrição
Agora, use um modelo de chat para organizar a transcrição bruta em notas estruturadas. Carregue o modelo qwen2.5-0.5b e envie a transcrição como contexto usando um prompt do sistema para instruir o modelo a produzir anotações limpas e resumidas.
Adicione o seguinte código após a etapa de transcrição:
# Load the chat model for summarization
chat_model = manager.catalog.get_model("qwen2.5-0.5b")
chat_model.download(
lambda progress: print(
f"\rDownloading chat model: {progress:.2f}%",
end="",
flush=True,
)
)
print()
chat_model.load()
print("Chat model loaded.")
# Summarize the transcription into organized notes
client = chat_model.get_chat_client()
messages = [
{
"role": "system",
"content": "You are a note-taking assistant. "
"Summarize the following transcription "
"into organized, concise notes with "
"bullet points.",
},
{"role": "user", "content": transcription.text},
]
response = client.complete_chat(messages)
summary = response.choices[0].message.content
print(f"\nSummary:\n{summary}")
# Clean up
chat_model.unload()
print("\nDone. Models unloaded.")
O prompt do sistema configura o formato de saída do modelo. Ao instruí-lo a produzir "notas organizadas e concisas com pontos de marcador", você obtém conteúdo estruturado em vez de uma parafrase bruta.
Combinar em um aplicativo completo
Crie um arquivo nomeado app.py e adicione o seguinte código completo que transcreve um arquivo de áudio e resume a transcrição:
from foundry_local_sdk import Configuration, FoundryLocalManager
def main():
# Initialize the Foundry Local SDK
config = Configuration(app_name="foundry_local_samples")
FoundryLocalManager.initialize(config)
manager = FoundryLocalManager.instance
# Download and register all execution providers.
current_ep = ""
def ep_progress(ep_name: str, percent: float):
nonlocal current_ep
if ep_name != current_ep:
if current_ep:
print()
current_ep = ep_name
print(f"\r {ep_name:<30} {percent:5.1f}%", end="", flush=True)
manager.download_and_register_eps(progress_callback=ep_progress)
if current_ep:
print()
# Load the speech-to-text model
speech_model = manager.catalog.get_model("whisper-tiny")
speech_model.download(
lambda progress: print(
f"\rDownloading speech model: {progress:.2f}%",
end="",
flush=True,
)
)
print()
speech_model.load()
print("Speech model loaded.")
# Transcribe the audio file
audio_client = speech_model.get_audio_client()
transcription = audio_client.transcribe("meeting-notes.wav")
print(f"\nTranscription:\n{transcription.text}")
# Unload the speech model to free memory
speech_model.unload()
# Load the chat model for summarization
chat_model = manager.catalog.get_model("qwen2.5-0.5b")
chat_model.download(
lambda progress: print(
f"\rDownloading chat model: {progress:.2f}%",
end="",
flush=True,
)
)
print()
chat_model.load()
print("Chat model loaded.")
# Summarize the transcription into organized notes
client = chat_model.get_chat_client()
messages = [
{
"role": "system",
"content": "You are a note-taking assistant. "
"Summarize the following transcription "
"into organized, concise notes with "
"bullet points.",
},
{"role": "user", "content": transcription.text},
]
response = client.complete_chat(messages)
summary = response.choices[0].message.content
print(f"\nSummary:\n{summary}")
# Clean up
chat_model.unload()
print("\nDone. Models unloaded.")
if __name__ == "__main__":
main()
Observação
Substitua "meeting-notes.wav" pelo caminho para o seu arquivo de áudio. Os formatos com suporte incluem WAV, MP3 e FLAC.
Execute o aplicativo de anotações.
python app.py
Você vê uma saída semelhante a:
Downloading speech model: 100.00%
Speech model loaded.
Transcription:
OK so let's get started with the weekly sync. First, the backend
API is nearly done. Sarah finished the authentication endpoints
yesterday. We still need to add rate limiting before we go to
staging. On the frontend, the dashboard redesign is about seventy
percent complete. Jake, can you walk us through the new layout?
Great. The charts look good. I think we should add a filter for
date range though. For testing, we have about eighty percent code
coverage on the API. We need to write integration tests for the
new auth flow before Friday. Let's plan to do a full regression
test next Tuesday before the release. Any blockers? OK, sounds
like we are in good shape. Let's wrap up.
Downloading chat model: 100.00%
Chat model loaded.
Summary:
- **Backend API**: Authentication endpoints complete. Rate limiting
still needed before staging deployment.
- **Frontend**: Dashboard redesign 70% complete. New chart layout
reviewed. Action item: add a date range filter.
- **Testing**: API code coverage at 80%. Integration tests for the
auth flow due Friday. Full regression test scheduled for next
Tuesday before release.
- **Status**: No blockers reported. Team is on track.
Done. Models unloaded.
O aplicativo primeiro transcreve o conteúdo de áudio e, em seguida, passa esse texto para um modelo de chat que extrai pontos-chave e os organiza em notas estruturadas.
Instalar pacotes
Repositório de exemplos
O código de exemplo completo deste artigo está disponível no repositório Foundry Local GitHub. Para clonar o repositório e acessar o exemplo, use:
git clone https://github.com/microsoft/Foundry-Local.git
cd Foundry-Local/samples/rust/tutorial-voice-to-text
Se você estiver desenvolvendo ou enviando em Windows, selecione a guia Windows. O pacote Windows integra-se ao runtime Windows ML – ele fornece a mesma área de superfície de API com uma amplitude maior de aceleração de hardware.
cargo add foundry-local-sdk --features winml
cargo add tokio --features full
cargo add tokio-stream anyhow
Transcrever um arquivo de áudio
Nesta etapa, você carrega um modelo de conversão de fala em texto e transcreve um arquivo de áudio. O SDK Local do Foundry usa o alias whisper do modelo para selecionar a melhor variante Whisper para seu hardware.
Abra
src/main.rse substitua seu conteúdo pelo seguinte código para inicializar o SDK, carregar o modelo de fala e transcrever um arquivo de áudio:// Load the speech-to-text model let speech_model = manager .catalog() .get_model("whisper-tiny") .await?; if !speech_model.is_cached().await? { println!("Downloading speech model..."); speech_model .download(Some(|progress: f64| { print!("\r {progress:.1}%"); io::stdout().flush().ok(); })) .await?; println!(); } speech_model.load().await?; println!("Speech model loaded."); // Transcribe the audio file let audio_client = speech_model.create_audio_client(); let transcription = audio_client .transcribe("meeting-notes.wav") .await?; println!("\nTranscription:\n{}", transcription.text); // Unload the speech model to free memory speech_model.unload().await?;O
create_audio_clientmétodo retorna um cliente para operações de áudio. Otranscribemétodo aceita um caminho de arquivo e retorna um objeto com umtextcampo que contém o conteúdo transcrito.
Observação
Substitua "meeting-notes.wav" pelo caminho para o seu arquivo de áudio. Os formatos com suporte incluem WAV, MP3 e FLAC.
Resumir a transcrição
Agora, use um modelo de chat para organizar a transcrição bruta em notas estruturadas. Carregue o modelo qwen2.5-0.5b e envie a transcrição como contexto usando um prompt do sistema para instruir o modelo a produzir anotações limpas e resumidas.
Adicione o seguinte código após a etapa de transcrição, dentro da main função:
// Load the chat model for summarization
let chat_model = manager
.catalog()
.get_model("qwen2.5-0.5b")
.await?;
if !chat_model.is_cached().await? {
println!("Downloading chat model...");
chat_model
.download(Some(|progress: f64| {
print!("\r {progress:.1}%");
io::stdout().flush().ok();
}))
.await?;
println!();
}
chat_model.load().await?;
println!("Chat model loaded.");
// Summarize the transcription into organized notes
let client = chat_model
.create_chat_client()
.temperature(0.7)
.max_tokens(512);
let messages: Vec<ChatCompletionRequestMessage> = vec![
ChatCompletionRequestSystemMessage::from(
"You are a note-taking assistant. Summarize \
the following transcription into organized, \
concise notes with bullet points.",
)
.into(),
ChatCompletionRequestUserMessage::from(
transcription.text.as_str(),
)
.into(),
];
let response = client
.complete_chat(&messages, None)
.await?;
let summary = response.choices[0]
.message
.content
.as_deref()
.unwrap_or("");
println!("\nSummary:\n{}", summary);
// Clean up
chat_model.unload().await?;
println!("\nDone. Models unloaded.");
O prompt do sistema configura o formato de saída do modelo. Ao instruí-lo a produzir "notas organizadas e concisas com pontos de marcador", você obtém conteúdo estruturado em vez de uma parafrase bruta.
Combinar em um aplicativo completo
Substitua o conteúdo de src/main.rs pelo seguinte código completo que transcreve um arquivo de áudio e resume a transcrição:
use foundry_local_sdk::{
ChatCompletionRequestMessage,
ChatCompletionRequestSystemMessage,
ChatCompletionRequestUserMessage,
FoundryLocalConfig, FoundryLocalManager,
};
use std::io::{self, Write};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// Initialize the Foundry Local SDK
let manager = FoundryLocalManager::create(
FoundryLocalConfig::new("note-taker"),
)?;
// Download and register all execution providers.
manager
.download_and_register_eps_with_progress(None, {
let mut current_ep = String::new();
move |ep_name: &str, percent: f64| {
if ep_name != current_ep {
if !current_ep.is_empty() {
println!();
}
current_ep = ep_name.to_string();
}
print!("\r {:<30} {:5.1}%", ep_name, percent);
io::stdout().flush().ok();
}
})
.await?;
println!();
// Load the speech-to-text model
let speech_model = manager
.catalog()
.get_model("whisper-tiny")
.await?;
if !speech_model.is_cached().await? {
println!("Downloading speech model...");
speech_model
.download(Some(|progress: f64| {
print!("\r {progress:.1}%");
io::stdout().flush().ok();
}))
.await?;
println!();
}
speech_model.load().await?;
println!("Speech model loaded.");
// Transcribe the audio file
let audio_client = speech_model.create_audio_client();
let transcription = audio_client
.transcribe("meeting-notes.wav")
.await?;
println!("\nTranscription:\n{}", transcription.text);
// Unload the speech model to free memory
speech_model.unload().await?;
// Load the chat model for summarization
let chat_model = manager
.catalog()
.get_model("qwen2.5-0.5b")
.await?;
if !chat_model.is_cached().await? {
println!("Downloading chat model...");
chat_model
.download(Some(|progress: f64| {
print!("\r {progress:.1}%");
io::stdout().flush().ok();
}))
.await?;
println!();
}
chat_model.load().await?;
println!("Chat model loaded.");
// Summarize the transcription into organized notes
let client = chat_model
.create_chat_client()
.temperature(0.7)
.max_tokens(512);
let messages: Vec<ChatCompletionRequestMessage> = vec![
ChatCompletionRequestSystemMessage::from(
"You are a note-taking assistant. Summarize \
the following transcription into organized, \
concise notes with bullet points.",
)
.into(),
ChatCompletionRequestUserMessage::from(
transcription.text.as_str(),
)
.into(),
];
let response = client
.complete_chat(&messages, None)
.await?;
let summary = response.choices[0]
.message
.content
.as_deref()
.unwrap_or("");
println!("\nSummary:\n{}", summary);
// Clean up
chat_model.unload().await?;
println!("\nDone. Models unloaded.");
Ok(())
}
Observação
Substitua "meeting-notes.wav" pelo caminho para o seu arquivo de áudio. Os formatos com suporte incluem WAV, MP3 e FLAC.
Execute o aplicativo de anotações.
cargo run
Você vê uma saída semelhante a:
Downloading speech model: 100.00%
Speech model loaded.
Transcription:
OK so let's get started with the weekly sync. First, the backend
API is nearly done. Sarah finished the authentication endpoints
yesterday. We still need to add rate limiting before we go to
staging. On the frontend, the dashboard redesign is about seventy
percent complete. Jake, can you walk us through the new layout?
Great. The charts look good. I think we should add a filter for
date range though. For testing, we have about eighty percent code
coverage on the API. We need to write integration tests for the
new auth flow before Friday. Let's plan to do a full regression
test next Tuesday before the release. Any blockers? OK, sounds
like we are in good shape. Let's wrap up.
Downloading chat model: 100.00%
Chat model loaded.
Summary:
- **Backend API**: Authentication endpoints complete. Rate limiting
still needed before staging deployment.
- **Frontend**: Dashboard redesign 70% complete. New chart layout
reviewed. Action item: add a date range filter.
- **Testing**: API code coverage at 80%. Integration tests for the
auth flow due Friday. Full regression test scheduled for next
Tuesday before release.
- **Status**: No blockers reported. Team is on track.
Done. Models unloaded.
O aplicativo primeiro transcreve o conteúdo de áudio e, em seguida, passa esse texto para um modelo de chat que extrai pontos-chave e os organiza em notas estruturadas.
Limpar os recursos
Os pesos do modelo permanecem no cache local depois que você descarrega um modelo. Isso significa que, na próxima vez que você executar o aplicativo, a etapa de download será ignorada e o modelo será carregado mais rapidamente. Nenhuma limpeza extra é necessária, a menos que você queira recuperar espaço em disco.