docker 下部署 纯CPU的Nway ASR & TTS

简介: 本方案提供基于Docker的纯CPU版Nway语音识别(ASR)与合成(TTS)一体化部署:含定制Dockerfile、多服务启停脚本及Flask HTTP网关,支持RESTful API调用,开箱即用,无需GPU,适配x86 CPU环境。(239字)

docker 下部署 纯CPU的Nway ASR & TTS

首先先下载包

需要包私我

将下载的包解压,进入目录创建下面三个相关文件
1、准备下面三个文件
准备Dockerfile

FROM ubuntu:22.04
# 设置非交互式安装
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y \
    ca-certificates \
    libgcc-s1 \
    python3 \
    python3-pip \
    python3-venv \
    net-tools \
    && rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 复制应用程序文件
COPY . .
# 安装Python依赖(添加requests)
RUN pip3 install flask werkzeug requests
# 设置权限
RUN chmod +x nasr-server nasr-client ntts-server ntts-client start_services.sh
# 设置环境变量
ENV LD_LIBRARY_PATH=/app
ENV PYTHONPATH=/app

EXPOSE 8089 8090 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
    CMD netstat -tuln | grep -q -E ':(8089|8090|8080)' || exit 1

CMD ["./start_services.sh"]

2、启动脚本

#!/bin/bash

echo "=== 启动脚本开始 ==="
echo "当前目录: $(pwd)"
echo "文件列表:"
ls -la

echo "=== 检查可执行文件 ==="
file nasr-server ntts-server

echo "=== 设置环境变量 ==="
export LD_LIBRARY_PATH=/app
echo "LD_LIBRARY_PATH: $LD_LIBRARY_PATH"

echo "=== 启动ASR服务 ==="
./nasr-server &
ASR_PID=$!
echo "ASR服务PID: $ASR_PID"

echo "=== 启动TTS服务 ==="  
./ntts-server &
TTS_PID=$!
echo "TTS服务PID: $TTS_PID"

echo "=== 等待服务启动 ==="
sleep 5

echo "=== 检查端口监听 ==="
netstat -tuln | grep -E ':(8089|8090)'

echo "=== 启动HTTP网关 ==="
python3 http_gateway.py &
GATEWAY_PID=$!
echo "HTTP网关PID: $GATEWAY_PID"

echo "=== 最终端口检查 ==="
sleep 3
netstat -tuln | grep -E ':(8089|8090|8080)'

echo "=== 所有服务已启动 ==="

# 等待服务运行
wait

3、python 应用

from flask import Flask, request, jsonify, send_file
import requests
import os
import tempfile
import uuid
from werkzeug.utils import secure_filename

app = Flask(__name__)

# 服务配置
ASR_SERVER = "http://localhost:8089"
TTS_SERVER = "http://localhost:8090"

@app.route('/api/health', methods=['GET'])
def health_check():
    """健康检查接口"""
    return jsonify({
   
        "status": "healthy",
        "services": {
   
            "asr": "running",
            "tts": "running"
        }
    })

@app.route('/api/asr/transcribe', methods=['POST'])
def transcribe_audio():
    """语音识别接口"""
    if 'audio' not in request.files:
        return jsonify({
   "error": "No audio file provided"}), 400

    audio_file = request.files['audio']

    # 保存临时文件
    temp_dir = tempfile.gettempdir()
    filename = secure_filename(f"{uuid.uuid4()}.wav")
    filepath = os.path.join(temp_dir, filename)
    audio_file.save(filepath)

    try:
        # 调用ASR服务
        result = os.popen(f"./nasr-client 127.0.0.1:8089 {filepath}").read().strip()

        return jsonify({
   
            "text": result,
            "status": "success"
        })
    except Exception as e:
        return jsonify({
   "error": str(e)}), 500
    finally:
        # 清理临时文件
        if os.path.exists(filepath):
            os.remove(filepath)

@app.route('/api/tts/synthesize', methods=['POST'])
def synthesize_speech():
    """语音合成接口"""
    data = request.get_json()
    if not data or 'text' not in data:
        return jsonify({
   "error": "No text provided"}), 400

    text = data['text']
    output_filename = data.get('filename', f"{uuid.uuid4()}.wav")

    try:
        # 调用TTS服务
        output_path = f"/tmp/{output_filename}"
        command = f'./ntts-client 127.0.0.1:8090 --input "{text}" --output {output_path}'
        os.system(command)

        if os.path.exists(output_path):
            return send_file(output_path, as_attachment=True, download_name=output_filename)
        else:
            return jsonify({
   "error": "TTS synthesis failed"}), 500

    except Exception as e:
        return jsonify({
   "error": str(e)}), 500

