NotebookLM by Google
link: https://github.com/xiaolai/apple-computer-literacy/blob/main/NotebookLM.md
# NotebookLM by Google [NotebookLM](https://notebooklm.google.com) 是 Google 推出的 “人工智能辅助笔记” 应用。用户上传文档(PDF/TXT/Markdown)至 NotebookLM 后,就可以向文档提问,由 AI 回答。 除此之外,无论是论文还是书籍,NotebookLM 都可以为此生成一个 "Deep Dive Podcast",大约 30 分钟左右的两人对话语音讲解。 目前(2024 年 12 月)的局限之一是只能用英语才能获得最佳效果。 我的做法是: > 1. 先在 Kindle 上读完一本书(我觉得这一步绝对不能跳过); > 2. 从自己的 [Content Library](https://www.amazon.com/hz/mycd/digital-console/contentlist/booksAll/dateDsc/) 里下载相应的 azw3 文件; > 3. 使用 ePubor 软件将其转换成 epub 文件(参见[这篇文章](kindle.md)); > 4. 【待续……】 我写了一个 Automator Quick Action —— 如此这般之后,在 Finder 里右键点击 epub 文件的时候,会多出一个 `Context Menu: Convert EPUB to markdown`……(  它会把 `epub` 文件转换成一个文件夹,其中有整本书的 `txt` 文件,以及拆分的各个章节的 `markdown` 文件,另外,`epub` 中原本包含的内容,在 `html` 子目录中。 有一个前提:你的系统中安装了 `pandoc` 命令行工具 —— 如果没有的话,可以通过 `brew install` 命令安装。 ```bash brew install pandoc ``` 另外,你也需要检查一下系统内置的 `unzip` 是否存在: ```bash which unzip ``` 如果不存在的话,就用 `brew` 安装: ```bash brew install unzip ``` 如果你想要自己用 Automator 写 Quick Action 的话,可以在 Quick Action 里添加以下 Shellscript 内容: ``` bash #!/bin/zsh # Path to pandoc PANDOC_CMD="/opt/homebrew/bin/pandoc" # Get the selected EPUB file EPUB_FILE="$1" # Verify the file exists if [ ! -f "$EPUB_FILE" ]; then exit 1 fi # Define paths ZIP_FILE="${EPUB_FILE%.epub}.zip" TMP_DIR=$(mktemp -d) OUTPUT_DIR="${EPUB_FILE%.epub}" # Create output directory mkdir -p "$OUTPUT_DIR/html" # Copy and rename the EPUB to a ZIP file cp "$EPUB_FILE" "$ZIP_FILE" # Unzip the file unzip -q "$ZIP_FILE" -d "$TMP_DIR" if [ $? -ne 0 ]; then rm -rf "$TMP_DIR" "$ZIP_FILE" exit 1 fi # Locate the OEBPS folder OEBPS_DIR=$(find "$TMP_DIR" -type d -name "OEBPS") if [ -z "$OEBPS_DIR" ]; then rm -rf "$TMP_DIR" "$ZIP_FILE" exit 1 fi # Copy all content from OEBPS to the output directory's html folder cp -R "$OEBPS_DIR"/* "$OUTPUT_DIR/html/" # Determine if the folder contains .html or .xhtml files if ls "$OEBPS_DIR"/*.html 1> /dev/null 2>&1; then FILE_EXT="html" elif ls "$OEBPS_DIR"/*.xhtml 1> /dev/null 2>&1; then FILE_EXT="xhtml" else FILE_EXT="" fi # Convert files to Markdown if a valid file type is found if [ -n "$FILE_EXT" ]; then for HTML_FILE in "$OEBPS_DIR"/*."$FILE_EXT"; do if [ -f "$HTML_FILE" ]; then BASENAME=$(basename "$HTML_FILE" ."$FILE_EXT") "$PANDOC_CMD" "$HTML_FILE" -t plain --strip-comments -o "$OUTPUT_DIR/$BASENAME.md" fi done fi # Convert the entire EPUB to a single TXT file FULL_TXT_FILE="$OUTPUT_DIR/$(basename "${EPUB_FILE%.epub}.txt")" "$PANDOC_CMD" "$EPUB_FILE" -t plain --strip-comments -o "$FULL_TXT_FILE" # Cleanup rm -rf "$TMP_DIR" rm "$ZIP_FILE" # Notify completion osascript -e "display notification \"Output saved to: $OUTPUT_DIR\" with title \"EPUB Processor\"" ```  你也可以直接下载这个文件:[Convert EPUB to Markdown.workflow](https://raw.githubusercontent.com/xiaolai/apple-computer-literacy/main/files/Convert%20EPUB%20to%20Markdown.zip),将其保存到 `~/Library/Services` 文件夹中即可。 继续回到 NotebookLM 工作流中: > 4. 新建一个 Notebook,将整本书的 txt 文件上传,让 NotebookLM 生成 Podcast; > 5. 在将拆分成各个章节的多个 Markdown 文件添加至这个 Notebook;如此这般之后,就可以 “针对整本书(只选择整本书的文件)” 或者 “只针对某个章节(只选择某个章节的文件)” 提问。 我最常用的几个 Prompt 分别是(主要是针对每个章节提问): > * Make an extensive summary of this file. > * List all scientific findings the author mentioned in this file. > * List all metaphors and analogies in this file. > * List all phrasal verbs and idioms in this file, and provide concise Chinese translation of them according to the context. > * List all less common vocabulary in this file and provide phonetics, part of words, and concise Chinese translation according to the context. > * Provide a short list of "Further Reading", recommend 5 best related books and scientific papers.
#!/bin/zsh # 脚本用途: 将EPUB文件转换为Markdown和纯文本,并提取HTML内容 # 函数定义 function clean_exit() { local status=$1 local message=$2 # 清理临时文件 [ -d "$TMP_DIR" ] && rm -rf "$TMP_DIR" [ -f "$ZIP_FILE" ] && rm -f "$ZIP_FILE" # 显示错误消息 [ -n "$message" ] && echo "错误: $message" >&2 # 通知用户 if [ $status -eq 0 ]; then osascript -e "display notification \"输出保存至: $OUTPUT_DIR\" with title \"EPUB处理完成\"" else osascript -e "display notification \"处理失败\" with title \"EPUB处理错误\"" fi exit $status } # 检查参数 if [ $# -lt 1 ]; then echo "用法: $0 <EPUB文件>" >&2 exit 1 fi # 获取EPUB文件路径 EPUB_FILE="$1" # 检查文件是否存在 if [ ! -f "$EPUB_FILE" ]; then echo "错误: 文件 '$EPUB_FILE' 不存在" >&2 exit 1 fi # 检查文件是否为EPUB格式 if [[ ! "$EPUB_FILE" =~ \.epub$ ]]; then echo "错误: 文件 '$EPUB_FILE' 不是EPUB格式" >&2 exit 1 fi # 查找pandoc - 尝试多种可能的位置 PANDOC_CANDIDATES=( "/opt/homebrew/bin/pandoc" # Homebrew on M1 Mac "/usr/local/bin/pandoc" # Homebrew on Intel Mac "/usr/bin/pandoc" # Linux常见位置 "$(which pandoc 2>/dev/null || echo '')" # 在PATH中查找 ) PANDOC_CMD="" for cmd in "${PANDOC_CANDIDATES[@]}"; do if [ -n "$cmd" ] && [ -x "$cmd" ]; then PANDOC_CMD="$cmd" break fi done # 如果以上方法都找不到pandoc,尝试直接使用pandoc命令 if [ -z "$PANDOC_CMD" ]; then if pandoc --version >/dev/null 2>&1; then PANDOC_CMD="pandoc" else echo "警告: 未找到pandoc,将跳过Markdown转换步骤" fi fi if [ -n "$PANDOC_CMD" ]; then echo "使用pandoc: $PANDOC_CMD ($(\"$PANDOC_CMD\" --version | head -n 1))" PANDOC_AVAILABLE=true else PANDOC_AVAILABLE=false fi # 定义路径 ZIP_FILE="${EPUB_FILE%.epub}.zip" TMP_DIR=$(mktemp -d) OUTPUT_DIR="${EPUB_FILE%.epub}" # 创建输出目录 mkdir -p "$OUTPUT_DIR/html" || clean_exit 1 "无法创建输出目录" # 复制并重命名EPUB为ZIP文件 cp "$EPUB_FILE" "$ZIP_FILE" || clean_exit 1 "无法复制EPUB文件" # 解压文件 unzip -q "$ZIP_FILE" -d "$TMP_DIR" || clean_exit 1 "无法解压文件" # 定位OEBPS文件夹 - 使用更安全的查找方式 OEBPS_DIR=$(find "$TMP_DIR" -type d -name "OEBPS" -print -quit) if [ -z "$OEBPS_DIR" ]; then # 有些EPUB可能没有OEBPS目录,尝试查找内容文件 if find "$TMP_DIR" -name "*.html" -o -name "*.xhtml" -o -name "*.htm" | grep -q .; then CONTENT_DIR="$TMP_DIR" echo "未找到OEBPS目录,使用根目录代替" else clean_exit 1 "未找到OEBPS目录或HTML内容文件" fi else CONTENT_DIR="$OEBPS_DIR" echo "找到OEBPS目录: $OEBPS_DIR" fi # 复制所有内容到输出目录的html文件夹 echo "复制内容文件..." if [ -d "$CONTENT_DIR" ] && [ "$(ls -A "$CONTENT_DIR" 2>/dev/null)" ]; then cp -R "$CONTENT_DIR"/* "$OUTPUT_DIR/html/" 2>/dev/null || echo "警告: 部分文件可能未复制" else echo "警告: 内容目录为空或不存在" fi # 确定文件夹中包含的HTML文件类型 FILE_EXT="" for ext in html xhtml htm; do if find "$CONTENT_DIR" -name "*.$ext" -type f -print -quit 2>/dev/null | grep -q .; then FILE_EXT="$ext" break fi done # 只有当pandoc可用时才执行转换步骤 if $PANDOC_AVAILABLE; then # 转换文件到Markdown if [ -n "$FILE_EXT" ]; then echo "正在转换.$FILE_EXT文件到Markdown..." find "$CONTENT_DIR" -name "*.$FILE_EXT" -type f 2>/dev/null | while read -r HTML_FILE; do BASENAME=$(basename "$HTML_FILE" ".$FILE_EXT") echo " 处理: $BASENAME.$FILE_EXT" "$PANDOC_CMD" "$HTML_FILE" -f html -t markdown --strip-comments -o "$OUTPUT_DIR/$BASENAME.md" 2>/dev/null || echo " 警告: 无法转换 $BASENAME.$FILE_EXT" done else echo "警告: 未找到HTML/XHTML文件" fi # 转换整个EPUB到单个TXT文件 echo "正在创建全文本版本..." FULL_TXT_FILE="$OUTPUT_DIR/$(basename "${EPUB_FILE%.epub}.txt")" "$PANDOC_CMD" "$EPUB_FILE" -t plain --strip-comments -o "$FULL_TXT_FILE" 2>/dev/null || echo "警告: 无法创建文本版本,请确认pandoc支持EPUB输入" else echo "跳过Markdown转换 (pandoc不可用)" fi # 统计文件数量 HTML_COUNT=$(find "$OUTPUT_DIR/html" -type f -name "*.html" -o -name "*.xhtml" -o -name "*.htm" 2>/dev/null | wc -l) MD_COUNT=0 [ $PANDOC_AVAILABLE = true ] && MD_COUNT=$(find "$OUTPUT_DIR" -maxdepth 1 -type f -name "*.md" 2>/dev/null | wc -l) echo "处理完成:" echo "- HTML文件数: $HTML_COUNT" [ $PANDOC_AVAILABLE = true ] && echo "- 转换的Markdown文件数: $MD_COUNT" [ $PANDOC_AVAILABLE = true ] && [ -f "$FULL_TXT_FILE" ] && echo "- 创建了完整文本文件: $(basename "$FULL_TXT_FILE")" # 成功完成清理 clean_exit 0
Comments:
Email questions, comments, and corrections to hi@smartisan.dev.
Submissions may appear publicly on this website, unless requested otherwise in your email.