@app.route('/api/tts/synthesize_base64', methods=['POST'])
def synthesize_speech_base64():
    """语音合成接口(返回base64)"""
    import base64

    data = request.get_json()
    if not data or 'text' not in data:
        return jsonify({
   "error": "No text provided"}), 400

    text = data['text']

    try:
        # 调用TTS服务
        temp_file = f"/tmp/{uuid.uuid4()}.wav"
        command = f'./ntts-client 127.0.0.1:8090 --input "{text}" --output {temp_file}'
        os.system(command)

        if os.path.exists(temp_file):
            with open(temp_file, 'rb') as f:
                audio_data = f.read()
            os.remove(temp_file)

            return jsonify({
   
                "audio_base64": base64.b64encode(audio_data).decode('utf-8'),
                "status": "success"
            })
        else:
            return jsonify({
   "error": "TTS synthesis failed"}), 500

    except Exception as e:
        return jsonify({
   "error": str(e)}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=False)

4、构建并运行容器

# 构建镜像
docker build -t nway-audio-ai .

# 运行新容器
docker run -d \
  -p 8080:8080 \
  -p 8089:8089 \
  -p 8090:8090 \
  --name nway-audio-ai \
  nway-audio-ai
# 查看日志
docker logs -f nway-audio-ai
最后测试:
# 测试HTTP网关
curl http://localhost:8080/api/health

# 测试ASR服务
curl -X POST http://localhost:8080/api/asr/transcribe \
  -F "audio=@test.wav"

# 测试TTS服务
curl -X POST http://localhost:8080/api/tts/synthesize \
  -H "Content-Type: application/json" \
  -d '{"text": "测试语音合成"}'

docker 下部署 纯CPU的Nway ASR & TTS 到此结束!

目录
相关文章
|
7月前
|
安全 Linux Docker
QWEN3 企业级 Docker 容器化部署指南
QWEN3是通义千问系列最新大模型,支持密集与混合专家架构,覆盖0.6B至235B参数,适用于多场景部署。具备思考与非思考双推理模式,强化复杂任务处理能力,支持100+语言及工具调用。本文档提供企业级Docker部署方案,涵盖环境配置、镜像拉取、安全加固、高可用设计与生产最佳实践,经Ubuntu/CentOS实测验证,端口8080、API路径/v1/chat/completions 100%可用,助力快速落地AI应用。
2371 5
|
自然语言处理 语音技术 开发者
开源上新|FunASR多语言离线文件转写软件包
开源上新|FunASR多语言离线文件转写软件包
|
7月前
|
缓存 网络安全 语音技术
docker安装部署FunASR
本指南详解FunASR在线语音识别服务的外网部署与内网迁移全流程:先在外网拉取Docker镜像、自动下载模型并启动服务(端口10095),验证成功后,将镜像和缓存模型打包导出;再于内网服务器导入镜像、解压模型、挂载运行,全程禁用SSL,支持热词与标点恢复,开箱即用。
4232 3
|
6月前
|
并行计算 API Docker
Docker+vLLM内网离线部署Qwen3 流程
本教程详解如何在A10四卡内网环境中,通过Docker+ vLLM离线部署Qwen3-32B/Qwen3-VL-30B-Instruct大模型。涵盖环境准备、镜像离线导入、模型下载、容器启动及参数调优,支持FP8/KV缓存/张量并行等高性能配置,助力安全高效私有化推理
7198 8
|
5月前
|
人工智能 JSON 自然语言处理
OpenClaw 阿里云/本地部署+N8N+ComfyUI 全链路整合实战:AI大脑、自动化引擎、视觉生成一体化指南
在AI工具日益丰富的今天,各类工具相互孤立、数据无法互通、流程需要手动衔接已成为效率提升的核心阻碍。OpenClaw作为AI智能体调度中枢、N8N作为开源工作流自动化引擎、ComfyUI作为主流图像生成节点工具,三者整合可构建“智能理解→流程执行→视觉产出”的完整自动化闭环,实现从文本指令到最终成果的全流程无人干预。本文完整说明三者定位差异、整合原理、2026年阿里云与本地多平台部署步骤、阿里云百炼Coding Plan免费大模型API配置,以及全流程常见问题解决方案,所有命令可直接复制运行,无冗余表述,适合个人与轻量化团队搭建一体化AI生产力系统。
2277 0
|
8月前
|
Linux Docker 容器
docker下部署 vLLM 启动Qwen3-VL-32B-Instruct模型
本文介绍在CentOS系统、A10 6×24G显卡环境下,通过Docker部署vLLM并启动Qwen3-VL-32B-Instruct大模型的完整流程,涵盖镜像拉取、容器配置、多卡并行与显存优化设置,支持32K上下文,附带启动脚本及调用验证示例。
9146 2
|
API Docker 容器
SenseVoice实现语音转文字
这篇文章介绍了如何使用SenseVoice实现语音转文字的功能,包括通过Docker部署服务、使用网页界面或API进行语音文件的转换,并提供了详细的部署与使用步骤。
3467 1
SenseVoice实现语音转文字
|
运维 Kubernetes 数据可视化
【Docker管理工具】使用Docker部署portainer-ce管理工具
【7月更文挑战第22天】使用Docker部署portainer-ce管理工具
2425 3
【Docker管理工具】使用Docker部署portainer-ce管理工具
|
编解码 资源调度
功率谱密度(PSD)及其在无线通信中的应用
功率谱密度(PSD)及其在无线通信中的应用
2781 4